【问题标题】:Redirecting with a different HTTP method使用不同的 HTTP 方法重定向
【发布时间】:2019-08-31 16:32:05
【问题描述】:

我有一个更新给定实体的端点,响应应该是更新后的实体。我因此尝试了以下操作,但是,重定向是另一个 PUT 请求。如何响应 GET 请求?

$app->put('/foo/{id:[0-9]+}', function (Request $request, Response $response, $args) {
    $this->foo->update($args['id'], $request->getParsedBody());
    return $response->withRedirect("/foo/$args[id]");
});

【问题讨论】:

  • @Mike'Pomax'Kamermans 表单提交不使用PUT
  • 不,但这并不是实现重定向的重要部分?
  • 301/302 可以将请求更改为GET,307 将保证不会更改。 http 请求方法来自客户端,所以我不确定如何用 GET 请求“响应”。我认为您要做的是重定向并让/foo/[id] 进行实际更新,而不是试图假装响应来自/foo。删除 $this->foo->update(...) 调用并改为公开该端点。现在->withRedirect("/foo/$args[id]") 将在客户端的正确端点进行更新。
  • @AlexBarker 使用请求正文提供的内容更新实体,并将实体的 JSON 表示返回给客户端。为了实现这一点,我希望 PUT /foo/[id] 请求重定向到 GET /foo/[id] 请求,该请求提供实体的 JSON 表示。

标签: php httpresponse router slim slim-3


【解决方案1】:

您可以使用 303 重定向:

可以使用 GET 方法在另一个 URI 下找到对请求的响应。当收到响应 POST(或 PUT/DELETE)时,客户端应假定服务器已收到数据,并应向给定 URI 发出新的 GET 请求。

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#303

$app->put('/foo/{id:[0-9]+}', function (Request $request, Response $response, $args) {
    $this->foo->update($args['id'], $request->getParsedBody());
    return $response->withStatus(303)->withRedirect("/foo/$args[id]");
});

【讨论】:

  • 感谢匿名。也可以做return $response->withRedirect("/foo/$args[id]", 303); 原来我犯了一个愚蠢的错误。客户端PUT到Server1,Server1使用cURL PUT到Server2,Server2用Redirect(url)响应,Server2跟随请求而不是响应客户端。
  • 没问题。没关系,这个问题可能对其他人有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 2015-01-12
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多