【问题标题】:Adding a Recipient to SendGrid in JSON Returns Body is Invalid在 JSON 返回正文中向 SendGrid 添加收件人无效
【发布时间】:2018-10-27 03:40:31
【问题描述】:

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

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

我的客户请求代码失败:

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

在 SendGrid API 文档下,(Contacts API - Recipients /post)(https://sendgrid.com/docs/API_Reference/api_v3.html):

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

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

客户端错误:POST https://api.sendgrid.com/v3/contactdb/recipients 导致 400 BAD REQUEST 响应:{"errors":[{"message":"request body is invalid"}]}

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

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

我见过类似的代码

$client->setBody(xyz)

这是我应该看的东西吗?

编辑:感谢帮助,我已经学会并解决了这个问题。

适用于我的正确且有效的代码: (uri是contactdb/recipients中main的扩展)

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

如 cmets 和 answers 中所述,通过将帖子定义为 json,您根本不必添加内容类型或对其进行编码。只是用管道逗号分隔! :)

【问题讨论】:

    标签: php laravel rest guzzle laravel-5.7


    【解决方案1】:

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

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

    【讨论】:

    • 阅读 Guzzle 文档:注意此请求选项不支持自定义 Content-Type 标头或 PHP 的 json_encode() 函数中的任何选项。如果您需要自定义这些设置,则必须使用正文请求选项自己将 JSON 编码数据传递到请求中,并且必须使用 headers 请求选项指定正确的 Content-Type 标头。此选项不能与 body、form_params 或 multipart 一起使用。我应该将其作为编码和正文传递吗?
    • 只需像最初一样使用“json”选项。由于 Guzzle 还可以在使用 json 选项时自动设置 content-type 标头,因此您也可以跳过它。 (根据我的回答更新了代码。)
    • 谢谢。这让我更近了一步。现在我的问题是我收到“无效的收件人格式”,但至少我现在收到了 201 :) - 谢谢!
    猜你喜欢
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多