Laravel不读取PUT请求的HTTP请求有效负载

Ron*_*son 4 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"}]} 
});
Run Code Online (Sandbox Code Playgroud)

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' 
});
Run Code Online (Sandbox Code Playgroud)

当这样做时,数据似乎无处可寻.这意味着我的Ember.js应用程序无法正常使用我的API.

这到底是怎么回事?

编辑

以下是Chrome DevTools中的完整请求示例:http://pastebin.com/ZEjDAsmJ

我发现这是一个特定的Laravel问题.

编辑2:找到答案

似乎我的项目中存在一个依赖项,它从标头与请求一起发送php://input时读取Content-Type: application/json.这会清除流 - 正如@ Mark_1提供的链接所指出的那样 - 当它到达Laravel时它会变空.

依赖是bshaffer/oauth2-server-php

Bar*_*vdh 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);
Run Code Online (Sandbox Code Playgroud)

所以他们都共享相同的内容等.