2017-02-12 3 views
0

Я пытаюсь отправить что-то в API с помощью POST. Тело сообщения составлено из x 2 свойств.Почему одна версия моего сайта HTTP POST не работает?

Если я создаю тело сообщения как одну длинную строку: let postBody = "ministryId=nameOfMinistryHere&personId=1005", а затем закодировать строку следующим образом: urlRequest.httpBody = postBody.data(using: String.Encoding.utf8) работает отлично.

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

let postBody = ["ministryId":"nameOfMinistry", "personId":"1005"] 
    do { 
     try urlRequest.httpBody = JSONSerialization.data(withJSONObject: postBody, options: .prettyPrinted) 
     } catch { 
      print("problems serializing data") 
     } 

Когда я использую последний вариант, я получаю ошибку 400 с сервера.

Что мне не хватает?

Заранее спасибо.

+0

Хорошо, я добавил 'urlRequest.setValue (« application/json », forHTTPHeaderField:« Content-Type »)', и он сработал.Но я не знаю, почему? Может ли кто-нибудь объяснить? –

+0

иногда вам нужно сообщить api, что вы используете json для запроса, иначе он не знает, что делать, и бросает E400 – Florensvb

ответ

0

Просто сделайте словарь следующим образом:

let jsonBody = ["username": email, "password": password] 

Затем вы можете сделать что-то вроде этого:

let request = NSMutableURLRequest(url: NSURL(string: "YOUR URL") as URL) 
     request.httpBody = try! JSONSerialization.data(withJSONObject: jsonBody, options: .prettyPrinted) 

Надежда, что помогает!

+0

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

1

URLComponents - это класс для работы с несколькими параметрами. Фрагмент кода:

let postBody = ["ministryId":"nameOfMinistry", "personId":"1005"] 

let urlComponents = URLComponents(string: myURL) 
let urlRequest = URLRequest(url: urlComponents.url!) 

// transform the dictionary into queryItems 
urlComponents.queryItems = postBody.map { URLQueryItem(name: $0, value: $1) } 

urlRequest.httpBody = urlComponents.percentEncodedQuery?.data(using: String.Encoding.utf8) 
1

thecloud_of_unKnowing ответ на ваш комментарий, как это было давно я отправляю это здесь -:

HTTP заголовки могут быть в основном делятся на два типа: HTTP Request Header Всякий раз, когда вы набираете a URL в адресной строке и попробуйте его получить, ваш браузер отправит на сервер HTTP запрос. Запрос заголовок HTTP содержит информацию в виде текста рекордно формы, которая включает в себя сведение, такие как типа, возможности и версии браузера, который генерирует запрос, в операционной системе, используемый клиентом, страница, , различные типы выходов, принимаемых браузером, и т. д.. Заголовок HTTP-ответа После получения заголовка запроса веб-сервер отправит HTTP-ответ обратно клиенту. Ответ HTTP-ответ заголовок содержит информацию в форме текстовой записи, которую веб-сервер передает обратно в браузер клиента. Заголовок ответа содержит данные, такие как тип, дата и размер файла, отправленного сервером, а также сведения о сервере. Итак, вы просто отправляете дополнительную информацию на свой сервер, чтобы сообщить, какой запрос он примет.

Контент-тип: application/json; charset = utf-8 обозначает содержимое, которое должно быть в формате JSON, закодированное в кодировке символов UTF-8. Назначение кодировки несколько избыточно для JSON, поскольку кодировка по умолчанию (только?) Для JSON - это UTF-8. Таким образом, в этом случае получающий сервер, по-видимому, счастлив, зная, что он имеет дело с JSON и предполагает, что кодировка UTF-8 по умолчанию, поэтому она работает с заголовком или без него.