СООБЩЕНИЕ с телом в формате JSON — Swift3 — фрагменты?

#ios #json #post #httprequest #swift3

#iOS #json #Публикация #httprequest #swift3

Вопрос:

Я просто пытаюсь отправить строку JSON через httprequest Swift3.

Пробовал использовать словарь и экранированную строку…

 func getToken(successHandler: @escaping (Any) -> Void, errorHandler: @escaping (Any) -> Void) {

    var request = URLRequest(url: URL(string: "http://my-api.domain.com/getToken")!)

    request.httpMethod = "POST"

    request.setValue("application/json", forHTTPHeaderField: "Content-Type")

    do
    {
        // try with Dictionary
        let bodyJson: [String: String] = [
            "username": "theusername"
        ]
        let bodyJsonData = try JSONSerialization.data(withJSONObject: bodyJson, options: [])

        // try with escaped String
        let jsonString = "{"  
            ""username": "theusername","  
        "}"
        let jsonStringData = jsonString.data(using: String.Encoding.utf8)


        //request.httpBody = bodyJsonData
        request.httpBody = jsonStringData


        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard error == nil else {
                print(error)
                errorHandler(error)
                return
            }
            guard let data = data else {
                print("Data is empty")
                errorHandler("Data is empty")
                return
            }

            var json: Any? = nil
            do
            {
                json = try JSONSerialization.jsonObject(with: data, options: [])

                DispatchQueue.main.asyncAfter(deadline: .now()) {
                    successHandler(json)
                }
            }
            catch let error as NSError {
                errorHandler(error)
            }
        }

        task.resume()
    }
    catch
    {
        errorHandler(error)
    }
}
  

Я продолжаю получать:

Обработайте ошибку: Ошибка домена = NSCocoaErrorDomain Code = 3840 «Текст JSON не начинался с массива или объекта, и опция, позволяющая не устанавливать фрагменты». userInfo={NSDebugDescription=Текст в формате JSON не начинался с массива или объекта, и опция, позволяющая не устанавливать фрагменты. }

Я не могу найти, как попробовать разрешить фрагменты, все примеры / учебные пособия предназначены для Swift2.x :/

Не уверен, что делать!

Ответ №1:

 // prepare json data
  let mapDict = [ "1":"First", "2":"Second"]

  let json = [ "title":"ABC" , "dict": mapDict ] as [String : Any]

  do {
     let jsonData = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)

     // create post request
     let endpoint: String = "https://yourAPI"
     let session = URLSession.shared
     let url = NSURL(string: endpoint)!
     let request = NSMutableURLRequest(url: url as URL)
     request.httpMethod = "POST"

     // insert json data to the request
     request.httpBody = jsonData


     let task = session.dataTask(with: request as URLRequest){ data,response,error in
        if error != nil{
           print(error?.localizedDescription)
           return
        }
     }
     task.resume()
  } catch {
     print("bad things happened")
  }
  

Комментарии:

1. Хммм, я использую узел. Сервер JS (платформа Hapi) и консоль am. регистрирую request.payload, и я вижу, что я передаю, но оно странно вложено, поэтому я не могу его разобрать… запрос.полезная нагрузка = { ‘ {«имя пользователя»: «имя_пользователя»} ‘: ‘ ‘ } … как будто мой json вложен в одинарные кавычки, но также является ключом к какому-то следующему словарю

2. Мне пришлось добавить … запрос.setValue(«application / json», для httpheaderfield: «Content-Type») … все хорошо, я очень благодарен вам за помощь!!! С Днем благодарения !!! 🙂

3. это все еще происходит, если вы заменили options: .prettyPrinted на options: []

4. Во время моей отладки одной из первых вещей, которые я сделал, было удаление .prettyPrinted для [] … как я видел n в моем запросе.полезная нагрузка… итак, ДА, это ответ на ваш вопрос… Я буду тестировать прямо сейчас с помощью .prettyPrinted … загрузка … оба работают… однако необходим набор заголовков… Я не эксперт по серверу / api, но есть ли способ для сервера ожидать json? Потому что забывание установить application / json является для меня распространенной проблемой: S