Запрос SendGrid API в Swift с помощью URLSession - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь отправить запрос в API SendGrid, используя Swift 4 и URLSession.Я надеюсь не включать сторонние зависимости, так как это единственное место в моем приложении, где я использую JSON и HTTP-запрос.

Поскольку в SendGrid нет примеров Swift, я смотрю например cURL:

curl --request POST \
--url https://api.sendgrid.com/v3/mail/send \
--header "Authorization: Bearer $SENDGRID_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"personalizations": [{"to": [{"email": "test@example.com"}]}],"from": {"email": "test@example.com"},"subject": "Sending with SendGrid is Fun","content": [{"type": "text/plain", "value": "and easy to do anywhere, even with cURL"}]}'

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

let sendGridURL = "https://api.sendgrid.com/v3/mail/send"

var request = URLRequest(url: URL(string: sendGridURL)!)
request.httpMethod = "POST"

//Headers
request.addValue("Bearer \(sendGridAPIKey)", forHTTPHeaderField: "Authorization")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

//Data
let json = [
    "personalizations":[
    "to": ["email":"test@example.com"],
    "from": ["email":"test@example.com"],
    "subject": "Sending with SendGrid is Fun",
    "content":["type":"text/plain", "value":"and easy to do anywhere, even with Swift"]
    ]
]

let data = try! JSONSerialization.data(withJSONObject: json, options: [])
let ready = try! JSONEncoder().encode(data) <-- !!! Crash !!!

request.httpBody = ready

Кто-нибудь извлек эту же вещь из приложения Swift, которое может мне помочь?

Обновление

Длялюбому, кто пытается сделать то же самое, я должен был настроить свой JSON, чтобы он выглядел так, чтобы он был правильно отформатирован для SendGrid:

let json:[String:Any] = [
    "personalizations":[["to": [["email":"test@example.com"]]]],
      "from": ["email":"test@example.com"],
      "subject": "Sending with SendGrid is Fun",
      "content":[["type":"text/plain", "value":"and easy to do anywhere, even with Swift"]]
  ]

1 Ответ

0 голосов
/ 10 июня 2018

Нет необходимости дважды кодировать данные JSON.Удалите эту строку

let ready = try! JSONEncoder().encode(data) // <-- !!! Crash !!!

и просто сделайте

do {
  let data = try JSONSerialization.data(withJSONObject: json, options: [])
  request.httpBody = data
} catch {
   print("\(error)")
}

Кроме того, не используйте try!, если вы можете избежать этого.

...