8

我正在尝试在不使用框架的情况下使用 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 并且file_get_contents('php://input', true)仍然返回 null 的代码。会不会是网络服务器有问题?

4

2 回答 2

16

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"
}
于 2013-09-30T14:50:34.413 回答
2

会不会是网络服务器有问题?

其实,是。经过几个小时的努力,我发现丢失数据的罪魁祸首是:

Note: Prior to PHP 5.6, a stream opened with php://input could only be read once

另一段代码是在我的代码之前访问 php://input,并且在 php < 5.6 的服务器上,这会导致输入丢失。

仅在 PUT 请求上。

于 2017-01-12T14:00:02.283 回答