1

我正在努力在我的 Lumen API 中创建有效的 PUT 路由。我的请求到达了正确的路线,但我无法通过$request->all().

我发现 PHP 需要读取php://input流来获取 PUT 正文。这是在 的getContent()函数中完成的Symfony\Component\HttpFoundation\Request。但是,此函数被多次调用,并且由于输入缓冲区在读取时被清空,因此在我需要时数据不存在。

我还发现,当我将 Content-Type 标头设置为 text/plain 时,我可以成功 print $request->json(),但是当我将其设置为 application/json 时,对象为空。

有任何想法吗?

PS:我知道对于 HTML 请求,您应该添加 _method 参数,但由于我不是通过 HTML 执行请求,因此不需要该参数。

编辑:

我的路线:

$app->put('settings', 'SettingController@update');

我的控制器:

class SettingController extends Controller
{
    public function update(Request $request)
    {
        print_r($request->all());
    }
}
4

3 回答 3

1

您的请求的 Content-Type 需要相应地设置。就我而言,我正在发送 json 数据,所以我将其设置为 application/json。

所以当我在我的请求正文中发送这个时:

{"asd": "asdf"}

我收到了来自您控制器的代码的响应:

Array
(
    [asd] => asdf
)
于 2016-05-21T22:55:04.890 回答
0

我对 Lumen 也有同样的问题。在 public/index.php 我不得不替换:

Illuminate\Http\Request::capture();

$app->run($request)

有了这个:

$app->run();

注意: 如果你想在 $app->run() 之后使用 Request 对象(例如做一些记录或基准测试)你应该使用 $app->request。

logging_function($app->request);
于 2016-05-24T09:11:40.673 回答
0

您需要在标题中包含正确的内容类型。尝试

application/x-www-form-urlencoded
于 2019-10-30T17:17:43.553 回答