【问题标题】:Cannot get body from PUT request with Slim Framework无法使用 Slim 框架从 PUT 请求中获取正文
【发布时间】:2014-01-17 08:54:48
【问题描述】:

我正在尝试使用 Slim 框架从 PUT 请求中检索参数。当从 POST 正文中解析参数时,我可以简单地使用 $request->post('param') 来检索 param 中的值。但是,当我使用 $request->put('param') 时,我总是收到 null。

我的 PUT 体是这样形成的:param=value&otherparam=othervalue&foo=bar...

P.S.:我已经看过this question,但是答案没有使用put()-Method。

【问题讨论】:

  • 请添加您的 PUT 路线并说明您是如何提出 PUT 请求的。如果是通过表格,请分享表格。
  • 我的路线是/api/post/:id(例如/post/id/2)。我目前通过 Fiddler 发送请求,稍后通过 android 应用发送请求

标签: rest slim http-put


【解决方案1】:

你从$request->put('param') 得到null,因为你试图在POST 路由上调用它。您需要创建一个单独的PUT 路由(或使用mapvia)才能获得PUT 参数。

另外,我不建议将 HTTP 动词添加到路由中。这会导致一些非常混乱的架构。

添加额外的路线:

$app->post('/api/something/:id', function () {});
$app->put('/api/something/:id', function () {});

使用Custom HTTP methodsmapvia

$app->map('/api/something/:id', function () {})->via('POST', 'PUT');

请参阅PUT routing documentation,并特别注意方法覆盖部分。

更新:工作示例

这是我发起的一个 PUT 请求示例:

$app->put('/test/:id', function ($id) use ($app) {
    $name = $app->request->put('name');
    echo sprintf('PUT request for resource id %d, name "%s"', (int) $id, $name);
});

我在命令行中使用 cURL 调用它,如下所示:

curl -X PUT -d name=arthur http://slim-tutorial.dev/test/2

结果:

PUT request for resource id 2, name "arthur"%

如果您有一个可以运行的 Slim 应用程序,而上述方法对您不起作用,则问题可能出在 Slim 之外,可能与您的测试方式或路由或测试参数中的拼写错误有关。

【讨论】:

  • 路由中的“post”与 HTTP 动词巧合。它实际上是留言板中的“帖子”
  • 实际上,我正在使用 PUT 调用正确的路由,并且到目前为止我已经验证了我的代码。 $request->is_Put() 返回 true,所以我唯一的问题是将参数从正文中取出
  • 啊,留言板里的帖子。知道了!所以你得到了 PUT 但没有得到任何参数。请参阅上面的更新示例,并尝试像我一样使用 curl 进行测试。
  • 太棒了,成功了。那么一定是 Fiddler 中的一个错误,因为 curl 工作正常
猜你喜欢
  • 2015-08-19
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
相关资源
最近更新 更多