我正在尝试使用PHP开发RESTful API而不使用框架。处理请求时,无法使用以下内容读取客户端数据:parse_str(file_get_contents("php://input"), $put_vars);
这是完整的代码:
public static function processRequest() {
//get the verb
$method = strtolower($_SERVER['REQUEST_METHOD']);
$request = new Request();
$data = array();
$put_vars = array();
switch ($method) {
case 'get':
$data = $_GET;
break;
case 'post':
$data = $_POST;
break;
case 'put':
parse_str(file_get_contents("php://input"), $put_vars);
$data = $put_vars;
echo $data;
break;
}
$request->setMethod($method);
$request->setRequestVars($data);
if (isset($data['data'])) {
$request->setData(json_decode($data));
echo 'data exists';
}
return $request;
}
我正在使用cURL来休息API,当我输入此命令时:curl -i -X PUT -d '{"name":"a","data":"data1"}'
http://localhost/my-rest-api/api/
我只能回复此信息:
Array""
为什么没有返回正确的数据?
修改
我还测试了应该是API的another piece of code,file_get_contents('php://input', true)
仍然返回null。可能是网络服务器出了问题吗?
答案 0 :(得分:15)
parse_str
用于解析查询字符串(格式为arg1 = xyz& arg2 = abc)而不是JSON。您需要使用json_decode
来解析JSON字符串。
$data = json_decode(file_get_contents("php://input"), true);
以下是有效的代码:
$method = strtolower($_SERVER['REQUEST_METHOD']);
$data = array();
switch ($method) {
case 'get':
$data = $_GET;
break;
case 'post':
$data = $_POST;
break;
case 'put':
$data = json_decode(file_get_contents("php://input"), true);
break;
}
var_dump($data);
卷曲命令:
curl -i -X PUT -d '{"name":"a","data":"data1"}' http://my-server/my.php
响应:
array(2) {
["name"]=>
string(1) "a"
["data"]=>
string(5) "data1"
}
答案 1 :(得分:2)
网络服务器出现了问题吗?
其实是的。在敲了几个小时后,我发现丢失数据的罪魁祸首是:
Note: Prior to PHP 5.6, a stream opened with php://input could only be read once
另一段代码是在我的代码之前访问php://输入,在使用php<的服务器上访问5.6,这导致输入丢失。
仅在PUT请求中。