【问题标题】:Guzzle HTTP request transforms from POST to GETGuzzle HTTP 请求从 POST 转换为 GET
【发布时间】:2020-07-09 17:40:48
【问题描述】:

我在尝试向外部 API 发布帖子时发生了一件非常奇怪的事情,我尝试向 URL 发出 POST 请求,但 Guzzle 却发出了 GET 请求(这是对该 API 的合法行为,但会返回一些内容不同)。

代码如下:

$request = $this->client->createRequest('POST', 'sessions', [
  'json' => [
    'agent_id' => $agentId,
    'url' => $url
  ],
  'query' => [
    'api_key' => $this->apiKey
  ]
]);

echo $request->getMethod(); // comes out as POST
$response = $this->client->send($request);
echo $request->getMethod(); // suddenly becomes GET

当我使用$this-client->post(…)时也会发生同样的事情

我真的不知道下一步该做什么。

【问题讨论】:

  • 当调试选项为真时你会得到什么?客户端实际上是在发送 POST 还是 GET?
  • 原来我的正文无效,我被重定向了。感谢您的调试建议,我不知道它是否可用。

标签: php guzzle


【解决方案1】:

我遇到了同样的问题。 原因是当存在代码为 301 或 302 的位置重定向时,Guzzle 会将请求方法更改为“GET”。 我在RedirectMiddleware.php 中找到了“问题代码”。

但是当您看到 if 条件时,您可以通过在选项中添加 'allow_redirects'=>['strict'=>true] 来禁用此行为。 找到这个选项后,发现Guzzle Options Documentation中列出了这个选项

所以你应该像这样重写你的 createRequest:

$request = $this->client->createRequest('POST', 'sessions', [
  'json' => [
    'agent_id' => $agentId,
    'url' => $url
  ],
  'query' => [
    'api_key' => $this->apiKey
  ],
  'allow_redirects'=> ['strict'=>true]
]); 

并且它应该在重定向后保留 Method POST

【讨论】:

    【解决方案2】:

    您可能会收到一个 3xx 状态代码,以便Redirect 订阅者启动(默认情况下启用重定向)。来自docs

    [...] 传递一个包含“max”键的关联数组来指定 重定向的最大数量,并可选择提供“严格”键 指定是否使用严格的符合 RFC 的重定向的值 (意思是用 POST 请求重定向 POST 请求与做什么 大多数浏览器都会使用 GET 请求重定向 POST 请求)。

    //edit 刚刚看到您在question comments 中回答了自己的问题 - 由于它提供了一些上下文,因此仍然将这个答案留在网上。

    【讨论】:

      【解决方案3】:

      尝试将键“查询”更改为“正文”。

      【讨论】:

        【解决方案4】:

        请将query 切换为form_params。在 Guzzle 6 中它可以工作。

        【讨论】:

          猜你喜欢
          • 2013-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-22
          • 2017-01-13
          • 1970-01-01
          相关资源
          最近更新 更多