当我试图向外部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中它是有效的。