Пустое тело по запросу POST в Guzzle6 / PSR7 - PullRequest
1 голос
/ 27 марта 2019

Я использую Guzzle6 во вкусе PSR7, потому что он прекрасно интегрируется с аутентификацией Hawk. Теперь у меня проблемы с добавлением тела к запросу.

private function makeApiRequest(Instructor $instructor): ResponseInterface
{
    $startDate = (new CarbonImmutable('00:00:00'))->toIso8601ZuluString();
    $endDate = (new CarbonImmutable('00:00:00'))->addMonths(6)->toIso8601ZuluString();
    $instructorEmail = $instructor->getEmail();
    $body = [
        'skip' => 0,
        'limit' => 0,
        'filter' => [
            'assignedTo:user._id' => ['email' => $instructorEmail],
            'start' => ['$gte' => $startDate],
            'end' => ['$lte' => $endDate],
        ],
        'relations' => ['reasonId']
    ];

    $request = $this->messageFactory->createRequest(
        'POST',
        'https://app.absence.io/api/v2/absences',
        [
            'content_type' => 'application/json'
        ],
        json_encode($body)
    );

    $authentication = new HawkAuthentication();
    $request = $authentication->authenticate($request);

    return $this->client->sendRequest($request);
}

Когда я var_dump переменная $request, я не вижу тела внутри запроса. Это подтверждается тем фактом, что API отвечает так, как если бы тело не было отправлено. Я перепроверил это в Почтальоне. Как видите, в теле указаны фильтры и нумерация страниц, поэтому легко увидеть, что полученные результаты на самом деле не фильтруются.

Тот же запрос в Почтальоне (с телом) работает без нареканий.

Поскольку параметр может быть типа StreamInterface, я создал поток и передал ему тело. Тоже не сработало.

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Найдена проблема, на самом деле мое тело POST НЕ пусто. Просто получается, что сброс Request не намекает на фактическое тело, заключенное в сообщение.

Я могу порекомендовать всем, у кого есть подобные проблемы, использовать http://httpbin.org/#/HTTP_Methods/post_post для отладки тела POST.

Наконец, проблема заключалась в том, что мое content_type написание заголовка было неверным, поскольку сервер ожидает заголовок Content-Type. Из-за этого данные JSON были отправлены как данные формы.

1 голос
/ 27 марта 2019

Простые JSON запросы могут быть созданы без использования json_encode() ... см. Документацию .

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://app.absence.io/api/v2',
    'timeout'  => 2.0
]);

$response = $client->request('POST', '/absences', ['json' => $body]);
...