背景
我写了一个小测试,以确保我可以从我的移动应用程序发出的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
应用程序中,我尝试相同的逻辑,我用来创建文件的实际数据为null。但我仍然可以访问请求中发送的用户名和密码。
$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字符串,
示例
在Swift中我正在创建这样的dict,然后将其作为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()
?{/ p>中访问请求正文中的实际Slim Framework 3
我认为这与Slim相比$rawJsonObj = file_get_contents('php://input');
实际处理数据的方式有关吗?
答案 0 :(得分:1)
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
。否则,此方法可能会返回反序列化的任何结果 请求正文内容;当解析返回结构化内容时, 潜在类型必须只是数组或对象。
null
值$_POST
表示没有身体内容。
虽然getParsedBody()
只解码标准格式编码(因此在您的测试代码中需要手动获取和解析数据)$_POST
尝试解码其他编码,但就像Content-Type
一样,它需要一个合适的Content-Type: application/json
来做到这一点。如果您从移动应用中发送一个:
Stream
...它会按预期工作,因为Slim有一个内置的JSON解码器。
如果您无法发送编码声明,则需要手动解码内容。在这种情况下,PSR-7获取原始请求主体的方式是Message::getBody(),它返回流(更具体地说,是一个实现StreamInterface
的{{1}}对象}})。