拉从http请求base64编码字符串在PHP

问题描述:

背景拉从http请求base64编码字符串在PHP

我写了一个小测试,以确保我可以从从我的移动应用做了一个POST请求提取数据。它工作正常,

$rawJsonObj = file_get_contents('php://input'); 
$json = json_decode($rawJsonObj, true); 
$decodedData = base64_decode($json['data']); 
file_put_contents('student-data/'.$json['username'].'.txt', $decodedData); 

然后在我的Slim Framework程序,我尝试同样的逻辑,我用它来创建为空文件的实际数据。但是我仍然可以访问请求中发送的用户名和密码。

$app->post('/api/v1/endpoint', function ($request, $response, $args) { 
    $rawJsonObj = $request->getParams(); 
    $json = json_decode($rawJsonObj, true); 
    $decodedData = base64_decode($json['data']); 
    file_put_contents('test.txt', $decodedData); 
return $response; 
} 

用户名和密码显示在请求中,我可以在向文件请求中写入数据时看到它们。

$data = $request->getParams(); 
file_put_contents('2.txt', $data); 

数据被写为文件,

","username":"myuname","password":"myPword"} 

但base64encoded串丢失,

在斯威夫特我创造这样的字典,然后将其作为json发布,

let dict: [String: Any] = [ 
    "username": named, 
    "password": password, 
    "data": data.base64EncodedString() 
] 

if let json = try? JSONSerialization.data(withJSONObject: dict, options: []) { 
    request.httpBody = json 
} 

问题

如何请求主体访问实际"data": data.base64EncodedString()Slim Framework 3

我认为这与$rawJsonObj = file_get_contents('php://input');实际处理数据相比Slim的方式有关吗?

+0

我不知道答案,但第一个片段显示JSON不是任何类型的参数。这是请求主体。 –

+0

你是说在测试中?但是我发布JSON,所以它不会是请求体中的JSON? – wuno

+0

没关系。我只看了一下'getParams()'的实现,它应该真的返回两者。你是否发送了一个Content-Type头来告诉它实际上是JSON? –

Request::getParams()是由Slim(不是PSR-7的一部分)收集所有输入数据的自定义方法;换句话说,它大致相当于PHP的超全球性的$_REQUEST。在内部,它通过Request::getParsedBody()(这是PSR-7的一部分)抓取请求主体。在此处,与$_REQUEST$_POST主要出现分歧:

如果请求Content-Type或者是 application/x-www-form-urlencodedmultipart/form-data和 请求的方法是POST,这种方法必须返回 $_POST内容。

否则,此方法可能会返回任何反序列化请求主体内容的结果;如解析返回结构化内容, 潜在类型必须只是数组或对象。 A null值 指示身体内容的不存在。

虽然$_POST仅解码标准格式编码(因此你需要获取和手动解析数据测试代码)getParsedBody()尝试解码其他编码,但是,就像$_POST,它需要一个适当的Content-Type这样做。如果你从你的移动应用发送一个:

Content-Type: application/json 

...它会按预期工作,因为Slim有一个内置的JSON解码器。

如果你不能发送编码声明,你需要手动解码的东西。在这种情况下,获取原始请求主体的PSR-7方式为Message::getBody(),返回(更具体地说,实现StreamInterfaceStream对象)。