Php GUZULE6/PSR7中的后请求空车身

Php GUZULE6/PSR7中的后请求空车身,php,guzzle6,Php,Guzzle6,我在PSR7版本中使用Guzzle6,因为它与Hawk身份验证很好地集成。现在,我面临向请求添加一个主体的问题 private function makeApiRequest(Instructor $instructor): ResponseInterface { $startDate = (new CarbonImmutable('00:00:00'))->toIso8601ZuluString(); $endDate = (new CarbonImmutable('00

我在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\u dump
使用
$request
变量时,我在请求中没有看到任何主体。这一点得到了以下事实的支持:API的响应就像没有发送任何正文一样。我在邮递员那里反复核对了一下。正如您所看到的,主体指定了过滤器和分页,因此很容易看到我得到的结果实际上没有被过滤

《邮递员》(带身体)中的同样要求完美无瑕


由于参数可以是
StreamInterface
类型,因此我创建了一个流,并将主体传递给它。也不管用

Simple
JSON
请求可以在不使用
JSON\u encode()
的情况下创建。。。看


发现问题了,其实我的帖子正文不是空的。事实证明,转储
请求
不会提示消息中包含的实际正文

我可以推荐任何有类似问题的人来调试帖子正文


最后,问题是我的
content\u type
标题拼写错误,因为服务器需要标题
content type
。因此,JSON数据作为表单数据发送

我真的不建议你自己写JSON。创建一个数组并使用
json\u encode()
instead是的,我有一个预感这不是你怎么做的。谢谢你的评论。现在被数组替换。仍然不起作用,对吧:(不……不幸的是没有。以前也试过。通过Guzzle实现挖掘,我似乎无法理解流_的含义()是的。这也不是RequestInterface缺少任何与正文或内容相关的方法的原因……我使用PSR7变体是因为它允许轻松集成Hawk身份验证。您的建议将迫使我使用Guzzle的事件系统来使用身份验证头来丰富请求。@chrisssory有几种方法可以创建请求,这就是我添加术语“简单”的原因。起初没有注意到错误的
内容类型
标题,但这可能不会被解释为表单数据,但很可能被解释为
文本/普通
(这种无法识别的标题很可能会被忽略)。
use GuzzleHttp\Client;

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

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