【问题标题】:Getting PUT data in Lumen在 Lumen 中获取 PUT 数据
【发布时间】:2016-09-14 22:57:47
【问题描述】:

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

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

我还发现,当我将 Content-Type 标头设置为 text/plain 时,我可以成功打印 $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());
    }
}

【问题讨论】:

  • 你能展示你的代码吗?
  • 哪一部分?在我的 routes.php 中:$api->put('settings', 'SettingController@update');。在更新方法中,我只是简单地做print_r($request->all()),它是空的。顺便说一句,我正在使用 dingo 包。
  • 如果您正在使用,请显示您的路由和控制器。
  • 我编辑了我的原始帖子

标签: laravel lumen dingo-api


【解决方案1】:

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

application/x-www-form-urlencoded

【讨论】:

    【解决方案2】:

    我在 Lumen 上也遇到过同样的问题。在 public/index.php 我不得不替换:

    Illuminate\Http\Request::capture();
    
    $app->run($request)
    

    用这个:

    $app->run();
    

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

    logging_function($app->request);
    

    【讨论】:

    • 成功了!不知道为什么我首先有Illuminate\Http\Request::capture();,但无论如何
    【解决方案3】:

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

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

    {"asd": "asdf"}
    

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

    Array
    (
        [asd] => asdf
    )
    

    【讨论】:

    • 这很奇怪:当我将 Content-Type 设置为 application/json 时,响应为空。但是,当我将其设置为 text/plain 并输出 $request->json() 时,会输出正确的数据。会不会和 dingo API 包有关?
    • 好吧,我们发现野狗不是问题;关闭时,请求对象仍会启动两次
    猜你喜欢
    • 2019-04-17
    • 2018-06-30
    • 2011-09-15
    • 2020-12-14
    • 1970-01-01
    • 2021-02-17
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多