Guzzle6 / PSR7中的POST请求中的空主体

时间:2019-03-26 22:06:32

标签: php guzzle6

我在PSR7风格中使用Guzzle6,因为它与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 个答案:

答案 0 :(得分:1)

无需创建JSON就可以创建简单的json_encode()请求...请参阅documentation

use GuzzleHttp\Client;

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

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

答案 1 :(得分:1)

发现了问题,实际上我的POST正文不是空的。事实证明,转储Request不会暗示有关消息中包含的实际正文的任何​​信息。

我可以建议任何有类似问题的人使用http://httpbin.org/#/HTTP_Methods/post_post调试POST正文。

最后,问题是我的content_type标头拼写错误,因为服务器期望标头Content-Type。因此,JSON数据作为表单数据发送。