REST 请求数据无法在“put”方法中读取

Posted

技术标签:

【中文标题】REST 请求数据无法在“put”方法中读取【英文标题】:REST request data can't be read in 'put' method 【发布时间】:2013-10-06 11:44:07 【问题描述】:

我正在尝试在不使用框架的情况下使用 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。会不会是网络服务器有问题?

【问题讨论】:

不要使用echo $data进行测试,使用var_dump($data)print_r($data) 我在我的服务器上重新创建了您的代码,并且能够使用您的 curl 命令运行它并产生所需的结果。 【参考方案1】:

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

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

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

另一段代码是在我的代码之前访问 php://input,在 php

仅适用于 PUT 请求。

【讨论】:

这很有帮助。谢谢分享。【参考方案2】:

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"

【讨论】:

@ShimoRachlenko 我刚刚编辑了代码,仍然得到相同的结果 你能确认file_get_contents("php://input")给你你发送的数据吗?还有一件事——你如何输出结果? 如何确认?到目前为止,输出是使用 'echo' 打印出来的,如上所示。 @Igor 如果您通过 POST 发送 JSON 数据,它也不会被解析为 $_POST。您需要做的是将请求的 HTTP 内容标头设置为 application/json,这样 PHP 就不会尝试将数据解析为查询字符串,然后您需要按照此处的建议将原始输入数据 json_decode .这适用于您通过 JSON 发送数据的任何情况。 @MikeBrant 您是否也尝试过此代码以查看它是否有效?

以上是关于REST 请求数据无法在“put”方法中读取的主要内容,如果未能解决你的问题,请参考以下文章

在 REST API 中使 PUT 创建请求幂等

REST - HTTP 状态 405;方法不允许;请求方法“PUT”不支持错误

Spring Rest Controller PUT 方法请求正文验证?

学习笔记——@PathVariable注解基本使用;@PathVariable注解属性;REST风格CRUD概述;实现PUT&DELETE提交方法步骤;SpringMVC处理请求数据请求头处理

Jersey REST GET 正在工作,但 PUT 没有。请求的资源不允许指定的 HTTP 方法

在 REST API 现实生活场景中使用 PUT 与 PATCH 方法