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 요청과 함께 전송됩니다. 반면 DefaultRequestHeaders에 HttpClient클래스 의 는 해당 클라이언트 객체를 사용하여 전송 된 각 요청과 함께 헤더가 전송되도록 설정하므로 기본 요청 헤더 라는 이름이 설정 됩니다.

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


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

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