2017-05-03 15 views
0

私はSwiftの投稿要求を使ってWebサービスからの応答を得ようとしています。しかし、私は "正しい形式でないため、データを読み込めません"というエラーが出ます。Swift 3.0のPOST要求

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() 

私も、私は、コード3840、文字3. 周りの無効な応答を取得しています。しかし、私は適切な応答を取得していますこれらのライブラリからAlamofire、ネットワークなどのようなサードパーティのライブラリを使用しました。次はコードですObjective-Cコードを使用するか、Postman Softwareを使用します。 誰かが私を助けてくれますか? ありがとう

+0

alamofireを試しましたか? –

+0

返信する応答が有効なJSON形式でない可能性があります。シリアル化しようとする前に応答を印刷してみてください。それは良いスタートになるだろう。 – Malik

+0

あなたの回答を追加してください。 Postmanは独自のレベルで多くの問題を解決します。したがって、Postmanで働くapiがアプリで動作する必要はありません。 – Priyal

答えて

3

以下は、paramsを使用したAlamofire POST apiの呼び出しの例です。 content-typeヘッダを受け取り、これを試してください。

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

これを使用して応答を得ました。ちょうど1つの修正は、私はアピナミの後にスラッハ(/)を取り除いた。スラッシュを使用するとapi呼び出しが失敗しました。 –

+0

なぜ「認証」キーが「HTTPヘッダー」にあるのか分かりますか?私は自分のコードにそれを含めなかった。 –

+0

スラッシュの必要性は、Web APIの実装に依存します。Authorizationヘッダーと同じですが、すべてのAPI呼び出しで強制的に送信されるキーです。基本的にサーバーのapi設定。それはあなたのために働いてうれしい! – 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

Swiftで 'NSString'と' NSDictionary'を使わないでください。あなたのニックネームによれば、それを知るべきです。 – vadian

+0

サードパーティ製のパッケージを使用していない場合は、1をプラスします。 –