Próbuję ustawić Content-Type
nagłówek HttpClient
obiektu zgodnie z wymaganiami wywoływanego interfejsu API.
Próbowałem ustawić Content-Type
poniżej:
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri("http://example.com/");
httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json");
// ...
}
Pozwala mi to dodać Accept
nagłówek, ale gdy próbuję go dodać Content-Type
, zgłasza następujący wyjątek:
Niewłaściwie użyta nazwa nagłówka. Upewnij się, że używane są nagłówki żądania, nagłówki
HttpRequestMessage
odpowiedzi zHttpResponseMessage
oraz nagłówki zawartości zHttpContent
obiektami.
Jak ustawić Content-Type
nagłówek w HttpClient
żądaniu?
Odpowiedzi:
Typ zawartości jest nagłówkiem treści, a nie żądania, dlatego to się nie udaje.
AddWithoutValidation
zgodnie z sugestią Roberta Levy'ego może działać, ale można również ustawić typ zawartości podczas tworzenia treści żądania (pamiętaj, że fragment kodu dodaje „application / json” w dwóch miejscach - dla nagłówków Accept i Content-Type):źródło
Response.Content.Headers
będzie działać przez większość czasu.Response.Content.Headers
z interfejsem API sieci Web ASP.Net, również nie działała, ale możesz je łatwo ustawić,HttpContext.Current.Response.ContentType
jeśli zajdzie taka potrzeba.Dla tych, którzy nie widzieli Johnsa komentarza do rozwiązania Carlos ...
źródło
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml; charset=utf-8");
Jeśli nie przeszkadza ci mała zależność od biblioteki, Flurl.Http [ujawnienie: jestem autorem] sprawia, że jest to bardzo proste. Ta
PostJsonAsync
metoda zajmuje się serializowaniem treści i ustawieniemcontent-type
nagłówka orazReceiveJson
deserializacją odpowiedzi. Jeśliaccept
nagłówek jest wymagany, musisz ustawić go sam, ale Flurl zapewnia całkiem czysty sposób na zrobienie tego:Flurl używa HttpClient i Json.NET pod maską, i jest to PCL, więc będzie działał na różnych platformach.
źródło
spróbuj użyć TryAddWithoutValidation
źródło
Misused header name
błąd zostanie potwierdzone z rdzeniem dotnet 2.2. Musiałem użyć odpowiedzi @ carlosfigueira stackoverflow.com/a/10679340/2084315 ..Net próbuje zmusić cię do przestrzegania pewnych standardów, a mianowicie, że
Content-Type
nagłówek może być określony tylko na wnioski, które mają zawartość (npPOST
,PUT
itp). Dlatego, jak wskazali inni, preferowanym sposobem ustawieniaContent-Type
nagłówka jestHttpContent.Headers.ContentType
właściwość.Mając to na uwadze , niektóre interfejsy API (takie jak LiquidFiles Api , od 19.12.2016) wymagają ustawienia
Content-Type
nagłówkaGET
żądania. .Net nie zezwoli na ustawienie tego nagłówka na samym żądaniu - nawet przy użyciuTryAddWithoutValidation
. Ponadto nie można określićContent
żądania dla - nawet jeśli ma ono zerową długość. Jedynym sposobem, w jaki mogłem to obejść, było uciekanie się do refleksji. Kod (na wypadek, gdyby ktoś go potrzebował) toEdytować:
Jak zauważono w komentarzach, pole to ma różne nazwy w różnych wersjach biblioteki dll. W kodzie źródłowym na GitHub pole ma obecnie nazwę
s_invalidHeaders
. Przykład został zmodyfikowany, aby uwzględnić to zgodnie z sugestią @David Thompson.źródło
Niektóre dodatkowe informacje o .NET Core (po przeczytaniu postu erdomke o ustawianiu prywatnego pola do dostarczenia typu zawartości na żądanie, które nie zawiera treści) ...
Po debugowaniu mojego kodu nie widzę pola prywatnego, które można ustawić poprzez odbicie - pomyślałem więc, że spróbuję odtworzyć problem.
Próbowałem następujący kod przy użyciu .Net 4.6:
I zgodnie z oczekiwaniami otrzymuję zbiorczy wyjątek z treścią
"Cannot send a content-body with this verb-type."
Jeśli jednak zrobię to samo z .NET Core (1.1) - nie otrzymam wyjątku.Moja aplikacja na serwer dość szczęśliwie odpowiedziała i pobrano typ zawartości.
Byłem mile zaskoczony tym i mam nadzieję, że to komuś pomoże!
źródło
Zadzwoń
AddWithoutValidation
zamiastAdd
(patrz ten link MSDN ).Alternatywnie, zgaduję, że interfejs API, którego używasz, naprawdę wymaga tylko tego dla żądań POST lub PUT (nie zwykłe żądania GET). W takim przypadku, gdy wywołujesz
HttpClient.PostAsync
i przekazujeszHttpContent
, ustaw to naHeaders
właściwość tegoHttpContent
obiektu.źródło
Dla tych, którzy się martwili
charset
Miałem bardzo szczególny przypadek, że dostawca usług nie zaakceptował zestawu znaków, a oni odmówili zmiany podstruktury, aby na to pozwolić ... Niestety HttpClient ustawiał nagłówek automatycznie za pośrednictwem StringContent i bez względu na to, czy podasz null lub Encoding.UTF8, zawsze ustawi zestaw znaków ...
Dzisiaj byłem na krawędzi, aby zmienić podsystem; przechodząc od HttpClient do czegokolwiek innego, że coś przyszło mi do głowy ... dlaczego nie użyć refleksji, aby opróżnić „zestaw znaków”? ... I zanim jeszcze spróbowałem, pomyślałem o pewnym „może mogę to zmienić po inicjalizacji” i to zadziałało.
Oto jak ustawić dokładny nagłówek „application / json” bez „; charset = utf-8”.
Uwaga: Poniższa
null
wartość nie będzie działać i dopisuje „; charset = utf-8”EDYTOWAĆ
@DesertFoxAZ sugeruje, że można również użyć następującego kodu i działa dobrze. (sam tego nie testowałem)
źródło
To wszystko, czego potrzebujesz.
Korzystając z Newtonsoft.Json, jeśli potrzebujesz zawartości jako ciągu json.
źródło
HttpMessageHandler handler = new WebRequestHandler(); HttpResponseMessage result; using (var client = (new HttpClient(handler, true))) { result = client.PostAsync(fullUri, content).Result; }
Ok, to nie jest HTTPClient, ale jeśli możesz go użyć, WebClient jest dość łatwy:
źródło
Możesz tego użyć, to będzie praca!
źródło
Uważam to za najprostsze i najłatwiejsze do zrozumienia w następujący sposób:
źródło
Musisz to zrobić w następujący sposób:
źródło