Жрет не правильно отправляя тело 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, основываясь на допущениях, которые он делает,перечислены в документации?

Ответы на вопрос(2)

Ваш ответ на вопрос