PHP获取PUT请求正文


PHP get PUT request body

我目前正在用PHP开发一个Restful Json-API。我想向items/:id发送PUT请求以更新记录。数据将以application/json的形式传输。

我想用调用API

curl -H "Content-Type: application/json" -X PUT -d '{"example" : "data"}' "http://localhost/items/someid"

在服务器端,我无法检索请求正文。我试过

file_get_contents("php://input");

但这返回一个空字符串。fopen()/fread()组合也不起作用。

当通过POST调用时,一切都很好,我可以在服务器端完美地读取json。但API不再是Restful。有人能解决这个问题吗?有其他发送和接收Json的方式吗?

顺便说一下,我正在用Slim框架开发API。

php://input对于PUT请求只可读一次:

注:打开的流php://input只能读取一次;流不支持查找操作。但是,根据SAPI的实现,可能会打开另一个php://input流并重新开始读取。只有在保存了请求正文数据的情况下,才可能执行此操作。通常,POST请求是这种情况,但其他请求方法(如PUT或PROPFIND)则不然。

http://php.net/manual/en/wrappers.php.php

Slim框架已经根据请求读取数据。从请求对象中获取数据,该数据已被读取到该对象中。

在服务器端,我无法检索请求正文。我尝试了file_get_contents("php://input");

每次请求只能使用file_get_contents( 'php://input', 'r' );一次。检索它的值也会截断值,所以如果您调用它两次,它将返回一个空字符串。Slim的请求对象包含您需要的值,因此:

<?php
$app = new Slim( );
$app->put( '/items/someid', function () use ( $app ) {
    echo $app->request( )->put( 'example' ); // should display "data".
});

PHP手册中的示例使用fopen访问php://input处于读取模式。你试过那样做吗?

编辑:PHP的手册页面://说了一些似乎暗示PUT数据在某些情况下可能不可用的东西!

注:打开的流php://input只能读取一次;这个流不支持查找操作。但是,根据SAPI实现后,可能会打开另一个php://input流并重新开始读取。只有当请求主体数据已保存。通常POST请求就是这种情况,而不是诸如PUT或PROPFIND之类的其他请求方法。

关于PUT处理,我不知道这会给您带来什么。一页似乎说这是可能的,另一页似乎暗示它在错误的情况下不会工作

前几天我读了SLIM框架文档,它说一些浏览器在PUT和DELETE方面存在问题。

摘录:

不幸的是,现代浏览器不提供对PUT请求的本机支持。要绕过这个限制,请确保HTML表单的方法是"post",然后在HTML表单中添加一个方法覆盖参数,如下所示:

<form action="/books/1" method="post">
    ... other form fields here...
    <input type="hidden" name="_METHOD" value="PUT"/>
    <input type="submit" value="Update Book"/>
</form>

来源:http://www.slimframework.com/documentation/stable