2016-10-09 5 views
2

Я просто пытаюсь отправить строку JSON через Swift3 httprequest.POST w/JSON Body - 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) 
    } 
} 

я получаю:

Handle Error: Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

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

Непонятно, что делать!

ответ

3
// 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") 
    } 
+0

Я постараюсь это, спасибо за ответ :) –

+0

Хммм, я использую сервер Node.js (рамочный Хапи), и я console.log'ing в request.payload и я вижу, что я 'm pass, но он странно вложен, поэтому я не могу его разобрать ... request.payload = {' {"username": "theusername"} ':' '} ... как будто мой json вложен в одинарные кавычки , но также является ключом к некоторому следующему словарю –

+0

Мне пришлось добавить ... request.setValue («application/json», forHTTPHeaderField: «Content-Type») ... все хорошо, я благодарю вас за Помогите!!! Счастливого дня благодарения!!! :) –