.NET Framework HttpClientクラスを利用し、shift-jisのレスポンスを受け取る

.NET Frameworkでは、インターネットにアクセスするためのクラスが数多く用意されています。
  • WebRequest
  • HttpWebRequest
  • WebClient
  • HttpClient
前者の3つは古くからあるものですが、最後のHttpClientクラスは .NET 4.5から利用できる新しいクラスです。ネットでURLにアクセスする方法を調べると、その多くは前者について語られています。新しいHttpClientは他のものと利用方法が若干異なり、完全な形でソースコードを公開しているサイトが少ないため、初めて利用する方は戸惑ってしまうでしょう。今回はその利用方法を紹介したいと思います。またPOSTでリクエストする方法や、レスポンスの文字コードがshift-jisであった場合の対応方法についても併せて紹介します。

HttpClientの利用方法

GETによるリクエスト

HttpClientの名前空間は System.Net.Http です。このimportを忘れないようにしましょう。URLにGETでアクセスするときは、GetStringAsyncメソッドの実行だけでコンテンツ(ボディ)を取得することができます。非常にシンプルですね。
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace GB
{
    class Program
    {
        static void Main(string[] args)
        {
            // リクエスト送信
            var webTask = HttpAccessAsync();
            webTask.Wait();

            // レスポンスを取得
            Console.WriteLine(webTask.Result);
        }

        private static async Task<string> HttpAccessAsync()
        {
            string url = "http://example.com";

            using (var client = new HttpClient())
            {
                try
                {
                    // Webアクセス(GET)
                    return await client.GetStringAsync(url);
                }
                catch (Exception)
                {
                    return null;
                }
            }
        }
    }
}

POSTによるリクエスト

次はPOSTでアクセスしてみます。この場合、PostAsyncメソッドを利用します。そして取得したContentに対してReadAsStringAsyncメソッドを実行することにより、コンテンツ(ボディ)を取得することができます。上記のHttpAccessAsyncメソッドを次のように修正して下さい。
        private static async Task<string> HttpAccessAsync()
        {
            string url = "http://example.com";

            var data = new Dictionary<string, string>
            {
                { "key1", "value1" },
                { "key2", "value2" }
            };
            var content = new FormUrlEncodedContent(data);

            using (var client = new HttpClient())
            {
                try
                {
                    // Webアクセス(POST)
                    var res = await client.PostAsync(url, content);
                    return await res.Content.ReadAsStringAsync();
                }
                catch (Exception)
                {
                    return null;
                }
            }
        }

文字コードがshift-jisのレスポンス

上記のReadAsStringAsyncメソッドでコンテンツを取得できるのは、文字コードがUTF-8の場合のみです。もしShift-JISの文字コードが利用されていた場合、取得時にエラーになってしまいます。そのため、StreamReaderクラスを用い適した文字コードで読み込む必要があります。下記は、文字コードをshift-jisとした例です。上記のHttpAccessAsyncメソッドを次のように修正して下さい。
        private static async Task<string> HttpAccessAsync()
        {
            string url = "http://example.com";

            var data = new Dictionary<string, string>
            {
                { "key1", "value1" },
                { "key2", "value2" }
            };
            var content = new FormUrlEncodedContent(data);

            using (var client = new HttpClient())
            {
                try
                {
                    // Webアクセス(POST)
                    var res = await client.PostAsync(url, content);

                    // エンコード対応
                    var enc = Encoding.GetEncoding("shift-jis");
                    using (var stream = await res.Content.ReadAsStreamAsync())
                    using (var reader = new StreamReader(stream, enc, true) as TextReader)
                    {
                        return await reader.ReadToEndAsync();
                    }
                }
                catch (Exception)
                {
                    return null;
                }
            }
        }

まとめ

HttpClientクラスは後発だけあって、シンプルに記述することができますが、文字コードなど一筋縄でいかないこともあります。個人的には、このHttpClientクラスが利用しやすいので、これで統一されることを望んでいます。
» お仕事のご依頼はこちら