.net column
.NET開発者のためのブログメディア

ASP.NET Coreのイメージ

C#で簡単にPOST送信する方法を解説!

2020年08月25日
SE
C#でPOST送信するにはどのようにすればいいのでしょうか。
PM
それでは、C#でPOST送信する方法について説明いたしましょう。

C#によるPOST送信とは


C#によるPOST送信の方法を解説する前に、まずPOSTとは何なのかを簡単に説明します。インターネットではHTTPと言うプロトコル(通信のルール)が使用されていますが、HTTPのデータの送信方法にはGETとPOSTの2種類があります。

GETの場合はURLにパラメータが付与されています。URLの後ろの方に?id=123&param1=456&param2=789…のように文字が連なっていることがありますが、これがGET送信のパラメータです。

対してPOST送信はそれが無く、パスワードなど見せたくないパラメータを目に見えないように送ることが出来るのです。今回はC#によるPOST送信の方法を解説しましょう。

WebRequestを使用したPOST送信のサンプル

以下がC#によるPOST送信のサンプルです。なおソースの先頭には、
using System.Text;
using System.Web;
using System.Net;
using System.IO;
を記述してください。

Encoding encode = Encoding.GetEncoding(“UTF-8”);
string postStr = “param1=” + HttpUtility.UrlEncode(“第一パラメーター”, encode)
+ “&param2=” + HttpUtility.UrlEncode(“第二パラメーター”, encode);
byte[] postBytes = Encoding.ASCII.GetBytes(postStr);

WebRequest request = WebRequest.Create(“http://(どこかのWebサイトのURL)”);
request.Method = “POST”;
request.ContentLength = postBytes.Length;
request.ContentType = “application/x-www-form-urlencoded”;
Stream reqStream = request.GetRequestStream();
// 送信する
reqStream.Write(postBytes, 0, postBytes.Length);
reqStream.Close();
// 受信する
WebResponse response = request.GetResponse();
Stream resStream = response.GetResponseStream();
StreamReader reader = new StreamReader(resStream, encode);
Console.WriteLine(reader.ReadToEnd());
reader.Close();

POST送信用のパラメータを作成し、WebRequestを生成する

上のC#サンプルを解説します。まずUTF-8の文字コードで文字列変数のpostStrにPOST送信するパラメータを設定しています。「パラメータ名=パラメータの値」を&でつなげば複数設定することができます。

そしてpostStrをアスキーコード変換してバイト型配列postBytesにします。次にPOST送信するURLを設定したWebRequestを生成します。

送信前にプロトコルメソッドやContentTypeを設定

WebReqeustのMethodにはプロトコルメソッドの”POST”、ContentLengthには送信バイト数としてpostBytesの長さ、ContentTypeには”application/x-www-form-urlencoded”を設定しています。

この長い文字列はテキスト送信をするためのシンプルなContentTypeで、&や=でパラメータを設定するルールはこれによって定められています。なおバイナリファイルをアップロードする場合は”multipart/form-data”が使用されます。

Writeで送信し、その後GetResposeで応答を受け取る

そしてWebRequestのGetRequestStreamで出力Streamを取得し、Writeで送信します。送信後はCloseします。その後、GetResponse()でレスポンス(応答)を取得して、その結果を表示しています。

これを実行すると、WebRequest.Createで指定したURLのWebサイトのHTMLソースが表示されます。ただし文字コードがUTF-8ではなくShift_JISなどのサイトの場合は、日本語は文字化けしてしまうでしょう。

Webサイトの文字コードはUTF-8を使用するべき

このC#サンプルの最初でEncoding.GetEncoding(“Shift_JIS”);とすればShift_JISにも対応できます。ただし.Net FrameworkはバージョンによってはShift_JISに対応していません。日本向けのWindowsPCで動かしていてもそういったケースがあります。

非対応の.NetでShift-JISを使うには追加設定が必要で、少し手間がかかります。またインターネットは世界中に公開されるのですから、UTF-8などの世界標準の文字コードを使うべきです。

例えばWordPressでブログを作成するとUTF-8で作成されます。そういった理由でShift-JISでWebサイトを作るのは避けた方がよいでしょう。

POSTパラメータの内容をPHPで確認する

ここまで読んで、「これではPOSTで正しくパラメータを送れたかどうかわからない」と思う人が多いでしょう。それを確認するにはサーバ側でテスト用のページを作る必要があります。

レンタルサーバやXAMPP環境がある人は、以下のPHPコードをサーバに置いて、今回のC#サンプルのWebRequest.CreateにURLを指定してアクセスしてください。

<html>
<head>
<meta charset=”UTF-8″>
<title>Test Page</title>
</head>
<body>
<?php
echo $_POST[“param1”] . “<br />” . $_POST[“param2”];
?>
</body>
</html>

WebClientを使うとコンパクトに

今回のC#サンプルで上のPHPのページにアクセスすると、「第一パラメーター<br />第二パラメーター」と返ってきます。サーバにPOSTのパラメータparam1とparam2が正しく送信されていることが確認できますね。

なおここまでのC#サンプルはWebClientを使うと以下のようにコンパクトに書けます。ただし文字コードはUTF-8限定となります。ソースの先頭には「using System.Collections.Specialized;」を記述してください。

WebClient client = new WebClient();
NameValueCollection collection = new NameValueCollection();
collection.Add(“param1”, “第一パラメーター”);
collection.Add(“param2”, “第二パラメーター”);
byte[] resBytes = client.UploadValues(“http://(どこかのWebサイトのURL)”, collection);
client.Dispose();
Console.WriteLine(Encoding.UTF8.GetString(resBytes));

SE
ありがとうございます。よくわかりました。
PM
C#ならPOST送信を簡単にインターネットの通信が行えるようになります。

C#ならPOST送信を簡単に行える

C#によるPOST送信を紹介しました。

意外と簡単にインターネットの通信が行えると感じたと思われます。
是非C#でインターネットのWebサイトにアクセスする便利なプログラムを作成してみてください。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags