Thêm tiêu đề khi sử dụng httpClient.GetAsync


151

Tôi đang triển khai API được tạo bởi các đồng nghiệp khác với Aperator.io, trong dự án ứng dụng Windows Store.

Họ cho thấy ví dụ này về một phương pháp tôi phải thực hiện:

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

Trong phương thức này và một số phương pháp khác, tôi cần phải có một tiêu đề với mã thông báo mà tôi nhận được trước đó.

Đây là hình ảnh của Postman (tiện ích chrome) với tiêu đề tôi đang nói đến: nhập mô tả hình ảnh ở đây

Làm cách nào để thêm tiêu đề Ủy quyền đó vào yêu cầu?



5
Cảnh báo Đối với những người tìm kiếm mã tiềm năng: đây là việc sử dụng HTTPClient không chính xác !! Kiểm tra aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong tại sao.
321X

Câu trả lời:


173

Khi sử dụng GetAsync với HttpClient, bạn có thể thêm các tiêu đề ủy quyền như sau:

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

Điều này không thêm tiêu đề ủy quyền cho thời gian tồn tại của HTTPClient nên rất hữu ích nếu bạn truy cập vào một trang web nơi tiêu đề ủy quyền không thay đổi.

Đây là một câu trả lời SO chi tiết


31
-1 vì httpClient phải được sử dụng lại (xem aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong ). Nếu nó phải được sử dụng lại, việc đặt các tiêu đề yêu cầu mặc định là một cách làm không tốt.
JCKödel

22
@ JCKödel Đó là một giả định sai lầm mà bạn đang thực hiện. Nếu bạn luôn gọi cùng một trang web có cùng thông tin xác thực trong suốt vòng đời của HTTPClient bằng cách sử dụng DefaultRequestHeaders, bạn sẽ không phải liên tục đặt lại chúng với cùng các giá trị. Bạn nên đọc lại bài viết mà nó nói về việc sử dụng cùng một thể hiện của HTTPClient, nó không đưa ra tuyên bố nào về các tiêu đề yêu cầu mặc định là thông lệ xấu. Nếu tôi chỉ gọi một trang web với máy khách HTTP, điều này thực tế xảy ra bằng cách sử dụng DefaultRequestHeaders giúp bạn không phải đặt chúng mỗi lần.
kmcnamee

@ JCKödel, mặc dù bạn không chính xác trong giả định của mình, tôi đã nêu lên nhận xét của bạn, bởi vì bạn đã đưa ra một điểm quan trọng. Thêm rõ ràng hơn cho câu trả lời.
Najeeb

@kmcnamee, nếu tôi cần vượt qua hai mã thông báo thì sao?
Najeeb

281

Một câu trả lời sau, nhưng vì không ai đưa ra giải pháp này ...

Nếu bạn không muốn đặt tiêu đề trên HttpClientví dụ bằng cách thêm nó vào DefaultRequestHeaders, bạn có thể đặt tiêu đề cho mỗi yêu cầu .

Nhưng bạn sẽ có nghĩa vụ sử dụng SendAsync()phương pháp.

Đây là giải pháp phù hợp nếu bạn muốn sử dụng lạiHttpClient - đó là một cách thực hành tốt cho

Sử dụng nó như thế này:

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

5
Có vẻ an toàn hơn khi không sử dụng DefaultRequestHeaders nếu giá trị thay đổi thường xuyên.
Jason Rowe

3
Lưu ý rằng rất có thể bạn cần requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);"Người mang" sẽ là tiêu đề HTTP không hợp lệ
Chris Marisic

3
Cảm ơn vì điều này, chúng tôi đang sử dụng lại HTTPClient của chúng tôi và điều này đã giúp chúng tôi
StevenMcD

2
@JCKodel nó sẽ thêm tiếng ồn vì bạn không bắt buộc phải sử dụng usingnhưng có thể khởi tạo trong hàm tạo và xử lý trongDispose()
Philippe

3
Tôi chưa bao giờ nói sử dụng usingtrên HttpClient (điều này là xấu), tôi đã nói trên HttpRequesMessage (vì nó có bộ đệm bộ nhớ không được quản lý để phát trực tuyến PHẢI được xử lý sau khi sử dụng). Yêu cầu và phản hồi là và phải được xử lý mọi yêu cầu (nếu không, bạn sẽ giữ các khối bộ nhớ lớn bị khóa trong một thời gian dài). Có HttpClientthể tái sử dụng, đến một phần mở rộng.
JCKödel

70

Câu trả lời được chấp nhận hoạt động nhưng có thể trở nên phức tạp khi tôi muốn thử thêm tiêu đề Chấp nhận. Đây là những gì tôi đã kết thúc với. Nó có vẻ đơn giản hơn với tôi vì vậy tôi nghĩ rằng tôi sẽ gắn bó với nó trong tương lai:

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

Cách đơn giản nhất để thêm tiêu đề Ủy quyền cơ bản
sandiit

7

Bạn có thể thêm bất cứ tiêu đề nào bạn cần vào HttpClient.

Đây là một hướng dẫn tốt đẹp về nó.

Điều này không chỉ tham chiếu đến các yêu cầu POST, bạn cũng có thể sử dụng nó cho các yêu cầu GET.


Github url , trong trường hợp liên kết trang web hết hạn.
Sen Jacob

4

Theo câu trả lời của greenhoorn, bạn có thể sử dụng "Tiện ích mở rộng" như thế này:

  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;
        }
    }

Và sử dụng:

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

-1

Đôi khi, bạn chỉ cần mã này.

 httpClient.DefaultRequestHeaders.Add("token", token);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.