web-dev-qa-db-ja.com

Windowsストアアプリでhttpclientを使用してUTF-8応答を取得する

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に存在しません。

編集:改善されたコード、それでも同じ問題。

11
Sam Debruyn

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を使用してこれを行う方法がない理由を理解してください:)

24
Camilo Martinez

このように解決しました:

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;
            }
    }
3
Ogglas

拡張機能を使用する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();
            }
        }
    }
}
3
pius

HttpClientは、あまり柔軟性がありません。

代わりにHttpWebRequestを使用し、HttpWebResponse.GetResponseStream()を使用して応答から生のバイトを取得できます。

1
BartW

おそらく問題は、応答が圧縮されていることです。コンテンツタイプがgzipの場合、応答を文字列に解凍する必要があります。一部のサーバーは、通常は問題ない帯域幅を節約するためにこれを行います。 .NETCoreおよびおそらく.NETFrameworkでは、これにより応答が自動的に解凍されます。ただし、これはUWPでは機能しません。これは、私にはUWPの明白なバグのように思えます。

string responseString = await response.Content.ReadAsStringAsync();

このスレッドは、応答を解凍する方法の明確な例を示しています。

C#の圧縮/解凍文字列

1

まだコメントできないので、ここに私の考えを追加する必要があります。

@cremorが提案するように_client.GetStringAsync(url)を使用し、_client.DefaultRequestHeadersプロパティを使用して認証ヘッダーを設定することができます。または、response.ContentオブジェクトでReadAsByteArrayAsyncメソッドを使用し、System.Text.Encodingを使用してそのバイト配列をUTF-8文字列にデコードすることもできます。

0
Wesley Cabus

拡張機能を使用した私のアプローチ:

    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();
                }
            }
        }
    }
0
Jens Marchewka