リクエストボディ の XMLエンコード について

javascript

リクエストボディ の XMLエンコード について

前回の投稿は下記のJSON形式のデータ

{
	test1: "aaaa",
	test2: "bbbb",
	test3: "cccc"
}

という「キーと値」のセットをサーバ側へ送信し、通信の確認しました。

今回はJSON形式を、XML形式にしてサーバへ送信する方法を試してみます。
具体的には、上記の値を次の形のXMLデータに置き換えて送信します。

<data_p>
	<data_c id="test1" sample="s1">
		sample_value1
	</data_c>
	<data_c id="test2" sample="s2">
		sample_value2
	</data_c>
	<data_c id="test3" sample="s3">
		sample_value3
	</data_c>
</data_p>

javascript内で上記のXML形式のデータ(この場合、要素が3つのデータ)を、サーバ側に送信するには
xml形式の文字列データを、文字列からDOMのDocumentに変換しています。(下記の箇所です)

// DOMのDocumentに変換する
let ObjParser = new DOMParser();
let xml_datas  = ObjParser.parseFromString(send_xml_strings, "text/xml");

Content-Typeはこの例では省略しています。
ブラウザ側で適切な設定がされる為、必須ではありません。

また、明示的に下記のMIMEタイプを設定して試してみましたが、いずれも動作結果は同じした。

req.setRequestHeader("Content-Type", "application/json");

req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

req.setRequestHeader("Content-Type", "application/xml");

処理の最後では、sendメソッドでデータ送信をしています。

全体の処理がわかるように、以下のサンプルを用意しました。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>テストHTML</title>
</head>
<body>

<input type="button" id="sampleXMLHttpRequest" value="レスポンスボディ(JSONエンコード)のテスト">

<div>通信時の処理内容</div>
<div id="ajax_result"></div>

<script type="text/javascript">

// ボタン要素のDOMを取得
let element_sampleXMLHttpRequest = document.getElementById('sampleXMLHttpRequest');

// イベントを付与
element_sampleXMLHttpRequest.addEventListener('click',  SendXMLHttpRequest, false);

// ボタン押下時の処理
function SendXMLHttpRequest()
{

	// ----------------------------
	// 通信処理用のxmlデータを生成
	// ----------------------------
	// 今回のサンプル用のXML形式のデータを以下のように定義
	let send_xml_strings = '<data_p>';
		send_xml_strings += '<data_c id="test1" sample="s1">sample_value1</data_c>';
		send_xml_strings += '<data_c id="test2" sample="s2">sample_value2</data_c>';
		send_xml_strings += '<data_c id="test3" sample="s3">sample_value3</data_c>';
		send_xml_strings += '</data_p>';

	// DOMのDocumentに変換する
	let ObjParser = new DOMParser();
	let xml_datas  = ObjParser.parseFromString(send_xml_strings, "text/xml");

	// 通信処理を画面に出力する為、操作用DOMの取得
	let result = document.getElementById("ajax_result");

	// 検証の為、画面出力とログ出力をする
	result.innerHTML += 'レスポンスボディのテスト start' + '<br />';


	// ----------------------------
	// ajax通信処理の開始
	// ----------------------------
	let req = new XMLHttpRequest();

	// POST形式でサーバ側の「response.php」へデータ通信を行う
	req.open("POST", "./response.php");

	result.innerHTML += 'xml_datas -> ' + xml_datas + '<br />';
	result.innerHTML += '通信処理の開始' + '<br />';

	// ここまでで整理した送信用データを、サーバ側へ送信する
	req.send(xml_datas);

	// 検証の為、画面出力とログ出力をする
	result.innerHTML += '通信処理の終了' + '<br />';
	result.innerHTML += 'レスポンスボディのテスト end' + '<br />';

}

</script>

</body>
</html>

サーバ上のHTMLはこちら(test1.html)

サーバ側(php側)では、以下のプログラムを用意し、結果をログ出力して確かめています。

<?php

// xml形式のまま取得
$xml = file_get_contents("php://input");

// オブジェクトに変換する場合
$obj = simplexml_load_string($xml);

// オブジェクトをjsonエンコードする
$array_encord = json_encode($obj);

// 連想配列に変換する場合
$arrays = json_decode($array_encord, true);

file_put_contents('./log_xml.log', print_r($xml, true));
file_put_contents('./log_obj.log', print_r($obj, true));
file_put_contents('./log_array_encord.log', print_r($array_encord, true));
file_put_contents('./log_arrays.log', print_r($arrays, true));

?>

実際に画面にアクセスしてボタンを押下すると、send_data で送ったデータが
下記の形でログ出力されていることがわかります。

ボタンを押下し、通信処理が終わった後の、ブラウザ上の動作確認用の表示は次のようになります。

出力された内容を確認すると
「xml_datas -> [object XMLDocument]」
という形でXMLDocumentのオブジェクトとして送信を行っていることがわかります。

また、サーバ側のログ出力する内容は4通りの出力を試してみましたので、
以下、全て記載します。

log_xml.log (実際には改行されず、1行で出力)

<data_p>
<data_c id="test1" sample="s1">sample_value1</data_c>
<data_c id="test2" sample="s2">sample_value2</data_c>
<data_c id="test3" sample="s3">sample_value3</data_c>
</data_p>

log_obj.log

SimpleXMLElement Object
(
    [data_c] => Array
        (
            [0] => sample_value1
            [1] => sample_value2
            [2] => sample_value3
        )

)

log_array_encord.log

{"data_c":["sample_value1","sample_value2","sample_value3"]}

log_arrays.log

Array
(
    [data_c] => Array
        (
            [0] => sample_value1
            [1] => sample_value2
            [2] => sample_value3
        )

)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です