2015-06-18 60 views
2

我使用Alamofire從我的服務器上獲取數據。但是,它不捕獲錯誤,因爲返回的錯誤是nil。我已經使用AFNetworking進行測試,並且工作正常。對於這兩種操作,返回的狀態代碼是401 Unauthorized。是否有我的代碼的東西?Alamofire不趕錯誤

我使用GrapeAPI我的後端。它所做的只是對失敗的請求返回錯誤

GrapeAPI

error!('Unauthorized', 401) 

AFNetworking

manager.GET("someUrl", parameters: nil, success: { (_, object) in 

     }, failure: { (operation, error) in 
      // These are the outputs. I'm not assigning any values 
      // error.localizedDescription = "Request failed: unauthorized (401)" 
      // statusCode = 401 
     }) 

Alamofire

Alamofire.request(.GET, "url", parameters: nil) 
     .response { (a,b,data,error) in 
     // These are the outputs. I'm not assigning any values 
     // error = nil 
     // data = {"error":"Unauthorized"} 
     // statusCode = 401 
     } 

我可以使用statusCode檢查失敗。但我更喜歡檢查錯誤對象。然而,由於錯誤是在Alamofire nil,這是相當混亂,以檢查該請求是否已出現故障。

+1

您需要顯式調用'.validate()'您的來電'.response前()' – mattt

+0

@mattt工程。爲什麼Alamofire被設計爲默認行爲,並且AFNetworking不是? – Azuan

+0

是的,在這種情況下顯式選擇更好。 – mattt

回答

2

馬特在註釋中提到,我需要調用.response()之前添加.validate()。這是設計。最終的代碼如下:

Alamofire.request(.GET, "url", parameters: nil) 
    .validate() 
    .response { (a,b,data,error) in 
    // error won't be nil now 
    // and statusCode will be 401 
    } 

閱讀this detailed explanation(謝謝!)瞭解更多信息。

0

Alamofire沒有看到401 Unauthorized爲一個錯誤,因爲它是一個有效的回報。在您的評論的代碼你分配一個值誤差不檢查它的錯誤,它應該是:

Alamofire.request(.GET, "url", parameters: nil) 
     .response { (a,b,data,error) in 
     if error != nil{ 
      println(error.localizedDescription) 
     } else { 
      if let data = data{ 
       //You should probably use a switch statement here 
       if data.statusCode == 401 { 
        println("Unauthorized") 
       } else if data.statusCode == 200 { 
        println("Success") 
       } 
      } 
     } 

我不知道如果我正確理解你的問題,但我希望幫助!

+0

更新了我的代碼。這些是輸出值。我沒有給任何變量賦值:) – Azuan