获取响应头

7

使用Flurl从API获取响应。

var response = await url.WithClient(fc)
            .WithHeader("Authorization", requestDto.ApiKey)
            .GetJsonAsync<T>();
dynamic httpResponse = response.Result;

但我无法访问 httpResponse.Headers。

在使用 GetJsonAsync 时如何访问响应头。


你在所有情况下都关心头信息吗,还是只关心错误响应,比如403?如果是后者,Flurl有一个方便的try/catch模式,在不放弃GetJsonAsync的情况下可以获取响应头。 - Todd Menier
2个回答

8

由于GetJsonAsync<T>返回的是Task<T>而不是原始响应,因此无法从中获取标题。您可以调用GetAsync方法并在下一步反序列化有效载荷:

HttpResponseMessage response = await url.GetAsync();

HttpResponseHeaders headers = response.Headers;

FooPayload payload = await response.ReadFromJsonAsync<FooPayload>();

ReadFromJsonAsync 是一个扩展方法:

public static async Task<TBody> ReadFromJsonAsync<TBody>(this HttpResponseMessage response)
{
    if (response.Content == null) return default(TBody);

    string content = await response.Content.ReadAsStringAsync();

    return JsonConvert.DeserializeObject<TBody>(content);
}

附言:这就是为什么我更喜欢并推荐使用原始HttpClient,而不是任何第三方高级客户端,例如RestSharp或Flurl。


或者,你可以直接阅读你选择的第三方库的文档 ;) - Jamiec
@Jamiec,你知道有哪些好的第三方HTTP客户端库吗?RestSharp已经被放弃了,而Flurl则强制使用HttpResponseMessage进行低级操作。我真的看不出Flurl相比于HttpClient有什么优势。 - Ilya Chumakov
我刚刚为自己编写了一个程序。它的模型有点像flurl(具有流畅的接口,主要是作为扩展构建),因为像你一样,我通常不喜欢使用第三方库来完成这个简单的任务 - 但我以稍微不同的方式执行相同的操作,所以将其封装起来是有意义的。 - Jamiec
4
@IlyaChumakov所描述的Flurl的缺点(“强制您使用HttpResponseMessage进行低级操作”)实际上是要成为优势。 Flurl的主要目标很简单:在最常见的95%情况下节省击键次数。对于其他5%,使底层的HttpClient API易于访问(正如您在此处所示),以便您永远不会被卡住。(是的,我完全是根据自己的想法创造了这些数字。 :) - Todd Menier

4
您也可以等待 HttpResponseMessage,获取 .Headers 对象,然后将完成的 task 发送到 ReceiveJson<T> 进行反序列化。以下是不使用扩展方法的方法:
var task = url.GetAsync();

HttpResponseMessage response = await task;

HttpResponseHeaders headers = response.Headers;

//Get what I need now from headers, .ReceiveJson<T>() will dispose
//response object above.

T obj = await task.ReceiveJson<T>();

这是最透明的方式,等待即将到来的3.0版本的更改。 - Larry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接