都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

HttpClient

 SlideShareHttpClient のスライドを見つけました。.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の処理が簡潔に記述できます。担当しているプロジェクトで、かなりダメなコードを残してしまうところでした。フレームワークの機能追加などに素早くキャッチアップしていかなければいけませんね。