我目前正在用PHP开发Restful Json-API。我想向items/:id
发送PUT-Request以更新记录。数据将以application/json
传输。
我想用
调用APIcurl -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 Framework开发API。
答案 0 :(得分:13)
php://input
只能读取一次:
注意:使用php://输入打开的流只能读取一次;流不支持搜索操作。但是,根据SAPI实现,可能会打开另一个php://输入流并重新开始读取。只有在保存了请求正文数据后才能执行此操作。通常,这是POST请求的情况,但不是其他请求方法,例如PUT或PROPFIND。
Slim框架已根据请求读取数据。从Request对象中获取已读取的数据。
答案 1 :(得分:2)
在服务器端,我无法检索请求正文。我尝试了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".
});
答案 2 :(得分:0)
来自PHP manual的示例使用fopen以读取模式访问php://输入。你尝试过这样做吗?
编辑:manual page for PHP://说一些似乎暗示PUT数据可能在某些情况下不可用的东西!
注意:使用php://输入打开的流只能读取一次;该 流不支持搜索操作。但是,取决于 SAPI实现,有可能打开另一个php://输入 流并重新开始阅读。这只有在请求正文时才有可能 数据已保存。通常,这是POST请求的情况, 但不是其他请求方法,例如PUT或PROPFIND。
我不知道这会给你带来什么样的PUT处理。一页似乎说有可能,另一页似乎暗示它不会在错误的环境下工作
答案 3 :(得分:-1)
前几天我正在阅读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>