簡體   English   中英

使用 httpClient.GetAsync 時添加標頭

[英]Adding headers when using httpClient.GetAsync

我正在 Windows 應用商店應用程序項目中實現由其他同事使用 Apiary.io 制作的 API。

他們展示了我必須實現的方法示例:

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 擴展)的圖像:在此處輸入圖像描述

如何將該授權標頭添加到請求中?

后來的答案,但因為沒有人給出這個解決方案......

如果您不想通過將HttpClient實例添加到DefaultRequestHeaders來在HttpClient實例上設置標頭則可DefaultRequestHeaders每個請求設置標頭

但是您將不得不使用SendAsync()方法。

如果您想重用HttpClient ,這是正確的解決方案——這是一個很好的做法

像這樣使用它:

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

將 GetAsync 與 HttpClient 一起使用時,您可以像這樣添加授權標頭:

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

這確實為 HttpClient 的生命周期添加了授權標頭,因此如果您訪問授權標頭未更改的站點,這將非常有用。

這是一個詳細的SO 答案

接受的答案有效,但當我想嘗試添加 Accept 標頭時可能會變得復雜。 這就是我的結果。 這對我來說似乎更簡單,所以我想我將來會堅持下去:

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

按照greenhoorn的回答,您可以像這樣使用“擴展”:

  public static class HttpClientExtensions
    {
        public static HttpClient AddTokenToHeader(this HttpClient cl, string token)
        {
            //int timeoutSec = 90;
            //cl.Timeout = new TimeSpan(0, 0, timeoutSec);
            string contentType = "application/json";
            cl.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(contentType));
            cl.DefaultRequestHeaders.Add("Authorization", String.Format("Bearer {0}", token));
            var userAgent = "d-fens HttpClient";
            cl.DefaultRequestHeaders.Add("User-Agent", userAgent);
            return cl;
        }
    }

並使用:

string _tokenUpdated = "TOKEN";
HttpClient _client;
_client.AddTokenToHeader(_tokenUpdated).GetAsync("/api/values")

有時,您只需要此代碼。

 httpClient.DefaultRequestHeaders.Add("token", token);

您可以將所需的任何標頭添加到HttpClient

這是一個很好的教程

這不僅僅引用 POST 請求,您還可以將其用於 GET 請求。

這些天來,如果您使用 MS 依賴注入,強烈建議插入 IHttpClientFactory:

builder.Services.AddHttpClient("GitHub", httpClient =>
{
    httpClient.BaseAddress = new Uri("https://api.github.com/");

    // using Microsoft.Net.Http.Headers;
    // The GitHub API requires two headers.
    httpClient.DefaultRequestHeaders.Add(
        HeaderNames.Accept, "application/vnd.github.v3+json");
    httpClient.DefaultRequestHeaders.Add(
        HeaderNames.UserAgent, "HttpRequestsSample");
});

var httpClient = _httpClientFactory.CreateClient("GitHub");

這樣您就可以避免將默認請求標頭添加到全局共享的 httpclient 中,而且不必處理手動創建HttpRequestMessage

資料來源: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-6.0#consumption-patterns

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM