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

Posted

技术标签:

【中文标题】如何在服务器端访问 PHP REST API PUT 数据?【英文标题】:How do I access PHP REST API PUT data on the server side? 【发布时间】:2011-10-11 22:40:15 【问题描述】:

-- 问题--

我刚开始使用 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。

我需要做的就是将通过 PUT 请求发送的 $data 放入下一行。喜欢

$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() 的原因。

这就是一切的运作方式。

    数据被放入一个普通数组中。 http_build_query() 将它转换成一个漂亮的几乎类似于 GET 的字符串。 file_get_contents() 将其从客户端传输到服务器。 parse_str() 然后将其转回数组。

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

【问题讨论】:

也许 these links 会帮助你更好地理解 REST 的一些怪癖。 【参考方案1】:

来自PHP Manual:

PUT 数据来自标准输入:

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

示例用法:

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

【讨论】:

好的,这两个都领先。上面的返回资源 #11。我如何访问该资源。底部返回的数据是杂乱无章的字符串,但我看到它在那里。 @sylor 我编辑了我的帖子。代码之后$putdata 中的数据是否正确? 我在文件大小上遇到了一些错误。警告:filesize() [function.filesize]:资源 ID #11 的统计失败。它还告诉我 fread 上的文件大小不能为 0。 @shylor 我猜是有道理的,因为标准输入的大小是可变的。我想你必须用循环来做。我又更新了帖子。 找到了线索。我使用 PHP http_build_query() 将数据包装在客户端上,它看起来并不像一团糟。现在看起来更像 GET.app_secret=a3e0701fbbafae60b9ba1922d0ee28def305113f&data=email%2F1【参考方案2】:

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

在 CUrl 中:

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

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

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

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

【讨论】:

这个答案是我最喜欢的方式。 parse_str(file_get_contents("php://input"),$putData); 【参考方案3】:

如果您想获取具有 $_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');

【讨论】:

以上是关于如何在服务器端访问 PHP REST API PUT 数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 AWS Gateway REST API 可通过可公开访问的网页进行访问 (React)

电子中的 REST API [关闭]

防止rest api中的重复请求

使用 GoLang 后端反应 JS Rest API 安全性

PayPal智能支付按钮与服务器端REST API集成

如何从远程机器访问 REST API?