Спеціальний заголовок до запиту HttpClient


140

Як додати спеціальний заголовок до HttpClientзапиту? Я використовую PostAsJsonAsyncметод для розміщення JSON. Спеціальний заголовок, який мені потрібно буде додати, - це

"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
Дон

Відповіді:


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 тощо? примірник класів bytearray для передачі користувацьких заголовків у параметрі вмісту?
heug

2
@heug Ну. Якщо ви шукаєте заголовок, ви можете його побачити. Вміст присутній тут для завершення зображення, оскільки ви, швидше за все, хочете додати якийсь вміст у свій запит. А щоб не бути нудним, контент складний і містить як JSON, так і двійкові дані.
Анубіс

2
просто здається, що це зробити прямо так: створіть StringContent за допомогою вмісту JSON, створіть повідомлення HTTP зі своїм методом та URI, а потім додайте заголовки, як message.Headers.Add ("x": "y") .... потім передайте їх у var відповідь типу "var response = очікуйте httpClient.SendAsync (повідомлення);"
heug

@heug Я запам'ятаю це за фуруте. Дякую!
Анубіс

3
У якому рядку вищевказаної відповіді реально реалізується заголовок, який запитував ОП, X-Version? Чому це вважається прийнятою відповіддю?
Рон

215

Я знайшов відповідь на своє запитання.

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

Це має додати спеціальний заголовок до вашого запиту


50
Ні, це не є. Цю відповідь слід розглядати обережно, оскільки заголовки запитів за замовчуванням надсилаються з кожним запитом. Слід створити запит, як @Anubis запропонував. DefaultsRequestHeaders повинні бути заповнені, коли ви створюєте HttpClient.
Ruhrpottpatriot

6
Це працює лише тому, що ви створюєте інстанцію нового HttpClient для кожного запиту. Це не такий спосіб, як цей клас повинен використовуватися: він повинен стати статичним полем, повторно використаним для всіх запитів, принаймні тих, що мають одну і ту ж кінцеву точку. Перегляньте документацію та незліченну кількість публікацій блогу. Тоді, як звичайно, як зазначає @Ruhrpottpatriot, зміна заголовків за замовчуванням вплине на всі запити.
kamilk

@Ruhrpottpatriot Що не так у надсиланні заголовка для кожного запиту?
Девід Клемпфнер

1
@ajbeaven Ні, це не те, що написано. Приклад у верхній частині сторінки показує основний метод програми, тому, хоча 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 - це заголовок вмісту.
Панайотис Канавос

1
Погодився, це відповідь. Він демонструє, як додати заголовок, який запитував ОП. Відповів і на моє запитання.
Рон

1
FYI я думаю, що HttpRequestHeader.Accessмає бути HttpRequestHeader.Accept.
Mass Dot Net

що до речі svm?
aswzen

@aswzen Це з питання ОП - я б здогадався, щось модель. Об'єкт серіалізується.
Кріс Павич

2

В класі є Headersвластивість HttpRequestMessage. Ви можете додати туди власні заголовки, які надсилатимуться із кожним запитом HTTP. З іншого боку, DefaultRequestHeadersу HttpClientкласі встановлює заголовки, що надсилаються з кожним запитом, надісланим за допомогою цього об’єкта клієнта, звідси і назва Заголовок запиту за замовчуванням .

Сподіваюся, це робить речі більш зрозумілими, принаймні для того, хто побачить цю відповідь у майбутньому.


1
Ні, не робить це зрозумілішим. В обох випадках ви говорите, що надсилаєте заголовки на кожен запит. Тож у чому різниця?
joedotnot

3
Headersє властивістю окремого HttpRequestMessageоб'єкта. Таким чином, ви можете створювати різні повідомлення з різними заголовками. DefaultRequestHeadersє властивістю HttpClientоб'єкта; якщо декілька повідомлень надсилається через заданий HttpClient, всі такі повідомлення будуть однаково DefaultRequestHeadersдодані до окремих заголовків повідомлення.
Росс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.