HttpClient
SlideShare で HttpClient のスライドを見つけました。.NETFramework 4.0 であれば、通常 WebClient を使用するかと思います。neuecc さんのスライドにある通り、WebRequest クラスを利用して、POST処理とかやろうとすると下記のような感じになります。※ソースコードはここから引用しました。
---------
using System;
using System.IO;
using System.Net;
using System.Web;
using System.Text;
using System.Collections;
namespace ConsoleApplication
{
public class GoogleTranslate
{
static void Main()
{
Encoding enc = Encoding.UTF8;
string input = "私は普通のC#プログラマです。";
string url = "http://translate.google.com/translate_t";
string param = "";
// ポスト・データの作成
Hashtable ht = new Hashtable();
ht["text"] = HttpUtility.UrlEncode(input, enc);
ht["langpair"] = "ja|en";
ht["hl"] = "en";
ht["ie"] = "UTF8";
foreach (string k in ht.Keys)
{
param += String.Format("{0}={1}&", k, ht[k]);
}
byte[] data = Encoding.ASCII.GetBytes(param);
// リクエストの作成
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = data.Length;
// ポスト・データの書き込み
Stream reqStream = req.GetRequestStream();
reqStream.Write(data, 0, data.Length);
reqStream.Close();
// レスポンスの取得と読み込み
WebResponse res = req.GetResponse();
Stream resStream = res.GetResponseStream();
StreamReader sr = new StreamReader(resStream, enc);
string html = sr.ReadToEnd();
sr.Close();
resStream.Close();
}
}
}
---------
コードが非常に煩雑です。私も同様のコードを書いてしまった経験があります。
.NETFramework4.5 になると、HttpClient, FormUrlEncodedContent および async, await を使用して非常に簡潔に記述することが可能です。引用したソースコードを HttpClient, FormUrlEncodedContent および async, await 版にすると下記のような感じになります。( Windows Form ベースで記述しています。)
---- HttpClient, FormUrlEncodedContent および async, await版 ----
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Web;
using System.Net.Http;
using System.Threading.Tasks;
namespace HttpClientSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var response = GetHtmlContent();
}
private async Task<string> GetHtmlContent()
{
string input = "私は普通のC#プログラマです。";
var enc = Encoding.UTF8;
var httpClient = new HttpClient();
var content = new FormUrlEncodedContent(new Dictionary<string, string>
{
{"text",HttpUtility.UrlEncode(input, enc)},
{"langpair","ja|en"},
{"hl","en"
{"ie","UTF8"}
});
var response = await httpClient.PostAsync("http://translate.google.com/translate_t", content);
return await response.Content.ReadAsStringAsync();
}
}
}
---- HttpClient, FormUrlEncodedContent および async, await版 ----
POSTの処理が簡潔に記述できます。担当しているプロジェクトで、かなりダメなコードを残してしまうところでした。フレームワークの機能追加などに素早くキャッチアップしていかなければいけませんね。