it-swarm.com.ru

Добавление заголовков при использовании httpClient.GetAsync

Я внедряю API, созданный другими коллегами, с помощью Apiary.io, в проекте приложения для магазина Windows.

они показывают этот пример метода, который я должен реализовать

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();

 }
}

в этом и некоторых других методах мне нужно иметь заголовок с токеном, который я получаю раньше

вот изображение почтальона (расширение chrome) с заголовком, о котором я говорю enter image description here

как добавить этот заголовок авторизации к запросу?

92
Ric

При использовании GetAsync с HttpClient вы можете добавить заголовки авторизации следующим образом:

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

Это добавляет заголовок авторизации на весь срок службы HttpClient, поэтому полезно, если вы заходите на один сайт, где заголовок авторизации не изменяется.

Вот подробное SO ответ

116
kmcnamee

Более поздний ответ, но потому что никто не дал это решение ...

Если вы не хотите устанавливать заголовок в экземпляре HttpClient, добавляя его к DefaultRequestHeaders, , вы можете установить заголовки для запроса .

Но вы будете обязаны использовать метод SendAsync().

Это правильное решение , если вы хотите повторно использовать HttpClient - что является хорошей практикой для

Используйте это так:

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

Принятый ответ работает, но может усложниться, если я захочу добавить заголовки Accept. Это то, что я закончил. Мне кажется, проще, поэтому я думаю, что буду придерживаться этого в будущем:

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

Вы можете добавить любые заголовки к HttpClient.

Вот хороший учебник об этом.

Это не просто ссылка на POST-запросы, вы также можете использовать его для GET-запросов.

9
greenhoorn

Следуя ответу 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")
2
RDyego