处理RestSharp错误响应的正确策略是什么?

时间:2015-12-26 20:42:02

标签: c# http exception error-handling restsharp

使用RestSharp的典型http调用如下所示:

var client = new RestClient("http://exampleapi.com");
var request = new RestRequest("someapi", Method.GET);
IRestResponse response = client.Execute(request);

来自https://github.com/restsharp/RestSharp/wiki/Getting-Started的文档:

  

如果存在网络传输错误(网络中断,DNS查找失败等),则RestResponse.Status将设置为ResponseStatus.Error,否则将为ResponseStatus.Completed。如果API返回404,则ResponseStatus仍将完成。如果您需要访问返回的HTTP状态代码,您可以在RestResponse.StatusCode中找到它。

此外,以下似乎是RestSharp响应的行为:

  • RestClient.Execute()永远不会抛出异常
  • 如果网络请求失败,即发生通常会导致异常的条件(例如网络超时,无法访问,名称无法解析),那么response.ErrorException将是填充了一些Exception派生类型,response.ErrorMessage将包含一些消息错误字符串,response.StatusCode将设置为ResponseStatus.ErrorResponse.Status.AbortedResponseStatus.TimedOut等。< / LI>
  • 如果网络请求成功但有一些HTTP错误(例如404找不到,500服务器错误等),则response.StatusCode将设置为NotFound等,Response.ErrorException Response.Errornullresponse.StatusCode将设置为'ResponseStatus.Completed`。

我可能错过了一些可能的回应,但我认为要点就在那里。

鉴于此,我应该如何确定响应的成功或失败?选项包括:

  • 如果ErrorException == null,请检查http响应
  • 如果response.ResponseStatus == ResponseStatus.Completed然后检查Response.StatusCode并根据结果获取响应数据并相应处理(如果不是您期望的话)
  • 如果http响应有些错误,那么根据错误检查的类型ErrorException
  • 更多...?

我不想过分反思这一点,但我认为有一种模式(缺乏更好的术语)可以干净利落地处理。

2 个答案:

答案 0 :(得分:2)

  

鉴于此,我应该如何确定响应是否成功?

我建议检查((int) response.StatusCode)。如果200 <= ((int) response.StatusCode) && ((int) response.StatusCode) < 400,它成功了(对于成功的故意模糊定义)。否则,状态代码要么在此范围之外,要么response.ErrorException有一些有趣的东西。

如果您希望获得特定的状态代码,则可能希望采取措施,如果它是其他一些非错误代码。例如,如果我只期望200个响应,我可能希望将301响应记录为警告,但继续。

有关略有不同的方法,请参阅this answer

答案 1 :(得分:1)

我认为响应代码是HttpStatusCode的类型。所以你可以得到如下代码。之后你就知道如何处理它了。

RestResponse response = client.Execute(request);
HttpStatusCode statusCode = response.StatusCode;
int numericStatusCode = (int)statusCode;