Жрет не правильно отправляя тело PSR-7 POST
Он либо не отправляется, либо принимается неправильно. С помощьюcurl
работает напрямую из командной строки (с помощью опции -d) или из PHP (с помощью CURLOPT_POSTFIELDS).
Я начинаю с запроса PSR-7:
$request = GuzzleHttp\Psr7\Request('POST', $url);
Я добавляю аутентификационный заголовок, который аутентифицируется по API правильно:
$request = $request->withHeader('Authorization', 'Bearer ' . $accessToken);
Затем я добавляю тело запроса:
// The parameter for the API function
$body = \GuzzleHttp\Psr7\stream_for('args=dot');
$request = $request->withBody($body);
Я могу отправить сообщение в API:
$client = new \GuzzleHttp\Client();
$response = $client->send($request, ['timeout' => 2]);
Ответ, который я получаю, указывает, что параметр «args» просто не был виден API. Я попытался переместить токен аутентификации в args:
'args=dot&access_token=123456789'
Это должно работать, иделает работа с curl из командной строки (-d access_token=123456789
), но API не видит этот параметр также при отправке cia curl (6.x), как указано выше.
Я вижу сообщениеделает содержать тело:
var_dump((string)$request->getBody());
// string(8) "args=dot"
// The "=" is NOT URL-encoded in any way.
Так что здесь может пойти не так? Параметры не отправляются, или они отправляются в неправильном формате (возможно, кодируется «=»?), Или, возможно, используется неправильный тип содержимого? Трудно увидеть, что отправляется «по проводам» при использовании Guzzle, поскольку HTTP-сообщение отформатировано и отправлено на несколько уровней глубиной.
Редактировать: вызовлокальный тестовый скрипт вместо удаленного API я получаю эту необработанную деталь сообщения:
POST
CONNECTION: close
CONTENT-LENGTH: 62
HOST: acadweb.co.uk
USER-AGENT: GuzzleHttp/6.1.1 curl/7.19.7 PHP/5.5.9
args=dot&access_token=5e09d638965288937dfa0ca36366c9f8a44d4f3e
Так выглядит телоявляется Я думаю, что-то еще отсутствует, чтобы сообщить удаленному API, как интерпретировать это тело.
Изменить: работающий локон командной строки, отправленный в тот же тестовый скрипт, дает мне два дополнительных поля заголовка в запросе:
CONTENT-TYPE: application/x-www-form-urlencoded
ACCEPT: */*
Я собираюсь догадаться, что именно заголовок типа контента, который отсутствует в запросе Guzzle, является источником проблемы. Так это ошибка жрет? Если он не всегда отправлял Content-Type, основываясь на допущениях, которые он делает,перечислены в документации?