2013-05-01 13 views
14

Obecnie pracuję nad wrapper API. Jeśli wyślę zły kod: Consumer Key, serwer zwróci Status jako 403 Forbidden w nagłówku. Przekaże także niestandardowe nagłówki. Jak faktycznie pobrać te niestandardowe nagłówki?HttpClient pobrać wszystkie nagłówki

To jest odpowiedź otrzymana z serwera.

Cache-Control: private 
Date: Wed, 01 May 2013 14:36:17 GMT 
P3P: policyref="/w3c/p3p.xml", CP="ALL CURa ADMa DEVa OUR IND UNI COM NAV INT STA PRE" 
Server: Apache/2.2.23 (Amazon) 
Status: 403 Forbidden 
X-Error: Invalid consumer key. 
X-Error-Code: 152 
X-Powered-By: PHP/5.3.20 
Connection: keep-alive 

muszę odzyskać X-Error i X-Error-Code. Obecnie używam klasy HttpClient do przetwarzania żądania. Jeśli mogę oglądać nagłówki odpowiedzi pod Szybkie Watch w VS Studio 2012, mogę go znaleźć jak ten

((System.Net.Http.Headers.HttpHeaders)(response.Headers)).headerStore["X-Error-Code"].ParsedValue

Czy jest jakiś inny sposób to zrobić?

Edytuj: headerStore jest niedostępny przez kod, ponieważ jest to pole prywatne. Dostaję do niego dostęp tylko przez okno Szybkiego oglądania.

To jest mój urywek na żądanie:

var response = await _httpClient.PostAsync("/v3/oauth/request", content); 

Odpowiedz

28

No HttpResponseMessage.Headers zwraca referencję HttpResponseHeaders, więc powinieneś być w stanie korzystać GetValues()

string error = response.Headers.GetValues("X-Error").FirstOrDefault(); 
string errorCode = response.Headers.GetValues("X-Error-Code").FirstOrDefault(); 
+0

Nie, nie mogę tego zrobić, jak bym tego błędu 'Error 3Cannot stosuje indeksowanie z [] w celu wyrażenia typu System.Net.Http.Headers.HttpResponseHeaders''. Zaktualizuję powyższy kod, aby uzyskać jasność. –

+0

@ShulhiSapli: Ah - nie zauważyłem, że był to "HttpClient". Dokona edycji. –

+0

Jeśli potrzebujesz więcej szczegółów, możesz zajrzeć tutaj, https://github.com/shulhi/PocketNet/blob/dev/PocketNet/PocketNet/Authenticator/PocketOauth.cs –

8

Just a Gotcha które znalazłem podczas próby znaleźć nagłówek, który nie istnieje. Powinieneś użyć TryGetValues ​​zamiast GetValues, ponieważ w czasie wykonywania wyrzuci wyjątek, jeśli nagłówek nie zostanie znaleziony. Można by użyć coś jak ten kod:

IEnumerable<string> cookieHeader; 
response.Headers.TryGetValues("Set-Cookie", out cookieHeader); 
10

Od tytule pytanie brzmi „pobrać wszystkie nagłówki”, chciałem dodać odpowiedź w odniesieniu do tego.

W HttpResponseMessage zwracane przez HttpClient metod ma dwie właściwości nagłówka:

  • HttpResponseMessage.Headers JEST HttpResponseHeaders generycznych nagłówków odpowiedzi
  • HttpResponseMessage.Content.Headers jest HttpContentHeaders z nagłówkami specyficznych dla treści, jak Content-Type

Zarówno obiekty implementują IEnumerable<KeyValuePair<string, IEnumerable<string>>, dzięki czemu można z łatwością łączyć wszystkie elementy Nagłówki E o coś takiego:

var responseMessage = await httpClient.GetAsync(url); 
var headers = responseMessage.Headers.Concat(responseMessage.Content.Headers); 
+0

To tworzy bardzo skomplikowany typ dla zmiennej nagłówka.W jaki sposób uzyskać dane do łańcucha lub prostej kolekcji? –

+0

@JamieMarshall Ponieważ umieszcza wszystko w parach IEnumerable of key/value, powinieneś być w stanie użyć pętli foreach, aby przejść przez połączoną listę. Kluczem każdej pary jest nazwa nagłówka, a wartość każdej pary jest listą wartości nagłówków. –

+0

Warto zauważyć, że aby "Concat" działał, musisz upewnić się, że dodajesz 'using System.Linq;' –

1

Działa to dla mnie:

(String[])response.Headers.GetValues("X-Error"))[0] 
+0

Jestem ciekawy z powodu głosowania w dół na tę Nisse. Zawarłem go tutaj jako jego z aplikacji konsolowej, z której korzystam. – nmishr

Powiązane problemy