Добавление получателя в SendGrid в JSON Возвращает Тело недействительно - PullRequest
0 голосов
/ 26 октября 2018

Первое и главное: я использую 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']
    ]
  ),
]);

В документации API SendGrid (Контакты API - Получатели / сообщение) (https://sendgrid.com/docs/API_Reference/api_v3.html):

Пользователь должен быть добавлен в виде полей данных в формате json. Я пытаюсь избежать отправки запросов cURL по причинам, вызывающим неприятный синтаксис, а также для лучшей обработки ошибок. (Я написал это в cURL в прошлом и не любил это.)

Однако, когда я отправил запрос на этот URL, который теоретически должен добавить их как пользователя и назначить им идентификатор получателя, я заставляю Laravel отправить мне эту ошибку обратно:

Ошибка клиента: POST https://api.sendgrid.com/v3/contactdb/recipients привел к ответу 400 BAD REQUEST: {"errors": [{"message": "тело запроса недействительно"}]}

Я точно знаю, что эта переменная действительна, поскольку я проверял ее до того, как был отправлен этот запрос, поэтому, насколько я могу судить, проблема не в переменной.

Любая помощь приветствуется - я думаю, что это простая синтаксическая ошибка.

Я видел код, подобный этому

$client->setBody(xyz)

Это то, на что я должен смотреть?

Редактировать: Благодаря помощи я узнал и понял это.

Правильный и действительный код, который работает для меня: (Uri является расширением основного в contactdb / получателей)

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

Как уже упоминалось в комментариях и ответах, определяя пост как json, вам не нужно добавлять тип контента или кодировать его вообще. Просто запятая отдельно с трубами! :)

1 Ответ

0 голосов
/ 26 октября 2018

Вам не нужно json_encode тело самостоятельно, это делает Guzzle. Просто передайте массив:

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