Actuellement, je travaille sur le wrapper de l'API. Si j'envoie un Consumer Key
incorrect, le serveur renverra Status
sous la forme 403 Forbidden
dans l'en-tête. Il passera également des en-têtes personnalisés. Comment puis-je récupérer ces en-têtes personnalisés?
C'est la réponse reçue du serveur.
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
J'ai besoin de récupérer le X-Error
et le X-Error-Code
. Actuellement, j'utilise la classe HttpClient
pour traiter la demande. Si je regarde les en-têtes répondre sous Quick Watch dans VS Studio 2012, je pourrais le trouver comme ceci
((System.Net.Http.Headers.HttpHeaders)(response.Headers)).headerStore["X-Error-Code"].ParsedValue
Y a-t-un autre moyen de faire ça?
Edit: headerStore
n'est pas accessible via le code car il s'agit d'un champ privé. Je n'y ai accès que par la fenêtre de surveillance rapide.
Voici mon extrait de code pour la demande:
var response = await _httpClient.PostAsync("/v3/oauth/request", content);
Eh bien, HttpResponseMessage.Headers
renvoie une HttpResponseHeaders
référence, vous devriez donc pouvoir utiliser GetValues()
string error = response.Headers.GetValues("X-Error").FirstOrDefault();
string errorCode = response.Headers.GetValues("X-Error-Code").FirstOrDefault();
Puisque le titre de la question est "Récupérer tous les en-têtes", je voulais ajouter une réponse à ce sujet.
Le HttpResponseMessage
renvoyé par les méthodes HttpClient
a deux propriétés d'en-tête:
HttpResponseMessage.Headers
est un HttpResponseHeaders
with en-tête de réponse génériqueHttpResponseMessage.Content.Headers
est une HttpContentHeaders
avec des en-têtes spécifiques au contenu tels que Content-Type
Les deux objets implémentent IEnumerable<KeyValuePair<string, IEnumerable<string>>
, vous pouvez donc facilement combiner tous les en-têtes avec quelque chose comme:
var responseMessage = await httpClient.GetAsync(url);
var headers = responseMessage.Headers.Concat(responseMessage.Content.Headers);
Juste un piège que j'ai trouvé en essayant de trouver un en-tête qui n'existait pas. Vous devez utiliser TryGetValues au lieu de GetValues car au moment de l'exécution, une exception sera levée si l'en-tête est introuvable. Vous utiliseriez quelque chose comme ce code:
IEnumerable<string> cookieHeader;
response.Headers.TryGetValues("Set-Cookie", out cookieHeader);
Cela fonctionne pour moi:
(String[])response.Headers.GetValues("X-Error"))[0]