2016-12-03 16 views
7

Sử dụng Alamofire 4/Swift 3 cách bạn có thể phân biệt giữa một yêu cầu mà không do:Alamofire: Lỗi mạng so với mã trạng thái không hợp lệ?

  1. khả năng kết nối mạng (máy chủ xuống, không thể đạt được host) vs
  2. mã phản hồi HTTP server không hợp lệ (ví dụ: 499) làm cho yêu cầu Alamofire thất bại do gọi số validate()?

Code:

sessionManager.request(url, method: .post, parameters:dict, encoding: JSONEncoding.default) 
     .validate() //Validate status code 
     .responseData { response in 

     if response.result.isFailure { 
       //??NETWORK ERROR OR INVALID SERVER RESPONSE?? 
     } 
    } 

Chúng tôi muốn để xử lý từng trường hợp khác nhau. Trong trường hợp sau chúng tôi muốn thẩm vấn câu trả lời. (Trước đây chúng tôi không như không có phản ứng).

+0

Hey Marcus, là những gì giải pháp cuối cùng của bạn cho việc này? –

Trả lời

3

Đây là giải pháp làm việc hiện tại của chúng tôi:

sessionManager.request(url, method: .post, parameters:dict, encoding: JSONEncoding.default) 
    .validate() //Validate status code 
    .responseData { response in 

    if response.result.isFailure { 
     if let error = response.result.error as? AFError, error.responseCode == 499 { 
      //INVALID SESSION RESPONSE 
     } else { 
      //NETWORK FAILURE 
     } 
    } 
} 

Nếu result.error là loại AFError bạn có thể sử dụng responseCode.Từ những ý kiến ​​AFError nguồn: (?)

/// Returns whether the `AFError` is a response validation error. When `true`, the `acceptableContentTypes`, 
/// `responseContentType`, and `responseCode` properties will contain the associated values. 
public var isResponseValidationError: Bool { 
    if case .responseValidationFailed = self { return true } 
    return false 
} 

Có thể có một cách tốt hơn nhưng điều đó dường như làm việc ...

1

tự động xác nhận nên xem xét mã trạng thái trong 200 ... 299 (mã thành công) dao động vì vậy khi bạn nhận được một hợp lệ máy chủ HTTP mã phản hồi 5xx (499 nghĩa Client Closed Request) bạn có chắc nó không phụ thuộc bằng cách xác nhận.

Giới thiệu về statusCode, lời khuyên của tôi là tuân thủ các quy tắc mới chính xác để có được nó. Nếu bạn có một số vấn đề để lấy nó, hãy xem SO answer này.

Nói về reachability mạng mà bạn có thể viết:

let manager = NetworkReachabilityManager(host: "www.apple.com") 
manager?.listener = { status in 
    print("Network Status Changed: \(status)") 
} 
manager?.startListening() 

Có một số điều quan trọng cần nhớ khi sử dụng reachability mạng để xác định những việc cần làm tiếp theo.

  • KHÔNG sử dụng Khả năng hiển thị để xác định xem yêu cầu mạng có phải là được gửi hay không. Bạn nên luôn luôn gửi nó.
  • Khi khả năng hiển thị được khôi phục, hãy sử dụng sự kiện để thử lại mạng không thành công yêu cầu. Mặc dù các yêu cầu mạng vẫn có thể không thành công, đây là thời điểm tốt để thử lại chúng.
  • Trạng thái khả năng hiển thị mạng có thể hữu ích để xác định lý do yêu cầu mạng có thể không thành công. Nếu yêu cầu mạng không thành công, đó là hữu ích hơn để cho người dùng biết rằng yêu cầu mạng không thành công do đang ngoại tuyến thay vì lỗi kỹ thuật hơn, chẳng hạn như "yêu cầu hết thời gian".

Bạn có thể tìm thấy những thông tin chi tiết cũng như trong chính thức Alamofire 4 GitHub page

1

Alamofire có thể cho bạn biết về tình trạng của các yêu cầu, mã này chỉ hoạt động tốt đối với tôi:

if let error = response.result.error as? NSError { 
    print(error)//print the error description 
    if (error.code == -1009){ 
        print(error.code) // this will print -1009,somehow it means , there is no internet connection 
        self.errorCode = error.code 

    } 
     //check for other error.code  

}else{ 
    //there is no problem 
} 

error.code sẽ cho bạn biết vấn đề là gì

Các vấn đề liên quan