Immer eine UTF-8-Antwort mit httpclient in Windows Store-apps
Ich bin erstellen einer Windows Store-app, aber ich bin stecken auf immer ein UTF-8-Antwort von einer API.
Dies ist der 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();
}
Den reponseString
enthält immer seltsame Zeichen, die sollte Akzenten wie é, und ich habe versucht, mit einem stream, aber die API fand ich in einigen Beispielen nicht vorhanden sind in Windows RT.
Edit: code verbessert, immer noch dasselbe problem.
- Sind Sie völlig sicher API, die Sie aufrufen, Griffe nicht-ASCII-text korrekt? (schwer zu erraten, aus dem code, was Sie nennen)
- Es ist nicht klar, was das problem ist, das du da beschreibst. Erwartest du einen UTF-8-Antwort? Ist der server sendet einen? Können Sie schlagen den web service direkt mit Fiddler sehen, was es zurück?
- Ist der Content-Type-header der Antwort auf den korrekten Wert gesetzt? Haben Sie versucht, die Methode
_client.GetStringAsync(url)
? - Ja, in der Chrome-REST-Konsole bekomme ich einen guten UTF-8-Antwort, die Akzente sind, wo Sie sein sollten.
- Ich weiß nicht, wie Fiddler für HTTPS-Anfragen. Aber in der Chrom-REST-Konsole sehe ich ein UTF-8-Antwort.
- Das versucht. Gleiches problem :/
- Sind Sie vielleicht anrufen, eine REST-api .NET standard dll, auf die verwiesen wird, die von UWP? Keine der Antworten hier haben mir geholfen. Der eine markiert die Antwort definitiv nicht helfen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstatt
response.Content.ReadAsStringAsync()
direkt könnten Sieresponse.Content.ReadAsBufferAsync()
Spitzen von @Kiewic wie folgt:Dies ist die Arbeit in meinem Fall und ich denke, dass die Verwendung von UTF8 sollte lösen die meisten Probleme. Jetzt gehen Sie Figur, warum es keine Möglichkeit gibt, dies zu tun mit
ReadAsStringAsync
🙂Ich mag El Marchewko ' s Ansatz, eine Erweiterung, aber der code hat nicht funktioniert für mich. Dies Tat:
Löste es so:
Den
HttpClient
nicht geben Ihnen viel Flexibilität.Können Sie eine
HttpWebRequest
statt und die roh-Byte aus der Reaktion mitHttpWebResponse.GetResponseStream()
.Stream stream = await response.Content.ReadAsStreamAsync()
Vielleicht das problem ist, dass die Antwort ist gezippt. Wenn der content-Typ ist gzip, müssen Sie entpacken Sie die Antwort in einen string. Manche Server tun dies, um Bandbreite zu sparen, das normalerweise in Ordnung. In .NET Core und wahrscheinlich .NET Framework, diese werden automatisch entpacken Sie die Antwort. Aber das funktioniert nicht in der UWP. Dies scheint ein krasser Fehler in der UWP zu mir.
Dieser thread gibt ein klares Beispiel dafür, wie, um Dekomprimieren Sie die Antwort:
Kompression/Dekompression-Zeichenfolge mit C#
HttpClient.DefaultRequestHeaders.Add("*Accept-Encoding*", "gzip, deflate, br");
und es hat gut funktioniert danach.Nicht kommentieren noch, also werde ich haben, um meine Gedanken hier.
Könnten Sie versuchen, zu verwenden
_client.GetStringAsync(url)
wie @cremor vorgeschlagen, und legen Sie die Authentifizierungs-Header mit der_client.DefaultRequestHeaders
Eigenschaft.Alternativ könnte man auch versuchen, die
ReadAsByteArrayAsync
Methode auf dieresponse.Content
Objekt und verwenden SieSystem.Text.Encoding
zu entschlüsseln, das byte-array in eine UTF-8-string.ReadAsBufferAsync
,ReadAsInputStreamAsync
undReadAsStringAsync
Mein Ansatz durch eine Erweiterung: