拉从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的方式有关吗?
Request::getParams()是由Slim(不是PSR-7的一部分)收集所有输入数据的自定义方法;换句话说,它大致相当于PHP的超全球性的$_REQUEST
。在内部,它通过Request::getParsedBody()(这是PSR-7的一部分)抓取请求主体。在此处,与$_REQUEST
或$_POST
主要出现分歧:
如果请求
Content-Type
或者是application/x-www-form-urlencoded
或multipart/form-data
和 请求的方法是POST
,这种方法必须返回$_POST
内容。否则,此方法可能会返回任何反序列化请求主体内容的结果;如解析返回结构化内容, 潜在类型必须只是数组或对象。 A
null
值 指示身体内容的不存在。
虽然$_POST
仅解码标准格式编码(因此你需要获取和手动解析数据测试代码)getParsedBody()
尝试解码其他编码,但是,就像$_POST
,它需要一个适当的Content-Type
这样做。如果你从你的移动应用发送一个:
Content-Type: application/json
...它会按预期工作,因为Slim有一个内置的JSON解码器。
如果你不能发送编码声明,你需要手动解码的东西。在这种情况下,获取原始请求主体的PSR-7方式为Message::getBody(),返回流(更具体地说,实现StreamInterface
的Stream
对象)。
我不知道答案,但第一个片段显示JSON不是任何类型的参数。这是请求主体。 –
你是说在测试中?但是我发布JSON,所以它不会是请求体中的JSON? – wuno
没关系。我只看了一下'getParams()'的实现,它应该真的返回两者。你是否发送了一个Content-Type头来告诉它实际上是JSON? –