.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クラスが利用しやすいので、これで統一されることを望んでいます。