Obtenir un UTF-8 réponse avec httpclient dans les applications du Windows Store
Je suis en train de construire une application du Windows Store, mais je suis coincé à l'obtention d'un UTF-8 de réponse à partir d'une API.
C'est le code:
using (HttpClient client = new HttpClient())
{
Uri url = new Uri(BaseUrl + "/me/lists");
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Add("Accept", "application/json");
HttpResponseMessage response = await client.SendRequestAsync(request);
response.EnsureSuccessStatusCode();
string responseString = await response.Content.ReadAsStringAsync();
response.Dispose();
}
La reponseString
contient toujours des personnages étranges qui devraient être des accents, comme é, et j'ai essayé d'utiliser un flux, mais l'API, j'ai trouvé dans certains exemples n'existe pas dans Windows RT.
Edit: amélioration du code, toujours le même problème.
Vous êtes complètement sûr de l'API que vous appelez des poignées non-ASCII texte correctement? (difficile de deviner à partir de votre code ce que vous appelez)
Il n'est pas clair du tout quel est le problème que vous décrivez. Attendez-vous UTF-8 réponse? Est le serveur qui envoie un? Pouvez-vous touché le service web directement à l'aide d'un violon pour voir de quoi il en retourne?
Est le Type de Contenu de l'en-tête de la réponse à la bonne valeur? Avez-vous essayé la méthode
Oui, dans le Chrome RESTE de la Console-je obtenir un bon UTF-8 réponse, les accents sont affichés là où ils devraient être.
Je ne sais pas comment utiliser Fiddler pour les requêtes HTTPS. Mais dans le Chrome RESTE de la Console, je vois un UTF-8 réponse.
Il n'est pas clair du tout quel est le problème que vous décrivez. Attendez-vous UTF-8 réponse? Est le serveur qui envoie un? Pouvez-vous touché le service web directement à l'aide d'un violon pour voir de quoi il en retourne?
Est le Type de Contenu de l'en-tête de la réponse à la bonne valeur? Avez-vous essayé la méthode
_client.GetStringAsync(url)
?Oui, dans le Chrome RESTE de la Console-je obtenir un bon UTF-8 réponse, les accents sont affichés là où ils devraient être.
Je ne sais pas comment utiliser Fiddler pour les requêtes HTTPS. Mais dans le Chrome RESTE de la Console, je vois un UTF-8 réponse.
OriginalL'auteur SamuelDebruyn | 2014-03-26
Vous devez vous connecter pour publier un commentaire.
Au lieu d'utiliser
response.Content.ReadAsStringAsync()
directement vous pouvez utiliserresponse.Content.ReadAsBufferAsync()
signalé par @Kiewic comme suit:Cela fonctionne dans mon cas, et je suppose que l'utilisation de l'utf-8 qui devrait résoudre la plupart des problèmes. Maintenant, allez savoir pourquoi il n'y a aucun moyen de le faire à l'aide de
ReadAsStringAsync
🙂Vous avez raison, il y avait une faute de frappe, la méthode est ReadAsBufferAsync. Je viens de fixe.
Je vais avoir ce problème, mais cela ne résout pas mon problème. Mon code fonctionne très bien .NET de Base, mais j'obtiens des caractères tronqués dans UWP.
OriginalL'auteur Camilo Martinez
J'aime El Marchewko de l'approche de l'utilisation d'une extension, mais le code ne fonctionne pas pour moi. Ce n':
OriginalL'auteur pius
Résolu comme ceci:
OriginalL'auteur Ogglas
La
HttpClient
ne vous donne pas beaucoup de flexibilité.Vous pouvez utiliser un
HttpWebRequest
au lieu et obtenir le raw d'octets de la réponse à l'aide deHttpWebResponse.GetResponseStream()
.Stream stream = await response.Content.ReadAsStreamAsync()
OriginalL'auteur BartW
Ne peux pas commenter encore, donc je vais ajouter mes pensées ici.
Vous pouvez essayer d'utiliser
_client.GetStringAsync(url)
@cremor suggéré, et l'ensemble de vos en-têtes d'authentification à l'aide de la_client.DefaultRequestHeaders
de la propriété.Alternativement, vous pouvez également essayer d'utiliser le
ReadAsByteArrayAsync
méthode sur laresponse.Content
de l'objet et de l'utilisationSystem.Text.Encoding
décoder tableau d'octets en une chaîne UTF-8.est pris en charge dans WinRT.
Le seul 3 options que je reçois quand je commence à taper la réponse.Contenu.Lire... sont
ReadAsBufferAsync
,ReadAsInputStreamAsync
etReadAsStringAsync
Oh vous êtes à l'aide de Wondows.Web.Http.HttpClient, puis ReadAsBuffer devrait fonctionner. vous pouvez convertir un beurre à un tableau d'octets.
OriginalL'auteur Wesley Cabus
Mon approche à l'aide d'une Extension:
OriginalL'auteur Jens Marchewka
Peut-être le problème, c'est que la réponse est zippé. Si le type de contenu est gzip, vous aurez besoin de décompresser la réponse à une chaîne. Certains serveurs le faire pour économiser de la bande passante qui est normalement très bien. Dans .NET de Base et probablement .NET Framework, ce sera automatiquement décompressez la réponse. Mais cela ne fonctionne pas dans UWP. Cela semble être un bug flagrant dans UWP pour moi.
Ce fil donne un exemple clair de la façon de décompresser la réponse:
La Compression/Décompression de la chaîne avec C#
OriginalL'auteur Melbourne Developer