Laravel没有为PUT请求读取HTTP请求有效负载

时间:2014-08-19 15:20:16

标签: php symfony laravel laravel-4

所以我在这里磕磕绊绊,因为我已经发现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时它会变空。

依赖关系为bshaffer/oauth2-server-php

2 个答案:

答案 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()没用。

这有帮助吗?