javascript言語を用いてjson形式のデータをサーバに送信します。「Bootstrap3.3で作る入力画面」でBootstrapを使って入力画面を作りましたが、今回は画面から入力したデータをjson形式でサーバに送ります。
プログラムの作成
次に示す入力画面を作成します。
inputタグのtype属性「type=”radio”」と「type=”checkbox”」、selectタグで指定された項目を入力します。
index.html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>test</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script src="//code.jquery.com/jquery-3.1.0.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/sendinfo.js"></script>
</head>
<body>
<div class="container">
<!-- main -->
<div class="col-md-9">
<!-- apply custom style -->
<div class="page-header" style="margin-top:-30px;padding-bottom:0px;">
<h1><small>情報送信</small></h1>
<form method="post" action="" class="form-horizontal">
<!-- select -->
<div class="form-group">
<label class="col-md-2 control-label">エリア</label>
<div class="col-md-5">
<select name="area" class="form-control">
<option value="関東">関東</option>
<option value="関西">関西</option>
</select>
</div>
</div>
<!-- gender -->
<div class="form-group">
<label class="col-md-2 control-label">性別</label>
<div class="col-md-5">
<div class="radio-inline">
<label>
<input type="radio" name="gender" value="1" id="man">男
</label>
</div>
<div class="radio-inline">
<label>
<input type="radio" name="gender" value="2" id="woman">女
</label>
</div>
</div>
</div>
<!-- known by -->
<div class="form-group">
<label class="col-md-2 control-label">情報源</label>
<div class="col-md-5">
<div class="checkbox-inline">
<label>
<input type="checkbox" name="knownby" value="web" id="web">Web
</label>
</div>
<div class="checkbox-inline">
<label>
<input type="checkbox" name="knownby" value="magazine" id="magazine">雑誌
</label>
</div>
</div>
</div>
<!-- submit -->
<div class="form-group">
<div class="col-md-offset-3">
<input type="button" value="Submit" class="btn btn-primary" onClick="sendinfo()">
</div>
</div>
<!-- input result -->
<div class="form-group">
<label class="col-md-2 control-label">入力結果</label>
<div class="col-md-5">
<textarea class="form-control" name="result" rows=10 ></textarea>
</div>
</div>
</form>
</div>
</div>
</div>
</html>
json形式にデータを変換するためにJSON.stringifyを使用します。このため、入力したデータは連想配列で保存します。各項目からのデータをjQueryにより取得します。json形式に変換した入力データは、XMLHttpRequestクラスでサーバにアップロードします。
sendinfo.js
function sendinfo() {
var assoc = {};
//セレクトボックスの値を変数に保存
assoc.area = $('[name=area]').val();
console.log(assoc.area);
//ラジオボタンの値を変数に保存
assoc.gender = $('[name=gender]:checked').val();
console.log(assoc.gender);
//選択されたチェックボックスの値を配列に保存
assoc.knownby = $('[name=knownby]:checked').map(function() {
return $(this).val();
}).get();
console.log(assoc.knownby);
data = JSON.stringify( assoc );
var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.onreadystatechange = function()
{
var READYSTATE_COMPLETED = 4;
var HTTP_STATUS_OK = 200;
if( this.readyState == READYSTATE_COMPLETED
&& this.status == HTTP_STATUS_OK )
{
// レスポンスの表示
alert( this.responseText );
$('[name=result]').val(this.responseText);
}
}
xmlHttpRequest.open( 'POST', 'chkjson.php',false );
// サーバに対して解析方法を指定する
xmlHttpRequest.setRequestHeader( 'Content-Type', 'application/json');
// データをリクエスト ボディに含めて送信する
xmlHttpRequest.send( JSON.stringify(data) );
}
プログラムの実行
作成したプログラムをサーバ側にアップロードして動作確認します。
サーバに送られたjson形式のデータを確認するために、次のphpプログラムを作成します。
chkjson.php
<?php
try {
print_r(getallheaders() );
$headers = getallheaders();
$post_body = file_get_contents('php://input');
echo "body".$post_body;
$fp = fopen("sample.txt", "w");
fwrite($fp,"$post_body\n");
fclose($fp);
} catch (PDOException $e){
var_dump($e->getMessage());
}
?>
各データを設定してSubmitボタンを押すと、次の画面が表示されます。アラートダイアログにサーバからの戻り値が表示されます。Google Chrome のConsoleには入力項目への入力値が表示されます。
サーバからの戻り値を次に示します。最後の行にjson形式でデータが設定されています。ダブルクォーテーションが、エスケープシーケンスのためにバックスラッシュを付与しています。
Array
(
[Host] => localhost
[Connection] => keep-alive
[Content-Length] => 75
[Origin] => http://localhost
[User-Agent] => Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
[Content-Type] => application/json
[Accept] => */*
[Referer] => http://localhost/info/
[Accept-Encoding] => gzip, deflate, br
[Accept-Language] => ja,en-US;q=0.8,en;q=0.6
[Cookie] => toolbarDisplay=hide
)
body"{\"area\":\"関西\",\"gender\":\"2\",\"knownby\":[\"web\",\"magazine\"]}"
アラートダイアログのOKボタンを押すと次の画面が表示されます。アラートダイアログに表示されていたサーバからの戻り値が、「入力結果」欄に表示されます。


