2017-05-03 4 views
0

J'essaie d'obtenir une réponse d'un service web en utilisant une demande de publication dans Swift. Mais je reçois l'erreur "Les données ne peuvent pas être lues car elles ne sont pas dans le bon format". Voici le code:Demande POST dans Swift 3.0

let dict = ["UserName": "2222211111", 
         "Password": "123456", 
         "AppName": "xyz"] 
       as [String: Any] 

      //create the session object 
      let session = URLSession.shared 
      let url = "someurl.svc/somefunction" 

      //now create the URLRequest object using the url object 
      var request = URLRequest(url: url) 
      request.httpMethod = "POST" //set http method as POST 

      do { 
       request.httpBody = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) 

      } catch let error { 
       print(error.localizedDescription) 
      } 

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

      //create dataTask using the session object to send data to the server 
      let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in 

       guard error == nil else { 
        return 
       } 

       guard let data = data else { 
        return 
       } 

       do { 
        //create json object from data 
        if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { 
         print(json) 
        } 

       } catch let error { 
        print(error.localizedDescription) 
       } 
      }) 
      task.resume() 

J'ai même utilisé les bibliothèques de tiers comme Alamofire, en réseau, etc. De ces bibliothèques que je reçois le code 3840, réponse invalide autour de caractère 3. Mais j'obtenir une réponse correcte en utilisant le code Objective-C ou en utilisant le logiciel Postman. Quelqu'un peut-il m'aider s'il vous plaît ici. Merci

+0

avez-vous essayé alamofire? –

+0

La réponse que vous obtenez n'est peut-être pas dans un format JSON valide. Essayez d'imprimer la réponse avant d'essayer de la sérialiser. Ce serait un bon début. – Malik

+0

ajoutez quelle réponse vous obtenez. Postman résout de nombreux problèmes à son propre niveau, il n'est donc pas nécessaire que l'API travaillant sur Postman fonctionne sur l'application. – Priyal

Répondre

3

Ci-dessous exemple de Alamofire POST appel api avec params; Content-type et accepter les en-têtes, essayez ceci.

func performPOSTLogin() -> Void { 
     var parameters = [String:String]() 
     parameters["email"] = "[email protected]" 
     parameters["password"] = "abcd1234" 

     let headers: HTTPHeaders = ["Authorization": "sxfsdfsdfsfsfsf", "Accept": "application/json", "Content-Type" :"application/json"] 

     Alamofire.request("http://domainname/folder/folder/folder/apiname/", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON { response in 

      // original URL request 
      print("Request is :",response.request!) 

      // HTTP URL response --> header and status code 
      print("Response received is :",response.response!) 

      // server data : example 267 bytes 
      print("Response data is :",response.data!) 

      // result of response serialization : SUCCESS/FAILURE 
      print("Response result is :",response.result) 

      debugPrint("Debug Print :", response) 
     } 
    } 
+0

J'ai obtenu la réponse en utilisant ceci. Juste une correction ici j'ai enlevé le slach (/) après apiname. L'utilisation de barre oblique entraînait l'échec de l'appel api. –

+0

Puis-je savoir pourquoi la clé "Authorization" existe dans "HTTPHeaders". Je ne l'ai pas inclus dans mon code. –

+0

Slash besoin dépend de la mise en œuvre web api, même pour l'en-tête d'autorisation, il était une clé ce qui doit être obligatoirement envoyé dans tous les appels api. Fondamentalement, la configuration de l'API du serveur. Content que ça a marché pour vous! – Priyal

1
func postData(_ params : Dictionary<String, String>?,contenturl:String,postCompleted : @escaping (_ jsonDict:NSDictionary, _ msg: NSInteger) ->()) { 
    let url = URL(string: contenturl) 
    var request = URLRequest(url: url!) 
    let session = URLSession.shared 
    request.httpMethod = "POST" 
    if(params != nil){ 
     request.httpBody = self.getParam(params! as NSDictionary).data(using: String.Encoding.utf8.rawValue) 
    } 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 

    let task = session.dataTask(with: request, completionHandler: {data, response, error -> Void in 
     if(data == nil){ 
      // do something 
     }else{ 
      _ = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
      do{ 
       let json = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as? NSDictionary 
       if let parseJSON = json { 
        postCompleted(parseJSON, (parseJSON["response_code"] as? NSInteger)!) 
       } 
      }catch{ 
       print("Failure") 
      } 
     } 
    }) 
    task.resume() 
} 

func getParam(_ params: NSDictionary) -> NSString{ 
    var passparam : NSString! 
    do { 
     let jsonData = try JSONSerialization.data(withJSONObject: params, options: JSONSerialization.WritingOptions.prettyPrinted) 
     // here "jsonData" is the dictionary encoded in JSON data 
     let theJSONText = NSString(data: jsonData, 
            encoding: String.Encoding.ascii.rawValue) 
     passparam = theJSONText! 
    } catch let error as NSError { 
     print("getParam() \(error)") 
     passparam = "" 
    } 
    print("getParam() \(passparam!)") 
    return passparam 
} 
+3

N'utilisez pas 'NSString' et' NSDictionary' dans Swift. D'après ton surnom, tu devrais le savoir. – vadian

+0

Plus 1 pour ne pas utiliser un package tiers, en particulier. –