所以我在这里磕磕绊绊,因为我已经发现PHP不会从PUT请求中读取HTTP请求体。当请求中的Content-Type
标头设置为application/json
时,似乎没有办法获取正文。
我正在使用Laravel,它在Symfony2的HttpFoundation lib之上构建他们的请求层。
我已经使用jQuery对此进行了一些调试,这些是一些示例请求:
执行此类请求后,我可以通过Input::getContent()
$.ajax({
url: 'http://api.host/profiles/12?access_token=abcdef',
type: 'PUT',
data: {"profiles":[{"name":"yolanda ellis","email":"yolanda.ellis12@example.com"}]}
});
我无法通过file_get_contents('php://input')
获取内容。默认情况下,jQuery将数据发送为application/x-www-form-urlencoded
。
当我在请求中传递另一个Content-Type时,它变得更加令人费解。就像Ember-Data一样:
$.ajax({
url: 'http://api.host/profiles/12?access_token=abcdef',
type: 'PUT',
data: {"profiles":[{"name":"yolanda ellis","email":"yolanda.ellis12@example.com"}]},
contentType: 'application/json'
});
当像这样做时,数据似乎无处可寻。这意味着我的Ember.js应用程序无法正常使用我的API。
这到底是怎么回事?
修改
以下是Chrome DevTools中的完整请求示例:http://pastebin.com/ZEjDAsmJ
我发现这是Laravel特有的问题。
编辑2:找到答案
我的项目中似乎存在一个依赖项,当php://input
标头与请求一起发送时,该依赖项从Content-Type: application/json
读取。这会清除流 - 正如@ Mark_1提供的链接所指出的那样 - 当它到达Laravel时它会变空。
答案 0 :(得分:7)
您应该能够在代码中使用Input::json()
来获取json解码内容。
我认为你只能读取输入流一次,所以如果另一个包在您之前读取输入流,则无法访问它。
您是否使用OAuth2\Request::createFromGlobals()
来创建处理令牌的请求?您应该从Laravel传入现有的请求对象,因此两者都可以访问内容。
你读过这个吗? http://bshaffer.github.io/oauth2-server-php-docs/cookbook/laravel/
这链接到https://github.com/bshaffer/oauth2-server-httpfoundation-bridge,它解释了如何从httpfoundation请求对象(Laravel使用)创建请求对象。
这样的事情:
$bridgeRequest = \OAuth2\HttpFoundationBridge\Request::createFromRequest($request);
$server->grantAccessToken($bridgeRequest, $response);
所以他们都共享相同的内容等。
答案 1 :(得分:3)
我在http://php.net/manual/en/features.file-upload.put-method.php
找到了以下评论PUT原始数据来自php:// input,你必须使用fopen()和 获取内容的fread()。 file_get_contents()没用。
这有帮助吗?