2017-10-13 61 views
0
Alamofire.request(URL, method: Endpoints.login.method, parameters: parameters, encoding: JSONEncoding.default, headers: nil) 
      .validate() 
      .responseObject { [weak self] (response: DataResponse<User>) in 
       switch response.result { 
       case .success(let user): 
        cb(.success(user)) 
       case .failure(let error): 
        log.error(error) 
        cb(.failure(error)) 
       } 
     } 

如果輸入錯誤的密碼,那麼我無法打印api發送給我的確切錯誤消息。Alamofire/AlamofireObjectMapper - 如何從responseObject打印錯誤json?

po error.localizedDescription 

我總是從alamofire獲得默認消息,即「Response status code was unacceptable: 401.」。它應該打印動態錯誤消息,如Invalid username and password

順便說一句,我可以使用responseJson打印使用

.responseJSON { response in 
       if response.response?.statusCode == 200 { 
        print("Success with JSON: \(response.result.value)") 
       } 
       else { 
        let error = response.result.value as! NSDictionary 
        let errorMessage = error.object(forKey: "message") as! String 
        print(errorMessage) 
       } 

動態出錯,但我應該怎麼做相同的responseObject

更新1 -

參數

let parameters = [ 
      "username": userName, 
      "password": password 
     ] 

響應

Login Response: { 
    error =  { 
    }; 
    message = "401 - {\"success\":false,\"message\":\"Invalid user/pass\"}"; 
} 
+0

你能告訴我們你的API的反應嗎?與標題一樣,導致一些API開發者喜歡將錯誤放在標題響應中。 – Glenn

+0

@Glenn - 標題爲零。我用參數和api響應更新了我的問題。所以,如果我刪除.validate(),那麼它會去成功的情況下,我可以看到response.result.value中的錯誤響應。但是,如果我添加.validate()然後它轉到預期的失敗情況,但然後我不能打印由服務器發送的錯誤響應。 – Tariq

+0

@Tariq嘿,我添加了一個答案,這應該會幫助你在哪裏尋找錯誤反應,我也有一個類似的問題,我自己以及使用Alamofire時,這就是我如何解決這個問題 –

回答

2

爲什麼你越來越Response status code was unacceptable: 401.的原因是因爲.validate()方法被稱爲磨片ñ呼叫請求,這是檢查響應代碼,應該在200 ... 299的可接受範圍內(根據Alamofire文檔)

任何超出該範圍的迴應會說狀態代碼是不可接受的,但它不扔掉無論是從服務器發送,它坐鎮內線:

response.data 

,你必須做你自己解碼:

let json = try? JSONSerialization.jsonObject(with: data, options: []) 

,將返回你的Any值或扔一個exc eption,看看這個蘋果博客文章的更多信息:https://developer.apple.com/swift/blog/?id=37