24

- 问题 -

我刚开始使用 REST API,我很困惑。

这就是我的 PHP cRUL 客户端对于 PUT 的样子。

case 'PUT':
    curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT');
    curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
    break;

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

我需要做的就是将 $data 与 PUT 请求一起发送到下一行。喜欢

$value = $data['curl_data'];

我在这个话题上看到了很多混乱,这让我很头疼。在 php 客户端似乎很容易,但没有人有适用于 php 服务器端的答案。

谢谢你的帮助!

-- 回答(在帮助和家庭作业之后) --

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

好的,在与这里的伟人一起工作之后,我不得不说我们遇到了答案。我很自责,因为它如此简单,同时又令人困惑。

curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($data));

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

接下来我不得不添加。

parse_str(file_get_contents('php://input'), $put);

现在我可以做类似 $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 是创建数据一样。也许我错了。我错过了什么吗?

4

3 回答 3

14

来自PHP 手册

PUT 数据来自标准输入:

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

示例用法:

$putfp = fopen('php://input', 'r');
$putdata = '';
while($data = fread($putfp, 1024))
    $putdata .= $data;
fclose($putfp);
于 2011-07-24T07:48:43.700 回答
11

我有同样的场景,必须使用 PUT 方法通过 ReST API 将数据发送到 PHP 服务器。我挣扎了将近几个小时才找到解决方案,但终于找到了方法:

在卷曲:

$postData = http_build_query($data);
curl_setopt($ch, CURLOPT_POSTFIELDS,$postData); 

我们必须将数据解析为一个变量,比如说:$putData,这里是 Parse String 过程:

parse_str(file_get_contents("php://input"),$putData); 

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

于 2015-04-02T11:16:02.973 回答
2

如果您想获取具有 $_POST 之类的键值的表单数据。

function PUT(string $name):string{

    $lines = file('php://input');
    $keyLinePrefix = 'Content-Disposition: form-data; name="';

    $PUT = [];
    $findLineNum = null;

    foreach($lines as $num => $line){
        if(strpos($line, $keyLinePrefix) !== false){
            if($findLineNum){ break; }
            if($name !== substr($line, 38, -3)){ continue; }
            $findLineNum = $num;
        } else if($findLineNum){
            $PUT[] = $line;
        }
    }

    array_shift($PUT);
    array_pop($PUT);

    return mb_substr(implode('', $PUT), 0, -2, 'UTF-8');

}

例如rest-api.php

$title = PUT('title');
于 2020-10-18T02:29:49.000 回答