我正在创建一个客户端向服务器发出请求的应用程序。服务器使用flurl.Http。
在node.js和.NET中的客户端编写当服务器上的请求失败时,创建自定义错误消息总是有用的。像这样:
request.respond(500, { message: "targetid is mandatory" });
但是,这会在客户端调用FlurlHttpException,并且响应中的JSON信息会丢失。
如果从服务器收到不成功的响应代码,我如何收到此JSON信息?
答案 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代码中删除,现在我手动检查响应是否有成功代码。