在 JSON Returns 正文中向 SendGrid 添加收件人无效

Adding a Recipient to SendGrid in JSON Returns Body is Invalid

首先:我正在使用 Laravel 5.7.10、Guzzle 6.3.3、PHP 7.2.9 和 SendGrid 3.9.6

我只有大约 6 个月的 API 经验,所以请耐心等待我的行话:)

我的客户端请求代码失败:

 $client->request('POST', 'contactdb/recipients', [
  'headers' => [
    'Authorization' => [MyAPIKey - Correct and Valid],
    'Content-Type' => "application/json",
  ],
  'json' => json_encode(
    [
      'email' => $emailSent['email']
    ]
  ),
]);

在 SendGrid API 文档下,(联系人 API - 收件人 /post)(https://sendgrid.com/docs/API_Reference/api_v3.html):

应将用户添加为 json 编码的 'data' 字段。我试图避免出于令人讨厌的语法原因以及更好的错误处理而发送 cURL 请求。 (我以前用 cURL 写过这个,但不喜欢它。)

但是,当我向 url 发送请求时,理论上应该将他们添加为用户并为他们分配收件人 ID,但我 Laravel 将此错误推回给我:

Client error: POST https://api.sendgrid.com/v3/contactdb/recipients resulted in a 400 BAD REQUEST response: {"errors":[{"message":"request body is invalid"}]}

我知道这个变量是有效的,因为我在发送此请求之前已经检查过它,所以据我所知,问题不在于变量。

如有任何帮助,我们将不胜感激 - 我认为这是一个简单的语法错误。

我看过类似的代码

$client->setBody(xyz)

这是我应该看的东西吗?

编辑:感谢帮助,我已经学习并弄明白了。

适用于我的正确有效代码: (Uri 是 contactdb/recipients 中主要的扩展)

$res = $client->request('POST', 'contactdb/recipients', [
  'headers' => [
    'Authorization' => My API Key,
  ],
  'json' => [
    [
        'email' => $emailSent['email']
    ]
  ],
]);

如评论和答案中所述,通过将 post 定义为 json,您根本不必添加内容类型或对其进行编码。只需用逗号分隔管道! :)

您不必 json_encode 自己 body,它由 Guzzle 完成。只需简单地传递数组:

$client->request('POST', 'contactdb/recipients', [
  'headers' => [
    'Authorization' => [MyAPIKey - Correct and Valid],
  ],
  'json' => [
      'email' => $emailSent['email']
  ],
]);