HttpClient 요청에 대한 사용자 정의 헤더


140

HttpClient요청에 커스텀 헤더를 어떻게 추가 합니까? PostAsJsonAsyncJSON을 게시하는 방법을 사용 하고 있습니다. 추가해야 할 맞춤 헤더는

"X-Version: 1"

이것이 내가 지금까지 한 일입니다.

using (var client = new HttpClient()) {
    client.BaseAddress = new Uri("https://api.clickatell.com/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "xxxxxxxxxxxxxxxxxxxx");
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var response = client.PostAsJsonAsync("rest/message", svm).Result;
}


@Liam : 내 질문은 사용자 정의 헤더를 추가하는 방법이었습니다. 다른 질문은 헤더를 추가하는 방법이었습니다
Libin Joseph

2
우리는 HttpClient를 폐기해서는 안된다는 것이 밝혀졌습니다. aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Don Rolling

답변:


57
var request = new HttpRequestMessage {
    RequestUri = new Uri("[your request url string]"),
    Method = HttpMethod.Post,
    Headers = {
        { "X-Version", "1" } // HERE IS HOW TO ADD HEADERS,
        { HttpRequestHeader.Authorization.ToString(), "[your authorization token]" },
        { HttpRequestHeader.ContentType.ToString(), "multipart/mixed" },//use this content type if you want to send more than one content type
    },
    Content = new MultipartContent { // Just example of request sending multipart request
        new ObjectContent<[YOUR JSON OBJECT TYPE]>(
            new [YOUR JSON OBJECT TYPE INSTANCE](...){...}, 
            new JsonMediaTypeFormatter(), 
            "application/json"), // this will add 'Content-Type' header for the first part of request
        new ByteArrayContent([BINARY DATA]) {
            Headers = { // this will add headers for the second part of request
                { "Content-Type", "application/Executable" },
                { "Content-Disposition", "form-data; filename=\"test.pdf\"" },
            },
        },
    },
};

38
대답이 매우 혼란 스럽습니다 ... 왜 문서, blank.pdf 등의 코드를 가져 오십니까? 콘텐츠 매개 변수 내에서 사용자 정의 헤더를 전달하기 위해 바이트 배열 클래스를 인스턴스화합니까?
15:51에

2
@ 허그 잘. 헤더를 찾고 있다면 볼 수 있습니다. 귀하의 요청에 일부 내용을 추가하려고하므로 그림을 완성하기 위해 여기에 내용이 있습니다. 그리고 지루하지 않기 위해 콘텐츠는 복잡하고 JSON 및 이진 데이터를 모두 포함합니다.
아누비스

2
콘텐츠 JSON을 사용하여 StringContent를 작성하고 메소드 및 URI로 HTTP 메시지를 작성한 다음 message.Headers.Add ( "x": "y") ...와 같은 헤더를 추가하십시오. 그런 다음 "var response = await httpClient.SendAsync (message);"와 같은 응답 var에 전달하십시오.
22

@heug 나는 furute를 위해 이것을 기억할 것입니다. 감사!
아누비스

3
위의 답변 중 어느 행이 실제로 OP가 요청한 헤더 X-Version을 구현합니까? 이것이 왜 대답으로 간주됩니까?
Ron

215

내 질문에 대한 답을 찾았습니다.

client.DefaultRequestHeaders.Add("X-Version","1");

요청에 맞춤 헤더를 추가해야합니다.


50
아니 그렇지 않아. 기본 요청 헤더는 각 요청과 함께 전송되므로이 답변은주의해서 검토해야합니다. @Anubis가 제안한 것처럼 요청을 작성해야합니다. HttpClient를 만들 때 DefaultsRequestHeaders를 채워야합니다.
Ruhrpottpatriot

6
이것은 모든 요청에 ​​대해 새 HttpClient를 인스턴스화하기 때문에 작동합니다. 이것은이 클래스가 사용되는 방식이 아닙니다. 정적 필드 여야하며 모든 요청에 ​​대해 최소한 동일한 엔드 포인트에 대한 요청을 재사용해야합니다. 문서 및 수많은 블로그 게시물을 참조하십시오. 물론 @Ruhrpottpatriot가 지적했듯이 기본 헤더를 변경하면 모든 요청에 ​​영향을 미칩니다.
kamilk

@Ruhrpottpatriot 모든 요청에 ​​대해 헤더를 보내는 것이 왜 문제입니까?
David Klempfner

1
@ajbeaven 아니요, 그건 말이 아닙니다. 페이지 맨 위의 예제는 앱의 Main 메서드를 보여 주므로 HttpClient가 폐기 된 경우에도 동일한 인스턴스가 애플리케이션 수명 동안 사용되며 설명서의 내용과 관련하여 정확합니다. 조금 더 아래로 : 'HttpClient는 한 번 인스턴스화되어 응용 프로그램 수명 동안 재사용되도록 설계되었습니다 . ' 이 단락 다음에는 정적 필드에 HttpClient를 할당하도록 권장하는 예가 있습니다.
kamilk

1
@kamilk, 당신은 죽었어-그 예는 나를 잘못 넣었다. :)
ajbeaven

