JavaScriptでXMLHttpRequestを利用してデータをPOSTで送信するコードを紹介します。
プログラム
コード
PostForm.html
HTMLのフォームは以下のコードを記述します。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script language="javascript" type="text/javascript">
function OnButtonClick() {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
var READYSTATE_COMPLETED = 4;
var HTTP_STATUS_OK = 200;
if (this.readyState == READYSTATE_COMPLETED && this.status == HTTP_STATUS_OK) {
// レスポンスの表示
var outFrame = document.getElementById('output');
outFrame.innerHTML = this.responseText;
}
}
var textBox1 = document.getElementById('Text1');
var textBox2 = document.getElementById('Text2');
var PostData = encodeURIComponent('data1') + '=' + encodeURIComponent(textBox1.value)
+ '&' + encodeURIComponent('data2') + '=' + encodeURIComponent(textBox2.value);
PostData = PostData.replace(/%20/g, '+');
xmlhttp.open('POST', 'UploadHandler.ashx');
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlhttp.send(PostData);
}
</script>
</head>
<body>
<input id="Text1" type="text" /><br/>
<input id="Text2" type="text" /><br />
<input id="Button1" type="button" value="送信" onclick="OnButtonClick();"/>
<div id="output"></div>
</body>
</html>
解説
"Button1"をクリックするとOnButtonClick()関数を実行する実装になっています。ボタンクリック時のコード実行については
こちらを参照してください。
OnButtonClick()関数
var xmlhttp = new XMLHttpRequest();
XMLHttpRequestのインスタンスを作成します。
xmlhttp.onreadystatechange = function () {
var READYSTATE_COMPLETED = 4;
var HTTP_STATUS_OK = 200;
if (this.readyState == READYSTATE_COMPLETED && this.status == HTTP_STATUS_OK) {
// レスポンスの表示
var outFrame = document.getElementById('output');
outFrame.innerHTML = this.responseText;
}
}
onreadystatechange イベントを実装し、完了時の処理を実装します。今回の実装では、ポスト後サーバーからのレスポンス情報をid=outputのタグの場所にHTML形式で表示します。
var textBox1 = document.getElementById('Text1');
var textBox2 = document.getElementById('Text2');
var PostData = encodeURIComponent('data1') + '=' + encodeURIComponent(textBox1.value)
+ '&' + encodeURIComponent('data2') + '=' + encodeURIComponent(textBox2.value);
PostData = PostData.replace(/%20/g, '+');
テキストボックスの値を取得し、POSTするデータを作成します。POSTデータの形式は
値が一つの場合は
(値名)=(値)
となり、値が複数の場合は、
(値名1)=(値1)&(値名2)=(値2)&(値名3)=(値3)...
となります。
値名、値はURLエンコードするため、値をencodeURIComponent()関数の引数に与え戻り値をPOSTするデータに利用します。
作成したデータの"%20"は"+"に置換します。空白は"%20"のままでも問題はないため、この処理は無くても動作します。
xmlhttp.open('POST', 'UploadHandler.ashx');
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlhttp.send(PostData);
XMLHttpRequestの接続を開き、指定したURLに情報をポストします。
UploadHandler.aspx
POSTされた情報を受け取る側は、今回はASP.NETのジェネリック ハンドラーを利用します。
ジェネリックハンドラーのコードは以下になります。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace XMLHttpRequestPost
{
/// <summary>
/// UploadHandler の概要の説明です
/// </summary>
public class UploadHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
if (context.Request.HttpMethod == "GET") {
context.Response.ContentType = "text/plain";
context.Response.Write("OK");
}
else if (context.Request.HttpMethod == "POST") {
string value1 = context.Request.Form["data1"];
string value2 = context.Request.Form["data2"];
context.Response.ContentType = "text/html";
context.Response.Write("<html>");
context.Response.Write("<head></head>");
context.Response.Write("<body>");
context.Response.Write(string.Format("<p>data1 = {0:s}</p>", value1));
context.Response.Write(string.Format("<p>data2 = {0:s}</p>", value2));
context.Response.Write("</body>");
context.Response.Write("</html>");
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
実行結果
プロジェクトを実行します。実行後PostForm.htmlを開きます。下図の画面が表示されます。
テキストボックスに送信する情報(文字列)を入力します。入力ができたら[送信]ボタンをクリックします。
サーバーにポストされ、サーバーからのレスポンスデータが下部に表示されます。情報がサーバーにポストされたことが確認できます。
[送信]ボタンクリック時にはページ遷移が起きないため、JavaScriptでポストしていることも確認できます。
日本語を含むデータでも動作します。
このページのキーワード
- JSでXMLHttpRequestを利用してPOSTでデータを送信する
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2015-06-24
作成日: 2015-06-24