繁体   English   中英

PHP得到PUT请求体

[英]PHP get PUT request body

我目前正在用PHP开发Restful Json-API。 我想发送一个PUT-Request到items/:id来更新记录。 数据将作为application/json传输。

我想用API调用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 Framework开发API。

php://input只能读取一次PUT请求:

注意:使用php://输入打开的流只能读取一次; 流不支持搜索操作。 但是,根据SAPI实现,可能会打开另一个php://输入流并重新开始读取。 只有在保存了请求正文数据后才能执行此操作。 通常,这是POST请求的情况,但不是其他请求方法,例如PUT或PROPFIND。

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

Slim框架已根据请求读取数据。 从Request对象中获取数据,并将其读取到该对象中。

在服务器端,我无法检索请求正文。 我试过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://输入。 你尝试过这样做吗?

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

注意:使用php://输入打开的流只能读取一次; 流不支持搜索操作。 但是,根据SAPI实现,可能会打开另一个php://输入流并重新开始读取。 只有在保存了请求正文数据后才能执行此操作。 通常,这是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM