当使用httpClient.GetAsync时添加头信息。

21 浏览
0 Comments

当使用httpClient.GetAsync时添加头信息。

我正在使用Apiary.io开发的API,在Windows Store应用程序项目中进行实现。他们展示了一个我需要实现的方法的示例:

var baseAddress = new Uri("https://private-a8014-xxxxxx.apiary-mock.com/");

using (var httpClient = new HttpClient{ BaseAddress = baseAddress })

{

using (var response = await httpClient.GetAsync("user/list{?organizationId}"))

{

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

}

}

在这个方法和其他一些方法中,我需要使用之前获取的令牌来添加一个头部。以下是一个使用Postman(Chrome扩展)的截图,显示了我所说的头部:

enter image description here

如何在请求中添加Authorization头部?

0
0 Comments

在使用httpClient.GetAsync时添加头文件的原因是为了在请求中添加Accept headers。然而,当尝试添加Accept headers时,可能会变得复杂。下面是我找到的一个解决方法,我认为这个方法更简单,所以我以后会坚持使用它:

client.DefaultRequestHeaders.Add("Accept", "application/*+xml;version=5.1");
client.DefaultRequestHeaders.Add("Authorization", "Basic " + authstring);

但是当我再次调用API时,我遇到了一个错误,错误信息为“Cannot add value because header 'Authorization' does not support multiple values.”。如果您要重用相同的client,在尝试添加之前,请先检查是否存在该header。

if (!client.DefaultRequestHeaders.Contains("Authorization")) {
    client.DefaultRequestHeaders.Add("Authorization", "Basic " + authstring);
}

以上是关于使用httpClient.GetAsync时添加头文件的问题的原因和解决方法。

0
0 Comments

当使用HttpClient的GetAsync方法时,可以像下面这样添加授权头:

httpClient.DefaultRequestHeaders.Authorization 
                         = new AuthenticationHeaderValue("Bearer", "Your Oauth token");

这样做会为HttpClient的生命周期添加授权头,因此在只访问一个授权头不会改变的站点时非常有用。

下面是一个详细的SO答案:answer

有人反对此方法,因为HttpClient应该是可重用的(参见aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong)。如果必须是可重用的,设置默认请求头是一种不好的做法。

ödel:你的假设是错误的。如果在HttpClient的生命周期内始终使用相同的凭据调用同一站点,使用DefaultRequestHeaders可以避免每次都设置相同值的麻烦。你应该重新阅读那篇文章,它讲述了如何使用同一个HttpClient实例,但并没有说默认请求头是不好的做法。如果我只在实践中使用HTTP客户端访问一个站点,使用DefaultRequestHeaders可以避免每次设置头部的麻烦。

ödel:虽然你的假设是错误的,但我给你的评论点了赞,因为你提出了一个重要的观点,并对答案做出了更清晰的解释。

,那如果我需要传递两个令牌怎么办?

0
0 Comments

问题的出现的原因是想要在使用httpClient.GetAsync方法时添加请求头,但不想直接在HttpClient实例上设置请求头,因为这样会将请求头发送到所有使用该实例进行的请求中。解决方法是使用SendAsync方法,并在其参数中传入一个HttpRequestMessage实例,通过该实例设置请求头。这样可以在每个请求中单独设置请求头,而不会影响到其他请求。

以下是使用SendAsync方法设置请求头的示例代码:

using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, "https://your.site.com"))
{
    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);
    await httpClient.SendAsync(requestMessage);
}

这种方法更安全,如果请求头的值经常发生变化,那么不使用DefaultRequestHeaders会更好。需要注意的是,很可能需要设置Authorization请求头,并且请求头的格式必须正确,否则会被认为是无效的HTTP头。

由于官方推荐,现在大家都在重用同一个HttpClient实例,所以这个方法是正确的解决方案。另外,为了释放非托管资源,最好使用using语句对HttpClient进行Dispose操作。

,解决这个问题的方法是使用SendAsync方法,并在其中传入一个HttpRequestMessage实例来设置请求头。这样可以在每个请求中单独设置请求头,而不会影响到其他请求。另外,为了释放非托管资源,最好使用using语句对HttpClient进行Dispose操作。

0