2016-06-16 1 views
0

すぐにポストパラメータを使って非同期呼び出しを行うために多くのことを研究しましたが、結局私は成功しましたが、 json parse関数は応答データを解析できず、jsonオブジェクトの代わりにnilを返すので、エラーをスローします。POST paramsを使ってこの非同期呼び出しを呼び出すと、何が返されないのですか?

私はブレークポイントを設定して変数をチェックしましたが、値は問題なく、非同期呼び出しは成功したようですが、戻りデータにはPHPエラーがあります。私は同じ呼び出しをシミュレートしたので、同じparamsとurlの形式はhulr.it です。戻り値はjsonトークンで、それ以外は何もありません。

これは、返されたデータである。 enter image description here

そして、この:

enter image description here

これは、詳細には、ユーザが登録されている証明としてトークンを使用してデータを返され、コールがOKです私の非同期呼び出しのコードです:

 private func callWithCompletionHandler(completed : completionAsyncCall){ 
     asyncJson.removeAllObjects() 

     //Set async call params 
     let request = NSMutableURLRequest(URL: NSURL(string: self.url!)!) 
     request.HTTPMethod = "POST" 
     let trimmedPostParam : String = self.paramString!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) 

     request.HTTPBody = trimmedPostParam.dataUsingEncoding(NSUTF8StringEncoding) 

     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
      guard error == nil && data != nil else { 
       // check for fundamental networking error 
       print("error=\(error)") 
       return 
      } 
      if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 { 
       // check for http errors 
       print("statusCode should be 200, but is \(httpStatus.statusCode)") 
       print("response = \(response)") 
      } 

      let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 

//   asyncJson = responseString!.parseJSONString! as! NSMutableArray 

      let result : AnyObject = responseString!.parseJSONString! 

       if let nsMutableResult = result as? NSMutableArray{ 
        print("NSMutableArray") 
       } 
       if let nsDictResult = result as? NSMutableDictionary{ 
        self.parseMutableDictionary(nsDictResult) 
       } 


      self.flag = true // true if download succeed,false otherwise 
      completed(success: flagAsyncCall!) 
     } 
     task.resume() 
    } 

順番。誰も私がここで間違っていることを知っていますか?

+0

phpに41行目にエラーがあるようです。last_nameの値を指定するはずでしたか? – Paulw11

+0

41行目にphpコードにエラーがある場合、hurl.itから同じ呼び出しを行ったときにエラーが表示されないのはなぜですか? – user3033437

+0

異なる入力を提供していますか? – Paulw11

答えて

1

私は真剣に自分のネットワークコードを使用しないことをお勧めします。醜いですし、愚かなエラーになりやすいです。代わりにAlamofireを使用してください。返されたエラーはサーバエラーです(エラーbtwの場合はサービスがfreakin 'htmlを返すべきではありません。これは失敗の理由またはこれに似たものを返します)。また、POST本体としてJSONを使用している場合は、次のように送信してください:

let parameter: NSDictionary = ["firstParam": firstValue, "secondParam": secondValue] 
let dataContainer = try! NSJSONSerialization.dataWithJSONObject(parameter, options: NSJSONWritingOptions()) 

request.HTTPBody = dataContainer 

トリミングされた文字列ではありません。

+0

このコードで私は500のhttpエラーを受け取ります – user3033437

+0

これは内部サーバーエラーです、サービスは本体プロトコルにJSONを使用していますか?また、ヘッダーを確認してください。コンテンツタイプとしてApplication/JSONを使用していますか? – FruitAddict

+0

Acceptヘッダーがリクエストで明示的に指定されている場合でも、サーバはコンテンツタイプを返す可能性があることに注意してください(例えば、 'application/json')。したがって、エラーが発生したときにHTMLを送信することは、サーバーの動作が間違っていることではありません。あなたのサンプルでは、​​コンテンツヘッダを指定しなかったので、サーバはコンテンツが 'application/octet-stream'型であると想定するか、それを理解しようとします。 JSONの場合、それは悲惨に失敗する可能性があります。したがって、コンテンツヘッダを 'application/json'に設定してください。あなたの最初の文も見てください;) – CouchDeveloper

関連する問題