SQLの窓

2013年10月29日


Framework4(C#) : WebClient で Post と Get する汎用 static クラス

テストしたのは、Windows7 + Visual Studio 2010 + WPF アプリケーションです。

Web アクセスには、UrlEncode が必要になりますが、HttpUtility.UrlEncode はプロジェクトのプロパティで、『.NET Framework 4』にして System.Web を参照します。最初にプロジェクトを作成した場合、『.NET Framework 4 Client Profile』にセットされている場合があり、その場合  System.Web を参照できません。

HttpUtility.UrlEncode は、Windows Phone(OS 7.1) にもある事はあるのですが、エンコード結果が UTF-8 系列しか指定できないので、Encoding を指定する第二引数がありません。参照も、System.Windows の中の System.Net にあります。ですから、このクラスは Windows Phone(OS 7.1) では使用できません。

%エンコーディングの仕様が違いますが、WEB へ送信する場合は、Uri.EscapeDataString でも使用可能で、Twitter への投稿ではこちら(RFC 3986)が良いと思いますが、文字列は UTF-8 に変換されてエンコーディングされます。
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Web;

namespace winofsql {

	class Tool {

        public static string serverEncoding = "utf-8";

		// *********************************************
		// UTF-8 POST
		// *********************************************
		public static string Post(string url,
            Dictionary<string, string> param,
            UploadStringCompletedEventHandler UploadStringCompleted=null) {

			string result = "";

			try {
				WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if ( UploadStringCompleted != null ) {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.UploadStringCompleted += UploadStringCompleted;
                }

                webClient.Headers["Content-Type"] = "application/x-www-form-urlencoded";

                string data_string = "";

                foreach (KeyValuePair<string, string> kvp in param)
                {
                    if (data_string != "")
                    {
                        data_string += "&";
                    }
                    data_string += kvp.Key + "=";

            		// *******************************************************
                    // プロジェクトのプロパティの対象フレームワークを 
                    //『Framework 4』 にして System.Web を参照します
            		// *******************************************************
                    data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.UTF8);
                }
                
                webClient.UploadStringAsync(new Uri(url), "POST", data_string);

			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

            return result;

		}

		// *********************************************
		// エンコード指定 POST
		// *********************************************
		public static string Post(string url,
            string encoding,
            Dictionary<string, string> param,
            UploadStringCompletedEventHandler UploadStringCompleted=null) {

			string result = "";

			try {
				WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if ( UploadStringCompleted != null ) {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.UploadStringCompleted += UploadStringCompleted;
                }

                webClient.Headers["Content-Type"] = "application/x-www-form-urlencoded";

                string data_string = "";

                foreach (KeyValuePair<string, string> kvp in param)
                {
                    if (data_string != "")
                    {
                        data_string += "&";
                    }
                    data_string += kvp.Key + "=";

            		// *******************************************************
                    // プロジェクトのプロパティの対象のフレームワークを 
                    //『.NET Framework 4』 にして System.Web を参照します
            		// *******************************************************
                    data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.GetEncoding(encoding));
                }
                
                webClient.UploadStringAsync(new Uri(url), "POST", data_string);

			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

            return result;

		}

		// *********************************************
		// URL のみ呼び出し GET
		// *********************************************
		public static string Get(
            string url,
            DownloadStringCompletedEventHandler DownloadStringCompleted=null) {

			string result = "";

			try {
				WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if ( DownloadStringCompleted != null ) {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.DownloadStringCompleted += DownloadStringCompleted;
                }

                webClient.DownloadStringAsync(new Uri(url));

			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

            return result;

		}

		// *********************************************
		// データ呼び出し( UTF-8 ) GET
		// *********************************************
		public static string Get(
            string url, 
            Dictionary<string, string> param,
            DownloadStringCompletedEventHandler DownloadStringCompleted=null) {

            string result = "";

            try
            {
                WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if (DownloadStringCompleted != null)
                {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.DownloadStringCompleted += DownloadStringCompleted;
                }

                string data_string = "";

                foreach (KeyValuePair<string, string> kvp in param)
                {
                    if (data_string != "")
                    {
                        data_string += "&";
                    }
                    data_string += kvp.Key + "=";

                    // *******************************************************
                    // プロジェクトのプロパティの対象フレームワークを 
                    //『Framework 4』 にして System.Web を参照します
                    // *******************************************************
                    data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.UTF8);
                }

                webClient.DownloadStringAsync(new Uri(url + "?" + data_string));

            }
            catch (Exception Err)
            {
                result = "ERROR: " + Err.Message;
            }

            return result;

		}

		// *********************************************
		// データ呼び出し( エンコード指定 ) GET
		// *********************************************
		public static string Get(
            string url,
            string encoding,
            Dictionary<string, string> param,
            DownloadStringCompletedEventHandler DownloadStringCompleted=null) {

            string result = "";

            try
            {
                WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if (DownloadStringCompleted != null)
                {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.DownloadStringCompleted += DownloadStringCompleted;
                }

                string data_string = "";

                foreach (KeyValuePair<string, string> kvp in param)
                {
                    if (data_string != "")
                    {
                        data_string += "&";
                    }
                    data_string += kvp.Key + "=";

                    // *******************************************************
                    // プロジェクトのプロパティの対象フレームワークを 
                    //『Framework 4』 にして System.Web を参照します
                    // *******************************************************
                    data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.GetEncoding(encoding));
                }

                webClient.DownloadStringAsync(new Uri(url + "?" + data_string));

            }
            catch (Exception Err)
            {
                result = "ERROR: " + Err.Message;
            }

            return result;

		}

	}
}


使用方法のサンプル
Tool.serverEncoding = "utf-8";
Tool.Post("http://student.xii.jp/lightbox/php_sample_1/log.php",
	"utf-8",
	new Dictionary<string, string>() { { "send", "ok" }, { "text", "日本語" } },
(object _sender, UploadStringCompletedEventArgs _e) =>
{
	// Error プロパティがセットされているとエラー
	if (_e.Error != null)
	{
		// エラー処理
	}
	// 正常な結果
	else
	{
		// 正常処理
	}
});

関連する記事

Framework4.5(C#)ストア : HttpClient で Post と Get する汎用 static クラス
Framework4(C#) : Windows Phone OS 7.1 : WebClient で Post と Get する汎用 static クラス
Android で Post と Get

いろいろな言語におけるバーセントエンコーディング





【VS(C#)の最新記事】
posted by lightbox at 2013-10-29 21:01 | VS(C#) | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり