Первое и главное: я использую 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, вам не нужно добавлять тип контента или кодировать его вообще. Просто запятая отдельно с трубами! :)