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

How do I access PHP REST API PUT data on the server side?

提问人:Shylor 提问时间:7/24/2011 最后编辑:MartinShylor 更新时间:6/13/2021 访问量:27946

问:

--问题--

我刚刚开始使用 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是创建数据。也许我错了。我错过了什么吗?

php rest 服务器端

评论

1赞 nevvermind 7/24/2011
也许这些链接会帮助你更好地理解REST的一些怪癖。

答:

15赞 Paul 7/24/2011 #1

PHP手册

PUT 数据来自 stdin:

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

用法示例:

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

评论

0赞 Shylor 7/24/2011
好吧,这两个都领先了。上面的返回资源 #11。如何访问该资源。底部以凌乱的字符串返回数据,但我看到它在那里。
0赞 Paul 7/24/2011
@sylor我编辑了我的帖子。该代码之后的数据是否正确?$putdata
0赞 Shylor 7/24/2011
我在文件大小上遇到了一些错误。警告:filesize() [function.filesize]:资源 ID #11 的统计失败。它还告诉我文件大小不能为 0。
0赞 Paul 7/24/2011
@shylor 我猜是有道理的,因为 stdin 的大小是可变的。我想你必须用一个循环来做。我再次更新了我的帖子。
1赞 Shylor 7/24/2011
领先。我用 PHP http_build_query() 将数据包装在客户端上,它看起来并不混乱。它看起来更像是 GET now.app_secret=a3e0701fbbafae60b9ba1922d0ee28def305113f&data=email%2F1
15赞 Srinivasu 4/2/2015 #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); 

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

评论

2赞 Nick Tsai 8/9/2017
这个答案是我喜欢的最好的方式。parse_str(file_get_contents("php://input"),$putData);
2赞 Emrah Tuncel 10/18/2020 #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');