从php

时间:2017-06-19 16:17:35

标签: php slim

背景

我写了一个小测试,以确保我可以从我的移动应用程序发出的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');实际处理数据的方式有关吗?

1 个答案:

答案 0 :(得分:1)

Request::getParams()是Slim(不是PSR-7的一部分)的自定义方法,它收集所有输入数据;换句话说,它大致相当于PHP $_REQUEST超全局。在内部,它使用Request::getParsedBody()(这是PSR-7的一部分)抓取请求正文。这里出现与$_REQUEST$_POST的主要差异:

  

如果请求Content-Type是其中之一   application/x-www-form-urlencodedmultipart/form-data,以及   请求方法是POST,这个方法必须返回内容   $_POST

     

否则,此方法可能会返回反序列化的任何结果   请求正文内容;当解析返回结构化内容时,   潜在类型必须只是数组或对象。 null$_POST   表示没有身体内容。

虽然getParsedBody()只解码标准格式编码(因此在您的测试代码中需要手动获取和解析数据)$_POST尝试解码其他编码,但就像Content-Type一样,它需要一个合适的Content-Type: application/json 来做到这一点。如果您从移动应用中发送一个:

Stream

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

如果您无法发送编码声明,则需要手动解码内容。在这种情况下,PSR-7获取原始请求主体的方式是Message::getBody(),它返回(更具体地说,是一个实现StreamInterface的{​​{1}}对象}})。