Windowsストアアプリを作成していますが、APIからUTF-8応答を取得するのに行き詰まっています。
これはコードです:
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();
}
reponseString
には常に、éのようなアクセントであるはずの奇妙な文字が含まれており、ストリームを使用してみましたが、いくつかの例で見つけたAPIがWindowsRTに存在しません。
編集:改善されたコード、それでも同じ問題。
response.Content.ReadAsStringAsync()
を直接使用する代わりに、@ Kiewicが指すresponse.Content.ReadAsBufferAsync()
を次のように使用できます。
var buffer = await response.Content.ReadAsBufferAsync();
var byteArray = buffer.ToArray();
var responseString = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
私の場合、これは機能しており、UTF8を使用するとほとんどの問題を解決できると思います。ここで、ReadAsStringAsync
を使用してこれを行う方法がない理由を理解してください:)
このように解決しました:
using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage response = client.GetAsync(url).Result)
{
var byteArray = response.Content.ReadAsByteArrayAsync().Result;
var result = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
return result;
}
}
拡張機能を使用するElMarchewkoのアプローチは気に入っていますが、コードが機能しませんでした。これはしました:
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace WannaSport.Data.Integration
{
public static class HttpContentExtension
{
public static async Task<string> ReadAsStringUTF8Async(this HttpContent content)
{
return await content.ReadAsStringAsync(Encoding.UTF8);
}
public static async Task<string> ReadAsStringAsync(this HttpContent content, Encoding encoding)
{
using (var reader = new StreamReader((await content.ReadAsStreamAsync()), encoding))
{
return reader.ReadToEnd();
}
}
}
}
HttpClient
は、あまり柔軟性がありません。
代わりにHttpWebRequest
を使用し、HttpWebResponse.GetResponseStream()
を使用して応答から生のバイトを取得できます。
おそらく問題は、応答が圧縮されていることです。コンテンツタイプがgzipの場合、応答を文字列に解凍する必要があります。一部のサーバーは、通常は問題ない帯域幅を節約するためにこれを行います。 .NETCoreおよびおそらく.NETFrameworkでは、これにより応答が自動的に解凍されます。ただし、これはUWPでは機能しません。これは、私にはUWPの明白なバグのように思えます。
string responseString = await response.Content.ReadAsStringAsync();
このスレッドは、応答を解凍する方法の明確な例を示しています。
まだコメントできないので、ここに私の考えを追加する必要があります。
@cremorが提案するように_client.GetStringAsync(url)
を使用し、_client.DefaultRequestHeaders
プロパティを使用して認証ヘッダーを設定することができます。または、response.Content
オブジェクトでReadAsByteArrayAsync
メソッドを使用し、System.Text.Encoding
を使用してそのバイト配列をUTF-8文字列にデコードすることもできます。
拡張機能を使用した私のアプローチ:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Web.Http;
namespace yourfancyNamespace
{
public static class IHttpContentExtension
{
public static async Task<string> ReadAsStringUTF8Async(this IHttpContent content)
{
return await content.ReadAsStringAsync(Encoding.UTF8);
}
public static async Task<string> ReadAsStringAsync(this IHttpContent content, Encoding encoding)
{
using (TextReader reader = new StreamReader((await content.ReadAsInputStreamAsync()).AsStreamForRead(), encoding))
{
return reader.ReadToEnd();
}
}
}
}