Guzzle HTTP请求从POST转换为GET


Guzzle HTTP request transforms from POST to GET

当我试图向外部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(…) 时也会发生同样的事情

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

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

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

所以你可以这样重写你的createRequest:

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

并且在重定向之后它应该保持方法POST

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

[…]传递一个包含要指定的"max"键的关联数组重定向的最大数量,并可选择提供"严格"密钥值,指定是否使用严格的符合RFC的重定向(意思是用POST请求重定向POST请求,而不是做什么大多数浏览器使用GET请求重定向POST请求)。

//edit刚刚看到你在问题评论中自己回答了这个问题——仍然把这个答案留在网上,因为它提供了一些上下文。

尝试将键'query'更改为'body'。

请将query切换到form_params。在Guzzle 6中它是有效的。