HTTP-запрос Guzzle преобразуется с POST в GET

У меня происходит очень странная вещь, когда я пытаюсь отправить сообщение во внешний API, я пытаюсь сделать запрос POST для URL-адреса, но вместо этого 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(…)

Я действительно понятия не имею, что делать дальше.


person Dan F.    schedule 06.04.2015    source источник
comment
Что вы получаете, когда параметр отладки верен? Клиент действительно отправляет POST или GET?   -  person Shaun Bramley    schedule 06.04.2015
comment
Оказалось, что мое тело недействительно, и меня перенаправили. Спасибо за предложение отладки, я не знал, что он доступен.   -  person Dan F.    schedule 07.04.2015


Ответы (4)


У меня та же проблема. причина в том, что Guzzle меняет метод запроса на 'GET', когда есть перенаправление местоположения с кодом 301 или 302. Я нашел 'Problem-Code' в RedirectMiddleware.php.

Но когда вы видите условие if, вы можете отключить это поведение, добавив 'allow_redirects'=>['strict'=>true] к своим параметрам. Обнаружив этот вариант, я обнаружил, что он указан в Guzzle Документация по опциям

Так что просто перепишите свой createRequest следующим образом:

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

И после перенаправления он должен остаться методом POST.

person Radon8472    schedule 31.01.2020

Вы, вероятно, получаете код состояния 3xx, чтобы подписчик Redirect подключился (перенаправление включено по умолчанию). Из документов:

[...] Передайте ассоциативный массив, содержащий ключ 'max', чтобы указать максимальное количество перенаправлений и, при необходимости, укажите значение ключа 'strict', чтобы указать, следует ли использовать строгие перенаправления, совместимые с RFC (означает перенаправление запросов POST с запросами POST вместо того, что делают большинство браузеров, а именно перенаправляют запросы POST с запросами GET).

// edit Только что видел, как вы сами ответили на это в комментарии к вопросам - все еще оставляю этот ответ онлайн, поскольку он дает некоторый контекст.

person Hirnhamster    schedule 12.04.2015

Попробуйте изменить ключ "запрос" на "тело".

person Dmitriy Urazov    schedule 09.04.2015

Пожалуйста, переключите query на form_params. В Guzzle 6 все работает.

person maverabil    schedule 08.02.2019