Một cuộc gọi http điển hình sử dụng RestSharp trông như sau:Chiến lược thích hợp để xử lý phản hồi lỗi từ RestSharp là gì?
var client = new RestClient("http://exampleapi.com");
var request = new RestRequest("someapi", Method.GET);
IRestResponse response = client.Execute(request);
Từ tài liệu tại https://github.com/restsharp/RestSharp/wiki/Getting-Started:
Nếu có một lỗi giao thông mạng (mạng bị ngắt, không tra cứu DNS, vv), RestResponse.Status sẽ được đặt thành ResponseStatus.Error, nếu không nó sẽ là ResponseStatus.Completed. Nếu một API trả về 404, ResponseStatus sẽ vẫn được hoàn thành. Nếu bạn cần truy cập vào mã trạng thái HTTP, bạn sẽ tìm thấy nó tại RestResponse.StatusCode.
Hơn nữa, sau đây dường như hành vi của phản ứng RestSharp:
- RestClient.Execute() sẽ không bao giờ ném một ngoại lệ
- Nếu yêu cầu mạng thất bại, tức là một điều kiện xảy ra mà có thể thường dẫn đến một ngoại lệ (ví dụ: mạng đã hết thời gian, không thể truy cập được, không thể giải quyết được), sau đó
response.ErrorException
sẽ được điền bằng một số loại có nguồn gốc ngoại lệ vàresponse.ErrorMessage
sẽ chứa một số chuỗi lỗi tin nhắn vàresponse.StatusCode
sẽ được đặt thànhResponseStatus.Error
,Response.Status.Aborted
,ResponseStatus.TimedOut
vv - Nếu yêu cầu mạng thành công nhưng có một số lỗi HTTP (ví dụ như 404 không tìm thấy, 500 lỗi máy chủ, vv), sau đó
response.StatusCode
sẽ được thiết lập đểNotFound
, vv,Response.ErrorException
vàResponse.Error
sẽnull
vàresponse.StatusCode
sẽ được đặt thành 'ResponseStatus.Completed`.
Tôi có thể đã bỏ lỡ một số phản hồi có thể có, nhưng tôi nghĩ ý chính là ở đó.
Với điều này, làm cách nào để xác định phản hồi thành công hay thất bại? Tùy chọn bao gồm:
- Nếu
ErrorException == null
sau đó kiểm tra phản ứng http - Nếu
response.ResponseStatus == ResponseStatus.Completed
sau đó kiểm tra Response.StatusCode và tùy thuộc vào kết quả, lấy các dữ liệu phản ứng và xử lý phù hợp nếu không phải những gì bạn mong đợi - Nếu http phản hồi là một số lỗi sau đó tùy thuộc vào loại lỗi kiểm tra
ErrorException
- Khác ...?
Tôi không muốn lật đổ điều này nhưng tôi giả sử có một mẫu (vì thiếu thuật ngữ tốt hơn) để xử lý việc này một cách rõ ràng.