2017-03-01 83 views
0

我目前正在實施與通過HTTP斯威夫特使用NSURLSession類REST API通信的網絡模型。NSURLSession數據任務的響應處理

爲了製作要求,我用這個代碼:

var request = URLRequest(url: requestURL) // url is "http://somethingsomething... 
    request.httpMethod = "POST" 
    request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.httpBody = body 

現在,我發送請求這樣:

session.dataTask(with: request) { data, response, error in 
     // Parse the data, response and error 
    }.resume() 

我的問題是,我要檢查的在httpStatusCode響應,以便通知關於可能的錯誤,但是,在完成塊內的response是類型,不HTTPURLResponse的。這意味着我必須將response轉換爲HTTPURLResponse類型。到目前爲止,我已經想到了兩種方法來處理它 - 首先是添加另一個處理「無法投射到HTTPURLResponse」場景的錯誤場景,另一種方法是將演員強制轉換爲HTTPURLResponse。第一個選項似乎更好,但它可能只是添加一些無用的代碼,因爲也許演員總是會成功?

所以基本上,我的問題是 - 我可以肯定,如果我發送請求到HTTP服務器,響應將始終是HTTPURLResponse類型?或者,我是否必須實現處理response對象具有不同類型或零位的情況的代碼?

而且,我認爲這將是很好的一提的是在我的實現,如果完成塊將返回錯誤不是零,則該流程將嘗試投放任何東西之前返回。

回答

0

我相信這是你所需要的。

session.dataTask(with: request) { data, response, error in 
    // Parse the data, response and error 
    if let httpResponse = response as? HTTPURLResponse { 
     //here it is 
     print(httpResponse.statusCode) 
    } 
}.resume() 

我從來沒有演員不知道我的知識。我不確定爲什麼URLResponse和HTTPURLResponse沒有合併到一個類中,但HTTPURLResponse是一個子類,根據我的知識,響應總是可以被轉換。

+0

在這種情況下,我仍然有未處理的情形,其中部分'如果讓類HTTPResponse =爲響應? HTTPURLResponse'失敗。我的問題是 - 如果我正在與HTTP服務器交互,我能100%確定它不會失敗嗎? – user3581248

+0

我使用每天與HTTP服務器進行交互,並且它永遠不會失敗。 – Sethmr

+0

@ user3581248 - 不,你不能保證,這將是'HTTPURLResponse',這就是爲什麼你必須'如果let'或'後衛let'安全解開它。鑑於最終用戶並不在意爲什麼它失敗了,只是它做了或不做,我在我的'if' /'guard'聲明中檢查了兩個,例如, '警衛讓httpResponse =響應爲? HTTPURLResponse,httpResponse.statusCode == 200 else {//處理錯誤}。 – Rob