79

다음은 Anubis의 답변을 기반으로합니다 (모든 요청에 ​​대해 헤더를 수정하지 않으므로 더 나은 접근 방법이지만 원래 질문의 코드와 동일합니다).

using Newtonsoft.Json;
...

    var client = new HttpClient();
    var httpRequestMessage = new HttpRequestMessage
        {
            Method = HttpMethod.Post,
            RequestUri = new Uri("https://api.clickatell.com/rest/message"),
            Headers = { 
                { HttpRequestHeader.Authorization.ToString(), "Bearer xxxxxxxxxxxxxxxxxxxx" },
                { HttpRequestHeader.Accept.ToString(), "application/json" },
                { "X-Version", "1" }
            },
            Content = new StringContent(JsonConvert.SerializeObject(svm))
        };

    var response = client.SendAsync(httpRequestMessage).Result;

@RossPresser는 확실히 아닙니다. Content-Type은 Content 헤더입니다.
Panagiotis Kanavos

1
이것이 답변입니다. OP가 요청한 헤더를 추가하는 방법을 보여줍니다. 내 질문에도 대답했습니다.
Ron

1
참고로 생각 HttpRequestHeader.Access합니다 HttpRequestHeader.Accept.
Mass Dot Net

그런데 svm은 무엇입니까?
aswzen

@aswzen OP의 질문에서 비롯된 것 같습니다. 직렬화되는 개체입니다.
Chris Peacock

2

클래스 에는 Headers속성 이 있습니다 HttpRequestMessage. 여기에 사용자 정의 헤더를 추가 할 수 있으며, 각 헤더는 HTTP 요청과 함께 전송됩니다. 반면 DefaultRequestHeadersHttpClient클래스 의 는 해당 클라이언트 객체를 사용하여 전송 된 각 요청과 함께 헤더가 전송되도록 설정하므로 기본 요청 헤더 라는 이름이 설정 됩니다.

적어도 미래 에이 답변을 보는 사람에게는 이것이 더 명확하게되기를 바랍니다.


1
아니, 더 명확하게하지 않습니다. 두 경우 모두 요청마다 헤더를 보내고 있다고 말하고 있습니다. 차이점은 무엇입니까?
joedotnot

3
Headers개별 HttpRequestMessage객체 의 속성입니다 . 따라서 다른 헤더로 다른 메시지를 작성할 수 있습니다. 객체 DefaultRequestHeaders의 속성입니다 HttpClient. given을 통해 여러 개의 메시지가 전송되면 해당 HttpClient메시지는 모두 DefaultRequestHeaders메시지의 개별 헤더에 동일하게 추가됩니다.
Ross Presser
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.