kazuakix の日記

Windows Phone とか好きです

System.Net.Http.HttpClient から Windows.Web.Http.HttpClient への切り替えのメモ

しばらく放置していたコードの Web アクセス部分 (HttpClient) を
System.Net.Http.HttpClientWindows.Web.Http.HttpClient に置き換えています。

読み込みの基本

基本的には System.Net.Http のときと同じ。GetAsync() に渡すパラメーターが文字列でも OK だったのが Uri で指定しないといけないくらい。

using (var req = new HttpClient())
{
    using (var res = await req.GetAsync("http://~"))
    {
        if (!res.IsSuccessStatusCode) return;

        // 読み込み
        var result = await res.Content.ReadAsStringAsync();
    }
}
using (var req = new HttpClient())
{
    using (var res = await req.GetAsync(new Uri("http://~")))
    {
        if (!res.IsSuccessStatusCode) return;

        // 読み込み
        var result = await res.Content.ReadAsStringAsync();
    }
}

あと HTTP ステータスコードを調べようと思ったら HttpStatusCode.OK が HttpStatusCode.Ok になっているという地味な嫌がらせがありました。以前は 2 文字の単語は大文字を続けるみたいな感じだったような気がするのですが、最近は R# 先生も含めて大文字は先頭だけな感じなんでしょうか?

ストリームとして読みたい

ReadAsStreamAsync() 一発だったのが ReadAsBufferAsync() したものを AsStream() するような感じになります。

using (var req = new HttpClient())
{
    using (var res = await req.GetAsync("http://~"))
    {
        if (!res.IsSuccessStatusCode) return;

        // Stream 取得
        var stream = await res.Content.ReadAsStreamAsync();
    }
}
using (var req = new HttpClient())
{
    using (var res = await req.GetAsync(new Uri("http://~")))
    {
        if (!res.IsSuccessStatusCode) return;

        // Stream 取得
        var stream = (await res.Content.ReadAsBufferAsync()).AsStream();
    }
}

ちょっと冗長...というかカッコ悪い書き方な気がしますね。

リクエストヘッダを追加したい

こちらは以前と同じように HttpClient.DefaultRequestHeaders に Add してやれば OK 。

using (var req = new HttpClient())
{
    req.DefaultRequestHeaders.Add("If-None-Match", "\"30842c-d861-50dda4a694d80\"");

ただ、以前は HttpClient を継承して決まりきった処理を行っていたのですが、Windows.Web.Http.HttpClient はサブクラスが作れないようなので ちょっとだけコードを修正しています。

HTTP 圧縮

以前は HttpClientHandler を指定することで HTTP 圧縮に対応することができました。

Windows.Web.Http.HttpClient だと指定する方法がないな...と思っていたのですが、実際に通信している様子を見ると何もしなくても HTTP 圧縮が有効になっているようです。

f:id:kazuakix:20150131142143j:plain,w500

とりあえずやりたい事は全部できそうな感じなので地道に書き換えていこうと思います。