httpClient.GetAsync를 사용할 때 헤더 추가


152

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 (크롬 확장) 이미지입니다. 여기에 이미지 설명을 입력하십시오

해당 Authorization 헤더를 요청에 어떻게 추가합니까?



5
경고 잠재적 코드 검색 자 : 이것은 HttpClient를 잘못 사용하는 것입니다 !! aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong 이유를 확인하십시오 .
321X

답변:


174

HttpClient와 함께 GetAsync를 사용할 때 다음과 같이 인증 헤더를 추가 할 수 있습니다.

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

이것은 HttpClient의 수명 동안 인증 헤더를 추가하므로 인증 헤더가 변경되지 않는 한 사이트를 방문하는 경우 유용합니다.

자세한 답변 은 다음과 같습니다.


31
HttpClient는 재사용 가능해야하므로 -1입니다 ( aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong 참조 ). 재사용 할 수 있어야하는 경우 기본 요청 헤더를 설정하는 것은 좋지 않습니다.
JCKödel

22
@ JCKödel 그것은 당신이 만드는 잘못된 가정입니다. DefaultRequestHeaders를 사용하여 HttpClient의 수명 동안 동일한 자격 증명으로 동일한 사이트를 항상 호출하면 동일한 값으로 다시 설정하지 않아도됩니다. 동일한 HttpClient 인스턴스 사용에 대해 설명하는 기사를 다시 읽어야하며 기본 요청 헤더에 대한 언급은 좋지 않습니다. 실제로 DefaultRequestHeaders를 사용하여 HTTP 클라이언트로 한 사이트 만 호출하면 매번 설정할 필요가 없습니다.
kmcnamee

@ JCKödel, 당신은 당신의 가정이 틀렸지 만 중요한 점을 제기했기 때문에 귀하의 의견을 찬성했습니다. 답변에 명확성이 추가되었습니다.
Najeeb

@kmcnamee, 두 개의 토큰을 전달해야한다면 어떻게해야합니까?
Najeeb

281

나중에 대답하지만 아무도이 솔루션을 제공하지 않았기 때문에 ...

당신이에 헤더 설정하지 않으려면 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);
}

5
값이 자주 변경되면 DefaultRequestHeaders를 사용하지 않는 것이 더 안전합니다.
Jason Rowe

3
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);"Bearer"는 유효하지 않은 HTTP 헤더 일 필요 가 있습니다.
Chris Marisic

3
이 주셔서 감사합니다, 우리는 우리가이 우리 도움이 HttpClient를 재사용하고
StevenMcD을

2
@JCKodel 그것은 당신이 사용해야 할 의무는 using없지만 생성자를 인스턴스화하고Dispose()
Philippe

3
나는 usingHttpClient에서 사용한다고 말한 적이 없다 (이것은 나쁘다). 나는 HttpRequesMessage에 대해 말했다 (사용 후에 폐기되어야하는 스트리밍을 위해 관리되지 않는 메모리 버퍼가 있기 때문에) 요청과 응답은 모든 요청에 ​​따라 처리되어야합니다 (그렇지 않으면 큰 메모리 청크를 오랫동안 잠근 상태로 유지함). 는 HttpClient연장하기 위해 재사용된다.
JCKödel

70

수락 된 답변은 효과가 있지만 수락 헤더를 추가하려고하면 복잡해질 수 있습니다. 이것이 내가 끝낸 것입니다. 그것은 나에게 더 단순 해 보이므로 앞으로 그것을 고수 할 것이라고 생각합니다.

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

기본 인증 헤더를 추가하는 가장 간단한 방법
sandiit

7

에 필요한 헤더를 추가 할 수 있습니다 HttpClient.

여기에 좋은 튜토리얼 이 있습니다.

이것은 POST 요청을 참조하는 것이 아니라 GET 요청에도 사용할 수 있습니다.


사이트 링크가 만료 된 경우 Github url .
Sen Jacob

4

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")

-1

때로는이 코드 만 필요합니다.

 httpClient.DefaultRequestHeaders.Add("token", token);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.