2016-03-31 38 views
3

Alamofireを使用するのは初めてのことで、本当に不満です。Alamofire 3.3.0からサーバーのエラーメッセージを受け取ることができません

私は、バックエンドAPIにサインアップAPIを呼び出すために、次のコードを使用してい

Alamofire.request(.POST, "\(self.authBaseURL)/signup", parameters: params, headers: headers, encoding: .JSON) 
      .validate(statusCode: 200..<300) 
      .validate(contentType: ["application/json"]) 
      .responseJSON { response in 
       switch response.result { 
       case .Success(let JSON): 
        print("Success with JSON: \(JSON)") 
        success(updatedUser) 
       case .Failure(let error): 
        print("Request failed with error: \(error)") 
        failure(error) 
       } 

     } 

問題は、私は.Failure機能で取得していますエラーオブジェクトは、サーバー側のメッセージが含まれていないということです。 残りのオブジェクト(リクエスト、レスポンス、データ、結果)にアクセスしようとしましたどこにでもエラーメッセージが見つかりませんでした

私はいつも次のエラーメッセージを表示しています。 要求がエラーで失敗しました:

FAILURE: Error Domain=com.alamofire.error Code=-6003 "Response status code was unacceptable: 400" UserInfo={NSLocalizedFailureReason=Response status code was unacceptable: 400}

は私がやっている何か問題がありますか?

スウィフト2.2、AlamoFire 3.3.0、Xcodeの7.3

+0

、代わりに '' .responseString'を試してみて、 'プリント(応答)を行う'とあなたがする想定されていない何かを取得しているかどうかを確認.responseJSON'の。後で問題が見つかったら '.responseJSON'に戻って – Fennec

+0

すでに完了していますが、エラーは同じです。サーバーが正しいエラーメッセージを表示しています(私はAngularJSで別のクライアントを作成しました)が、まだ私はそれを取得できません。 –

+0

@JosephWahbaはあなたのオリジナルの問題を解決できましたか?つまり、エラードメイン、コード、ユーザー情報のデータを取得していますか?私は同じことをしようとしている。もしあなたが助けてくれたら、私の質問をhttp://stackoverflow.com/q/42591945/7029165でチェックできますか? – Daniel

答えて

8

私はそれがまさに私が望むように動作するように取得するために管理するステータス検証をドロップすることで、

Alamofire.request(.POST, "\(self.authBaseURL)/signup", parameters: params, headers: headers, encoding: .JSON) 
      .validate(contentType: ["application/json"]) 
      .responseJSON { response in 
       if response.response?.statusCode == 200 { 
        print("Success with JSON: \(response.result.value)") 

        success(updatedUser) 
       } 
       else { 
        let error = response.result.value as! NSDictionary 
        let errorMessage = error.objectForKey("message") as! String 
        print(errorMessage) 
        failure(errorMessage) 
       } 


     } 
を手動からstatusCodeため
+0

404ステータスコードでサーバーエラーログを取得できません。データフィールドは常にnilであり、この応答を取得しています[結果]:FAILURE:エラードメイン= NSURLErrorDomainコード= -1015 "生データをデコードできません" – rinkesh

1

updated for swift 3 :

をチェックコードの行数以下で使用

: -

Alamofire.request(escapedString!, method: .get, encoding: JSONEncoding.default) 
     .validate(contentType: ["application/json"]) 
     .responseJSON { response in 
      if response.response?.statusCode == 200 { 
       print("Success with JSON: \(String(describing: response.result.value))") 

      } 
      else { 
       let error = (response.result.value as? [[String : AnyObject]]) 
       print(error as Any) 
      } 
    } 
+0

result.valueがnilの場合はクラッシュします。通常はAlamoFire Resultです。 –

+0

@Randy Hill、 私は上記のコードを.....更新しました。 もう一度確認して問題がある場合はお知らせください。 –

+0

私はダウン投票を削除しました。なぜならそれは今やクラッシュしないからです。それは.responseJSONを使用する合理的な例です。しかし、問題はvalidate(statusCode:200 .. <300)を使用しました。これは、エラーを完全に別の方法で処理するように強制します。成功したかどうかを知らせるresponse.resultが提供され、.failureのエラーオブジェクトが直接与えられます。私の例を見てください。 –

0

これはエラードメイン、コードおよびユーザー情報wを取得する方法ですith Alamofire 4とSwift 3.ユーザー情報にはエラー文字列が含まれています。だから、

Alamofire.request(.POST, "\(self.authBaseURL)/signup", parameters: params, headers: headers, encoding: .JSON) 
      .validate(statusCode: 200..<300) 
      .validate(contentType: ["application/json"]) 
      .responseJSON { response in 
       switch response.result { 
       case .Success(let JSON): 
        print("Success with JSON: \(JSON)") 
        success(updatedUser) 
       case .Failure(let error): 
        let errorCode = error._code 
        let errorDomain = error._domain 
        let userInfo = error._userInfo 
        print("Request failed with error: \(error), code: \(errorCode), domain: \(errorDomain)") 
        failure(error) 
       } 

     } 
関連する問題