HttpClient isteğine özel üstbilgi


140

Bir HttpClientisteğe nasıl özel başlık ekleyebilirim ? PostAsJsonAsyncJSON göndermek için yöntem kullanıyorum . Eklenmem gereken özel başlık:

"X-Version: 1"

Şimdiye kadar yaptığım şey bu:

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: Sorum, özel başlıkların nasıl ekleneceği idi. Diğer soru üstbilgileri nasıl ekleyeceğiydi
Libin Joseph

2
Bence HttpClient imha etmememiz gerekiyor. aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Don Rolling

Yanıtlar:


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
cevap son derece kafa karıştırıcı ... neden belgeler, blank.pdf, vb için kod getiriyorsun? Content parametresi içinde özel üstbilgiler geçirmek için bytearray sınıflarını örneklemek ister misiniz?
heug

2
@heug Şey. Eğer başlık arıyorsanız bunu görebilirsiniz. Resmi burada tamamlamak için içerik var, çünkü büyük olasılıkla isteğinize biraz içerik eklemek istiyorsunuz. Sıkıcı olmamak için içerik karmaşıktır ve hem JSON hem de ikili veriler içerir.
Anubis

2
sadece bunu yapmak için daha basit görünüyor: içerik JSON kullanarak StringContent oluşturmak, yöntem ve URI ile bir HTTP mesajı oluşturmak, sonra message.Headers.Add ("x": "y") gibi başlıklar ekleyin .... daha sonra bunları "var response = await httpClient.SendAsync (message);"
18:23

@ heug bunu öfke için hatırlayacağım. Teşekkürler!
Anubis

3
Yukarıda kabul edilen cevapta hangi satır OP'nin X-Sürümü'nün talep ettiği başlığı uygular? Bu neden kabul edilen cevap olarak değerlendiriliyor?
Ron

215

Sorumun cevabını buldum.

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

Bu, isteğinize özel bir başlık eklemelidir


50
Hayır. Varsayılan istek istek başlıkları her istekle birlikte gönderildiği için bu yanıt dikkatle görüntülenmelidir. İsteğinizi @Anubis önerdiği gibi oluşturmalısınız. HttpClient'i oluşturduğunuzda DefaultsRequestHeaders doldurulmalıdır.
Ruhrpottpatriot

6
Bu, yalnızca her istek için yeni bir HttpClient başlattığınız için işe yarar. Bu sınıfın kullanılması gereken yol bu değildir: tüm isteklerde, en azından aynı bitiş noktasına kadar olanlarda, yeniden kullanılan statik bir alan olmalıdır. Belgelere ve sayısız blog yayınına bakın. Sonra, elbette, @Ruhrpottpatriot'un işaret ettiği gibi, varsayılan başlıkların değiştirilmesi tüm istekleri etkileyecektir.
kamilk

@Ruhrpottpatriot Her istek için üstbilgi göndermede sorun nedir?
David Klempfner

1
@ajbeaven Hayır, öyle değil. Sayfanın üst kısmındaki örnek, uygulamanın Ana yöntemini gösterir, bu nedenle HttpClient atılmış olsa bile, aynı örnek uygulamanın ömrü boyunca kullanılır ve bu, belgelerin biraz söylediklerine göre doğrudur biraz daha aşağı: 'HttpClient'in bir kez başlatılması ve bir uygulamanın ömrü boyunca yeniden kullanılması amaçlanmıştır' . Bu paragrafın ardından, statik alana HttpClient atanmasını öneren bir örnek verilmiştir.
kamilk

1
@kamilk, sen öldün doğru - bu örnek beni yanlış yaptı. Beni doğru koyduğunuz için teşekkürler :)
ajbeaven

79

Anubis (her istek için üstbilgileri değiştirmediği için daha iyi bir yaklaşımdır) ancak orijinal sorudaki koda daha eşdeğer olan bir cevap:

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 kesinlikle değil. İçerik Türü bir İçerik üstbilgisidir.
Panagiotis Kanavos

1
Bu cevap kabul etti. OP'nin istediği üstbilginin nasıl ekleneceğini gösterir. Soruma da cevap verdim.
Ron

1
Bence öyle HttpRequestHeader.Accessolmalı HttpRequestHeader.Accept.
Mass Dot Net

svm bu arada ne?
aswzen

@aswzen Bu OP'nin sorusundan - tahmin edebileceğim bir şey. Serileştirilen nesne.
Chris Peacock

3

Sınıfta bir Headersözellik var HttpRequestMessage. Buraya, her HTTP isteğiyle gönderilecek özel üstbilgiler ekleyebilirsiniz. DefaultRequestHeadersİçinde HttpClientsınıf, diğer taraftan, bu istemci nesnesi kullanılarak gönderildi her istekle birlikte gönderilmek üzere başlıkları setleri, dolayısıyla adı Standart Talebi Başlıkları.

Umarım bu en azından gelecekte bu cevabı gören biri için işleri daha açık hale getirir.


1
Hayır, bunu daha açık hale getirmiyor. Her iki durumda da, her istek üzerine üstbilgi gönderdiğinizi söylüyorsunuz.
joedotnot

3
Headerstek bir HttpRequestMessagenesnenin bir özelliğidir . Böylece farklı başlıklarla farklı mesajlar oluşturabilirsiniz. nesnenin DefaultRequestHeadersbir özelliğidir HttpClient; belirli bir mesaj yoluyla birden fazla mesaj gönderilirse HttpClient, bu tür mesajların tümü DefaultRequestHeadersmesajın ayrı başlıklarına aynı şekilde eklenir.
Ross Presser
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.