2015-12-07 4 views
5

からサーバの応答メッセージを取得します私のサーバー(CakePHPは)それほどのように応答している:エラー

$this->response->statusCode('400'); 
$this->response->type('json'); 
$this->response->body(json_encode(array('message' => 'Bookmark already exists'))); 

は、郵便配達の出力は、あなたが期待するものを次のようになります。

{「メッセージ」:「ブックマークがすでに存在しています」 }

問題は、私は障害ハンドラからこのメッセージにアクセスする方法を見つけることができないということである(Alamofire 3.1.3 + SwiftyJSON 2.3.2)

Alamofire.request(.POST... 
.validate() 
.responseJSON { response in 

switch response.result { 

case .Success(_):       
// All good 

case .Failure(let error): 
// Status code 400     
print(response.request) // original URL request 
print(response.response) // URL response 
print(response.data)  // server data 
print(response.result) 

response.dataをJSONにキャストする方法が見つからないため、単にnilを返すだけで、結果はFAILUREに戻ります。

障害ハンドラからこのサーバメッセージにアクセスする方法はありますか?

+0

はあなたに迅速なコードを追加 –

答えて

3

私は以下の行を使用して、Alamofireリクエストから応答本文を読み取りました。

Alamofire.request(.POST, serveraddress, headers: headers, encoding: .JSON) 
     .response{ request, response, data, error in 
      let responseData = String(data: data!, encoding: NSUTF8StringEncoding) 
      print(responseData) 


    } 

この本体では、カスタムサーバーレスポンスのerrormessageを取得できます。

よろしく

11

データがAlamofire 3.0 migration guideあたり.Failureの場合には解析されません。ただし、サーバーデータはresponse.dataで引き続き使用でき、解析することができます。以下は

は、手動でこれを解析するために動作するはずです:

Alamofire.request(.POST, "https://example.com/create", parameters: ["foo": "bar"]) 
    .validate() 
    .responseJSON { response in 
    switch response.result { 
    case .Success: 
     print("Validation Successful") 
    case .Failure(_): 
      var errorMessage = "General error message" 

      if let data = response.data { 
      let responseJSON = JSON(data: data) 

      if let message: String = responseJSON["message"].stringValue { 
       if !message.isEmpty { 
       errorMessage = message 
       } 
      } 
      } 

      print(errorMessage) //Contains General error message or specific. 
    } 
    } 
} 

これはNSDataのを変換するためにJSONの構造体を提供SwiftyJSONを使用しています。 SwithtyJSONを使わずにNSDataをJSONにパースすると、hereと答えられます。

別のクリーナーオプションは、Custom Response Serializerと書くこともできます。ルータなしSwiftyJSONと

+0

おかげで、本当に私の一日保存した:) –

4

方法:

Alamofire.request(APIRouter.Register(params: params)).validate().responseJSON { response in 
    switch response.result { 
     case .Success(let json): 
      let message = json["clientMessage"] as? String 
      completion(.Success(message ?? "Success")) 
     case .Failure(let error): 
      var errorString: String? 

      if let data = response.data { 
       if let json = try? NSJSONSerialization.JSONObjectWithData(data, options: []) as! [String: String] { 
        errorString = json["error"] 
       } 
      } 

      completion(.Error(errorString ?? error.localizedDescription)) 
     } 
    } 
関連する問題