如何在服务器端访问PHP REST API PUT数据?

Shy*_*lor 16 php rest server-side put

- 题 -

我刚刚开始使用REST API,我感到非常困惑.

这就是我的PHP cRUL客户端对于PUT的看法.

case 'PUT':
    curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT');
    curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
    break;
Run Code Online (Sandbox Code Playgroud)

现在,当我查看服务器时,我的$ _SERVER ['REQUEST_METHOD']显示了PUT,但我的问题是如何获取我用CURLOPT_POSTFIELDS发送的$数据.

我需要做的就是将带有PUT请求的$ data发送到下一行.喜欢

$value = $data['curl_data'];
Run Code Online (Sandbox Code Playgroud)

我在这个话题上看到了这么多的混乱,让我头疼.在php客户端方面似乎很容易,但是没有人有能够为php服务器端工作的答案.

谢谢你的帮助!

- 回答(帮助和作业后) -

我很新,所以直到8小时后才能回答我自己的问题...奇怪:)

好的,在与这里的优秀人士合作之后,我不得不说我们遇到了答案.我正在踢它,因为它很容易,同时令人困惑.

curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($data));
Run Code Online (Sandbox Code Playgroud)

第一个更改(上面)我不得不在$ data周围添加http_build_query().这将我的数据从数组转换为url友好字符串.

接下来我必须添加.

parse_str(file_get_contents('php://input'), $put);
Run Code Online (Sandbox Code Playgroud)

现在我可以做像$ put ['data']这样的事情.

PaulPRO上面给出的答案确实能够以更少的行来获得与file_get_contents()相同的数据.我们陷入困境,试图弄清楚如何解析数据,这是我在另一个网站上看到的缺少http_build_query()的地方.

所以这就是它的运作方式.

  1. 数据被放入正常数组中.
  2. http_build_query()将它转换为一个很好的几乎像GET一样的字符串.
  3. file_get_contents()将其从客户端传输到服务器.
  4. parse_str()然后将其转回数组.

我看到很多关于使用PUT发送文件的消息.我可以看到这是如何工作的,但是从我在整个REST过程中读到的内容来看,PUT是更新数据,因为post是创建数据.也许我弄错了.我错过了什么吗?

Pau*_*aul 9

PHP手册:

PUT数据来自stdin:

$putdatafp = fopen("php://input", "r");

用法示例:

$putfp = fopen('php://input', 'r');
$putdata = '';
while($data = fread($putfp, 1024))
    $putdata .= $data;
fclose($putfp);
Run Code Online (Sandbox Code Playgroud)


小智 7

在相同的情况下,必须使用PUT方法通过ReST API将数据发送到PHP服务器。我费了将近几个小时才能找到解决方案,但最终找到了解决方法:

在CUrl中:

$postData = http_build_query($data);
curl_setopt($ch, CURLOPT_POSTFIELDS,$postData); 
Run Code Online (Sandbox Code Playgroud)

我们必须将数据解析为一个变量,比如说:$ putData,这里是“解析字符串”过程:

parse_str(file_get_contents("php://input"),$putData); 
Run Code Online (Sandbox Code Playgroud)

然后打印$putData,将获得与curl中发布的数组相同的数组。

  • 这个答案是我最喜欢的方式。`parse_str(file_get_contents("php://input"),$putData); ` (2认同)