Добавление получателя в SendGrid в теле возврата JSON недопустимо

Прежде всего: я использую 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 вернет мне эту ошибку:

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']
    ]
  ],
]);

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
677
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 в запрос, используя параметр запроса тела, и указать правильный заголовок Content-Type, используя параметр запроса заголовков. Этот параметр нельзя использовать с body, form_params или multipart. Должен ли я передать это как кодировку и тело?

Sigkar 26.10.2018 20:16

Просто используйте опцию «json», как вы это делали изначально. Поскольку Guzzle также может автоматически устанавливать заголовок типа содержимого при использовании параметра json, вы также можете пропустить это. (Обновил код из моего ответа.)

Zoli Szabó 26.10.2018 20:23

Спасибо. Это сделало меня на шаг ближе. Теперь моя проблема в том, что я получаю сообщение «Недопустимый формат получателя», но, по крайней мере, сейчас я получаю 201 :) - Спасибо!

Sigkar 26.10.2018 20:39

Другие вопросы по теме