Flurl.Http自定义错误

时间:2014-12-29 09:24:23

标签: .net json node.js http flurl

我正在创建一个客户端向服务器发出请求的应用程序。服务器使用flurl.Http。

在node.js和.NET中的客户端编写

当服务器上的请求失败时,创建自定义错误消息总是有用的。像这样:

request.respond(500, { message: "targetid is mandatory" });

但是,这会在客户端调用FlurlHttpException,并且响应中的JSON信息会丢失。

如果从服务器收到不成功的响应代码,我如何收到此JSON信息?

3 个答案:

答案 0 :(得分:13)

由于Flurl专注于在尽可能少的击键中从URL到反序列化的响应主体,它经常被问及如何处理错误响应,其中身体几乎总是采取与成功不同的形状那些。这就是Flurl defaults投掷非2XX响应的原因,因此您可以处理这样的错误响应:

try {
    var t = await "http://api.com".GetJsonAsync<T>();
}
catch (FlurlHttpException ex) {
    var error = await ex.GetResponseJsonAsync<TError>();
}

有一些变化:

ex.GetResponseStringAsync();
ex.GetResponseJsonAsync(); // returns a dynamic

答案 1 :(得分:1)

我认为将所有http错误视为异常很有意思。不确定是否是最佳做法,但我试了一下。

我做的是这样的事情:

public static async Task<User> LoginWithEmail (string email, string password){
  try{
    return await "http://myapi.com/login"
                 .AppendPathSegment ("login")
                 .SetQueryParams (new {email = email, password = password})
                 .WithHeader ("Accept", "application/json")
                 .GetJsonAsync<User> ();
  }catch (FlurlHttpException e) {
    return await e.Call.Response.Content.ReadAsStringAsync ()
                  .ContinueWith<User> ((contentAsync) => {
                       throw new MyApiException(JsonConvert.DeserializeObject<MyApiError> (contentAsync.Result)); });
  }
}

这使您可以处理成功和错误情况,如下所示:

async void FakeLogin()
{
  try{
       User user = await LoginWithEmail ("fakeEmail@me.com", "fakePassword");
  }
  catch(MyApiException e) {
       MyApiError = e.Error;
  }
}

<强>基本上

对于FlurlHttpException情况,我对ReadAsStringAsync进行了延续,其中我声明了继续返回User,但在continuation中我总是抛出异常。

<强>另外

您可以将异常处理重构为:

catch (FlurlHttpException e) {
    return await MyApiException.FromFlurlException<User>(e);
}

答案 2 :(得分:0)

我通过编辑Flurl的源代码解决了这个问题。 在文件FlurlMessageHandler.cs中,您将找到检查是否发生错误的方法IsErrorCondition。每当响应没有代码2xx时,这被视为错误,这部分我从te代码中删除,现在我手动检查响应是否有成功代码。