トッカンソフトウェア

jQuery Ajax + PHP(別ドメイン)

前回に続いてAjaxをやります。今回はクライアントとサーバが別ドメインの場合をやります。

Content-Typeにapplication/jsonを指定のJavaScript
Content-Typeにapplication/jsonを指定のPHP
Content-Type未指定のJavaScript
Content-Type未指定のPHP


Content-Typeにapplication/jsonを指定

Content-Typeにapplication/jsonを指定する方式とContent-Typeを省略する方式で$.ajaxを使ってみます。

クライアント側の処理

HTMLとJavaScript

test.html
				
<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>jQuery Test</title>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
	<script type="text/javascript">
		$(function() {

			$("#btn").click(function() {

				var param = {
					str1: $("#txt1").val(),
					str2: $("#txt2").val()
				};
				$.ajax({
					contentType: "Content-Type: application/json; charset=UTF-8",
					url: "http://localhost/ajax.php",
					type: "POST",
					data: JSON.stringify(param)
				}).done(function(data, status, xhr) {
					// 正常
					show(data);
				}).fail(function(xhr, status, error) {
					// 異常
					$("#msg").append(xhr);
					$("#msg").append(":" + status);
					$("#msg").append(":" + error);
				}).always(function(data, status, xhr) {
					// 常に
				});
			});
		});

		function show(data) {
			var obj = JSON.parse(data);

			//ここに結果
			$("#msg").html(obj.str);

			//ここにリスト
			if (obj.ret == "true") {
				var str1 = "<table border='1'>";
				$.each(obj.ary, function(i, val) {
					str1 += "<tr><td>" + i + "</td><td>" + val + "</td></tr>";

					console.log(i + ': ' + val);
				});
				str1 += "</table>";
				$("#ret1").html(str1);
			} else {
				$("#ret1").empty();
			}

			//ここにマップ
			if (obj.ret == "true") {
				var str2 = "<table border='1'>";
				$.each(obj.map, function(key, val) {
					str2 += "<tr><td>" + key + "</td><td>" + val + "</td></tr>";
				});
				str2 += "</table>";
				$("#ret2").html(str2);
			} else {
				$("#ret2").empty();
			}
		}
	</script>
</head>
<body>
	<input type="text" id="txt1" />
	<input type="text" id="txt2" />
	<br />
	<input type="button" id="btn" value="ボタン" />
	<div id="msg">
		ここに結果
	</div>
	<br />
	<div id="ret1">
		ここにリスト
	</div>
	<br />
	<div id="ret2">
		ここにマップ
	</div>
</body>
</html>

			
URLをフルパス指定に変えます。

サーバ側の処理

PHPでサーバ処理を記述

ajax.php
				
<?php

class Cls {
	var $ret;
	var $str;
	var $ary;
	var $map;
}

$obj = new Cls();

//送信データを取得
$json = file_get_contents("php://input");

//JSONから連想配列に変換
$data = json_decode($json, true);

if (count($data) == 0 || !isset($data['str1']) || !isset($data['str2'])) {

	$obj -> str = "引数str1,str2が指定されていません。" . count($data);
	$obj -> ret = "false";

} else {

	$str1 = $data['str1'];
	$str2 = $data['str2'];
	$obj -> str = $str1 . $str2 . "<BR />" . $_SERVER['REQUEST_METHOD'] . "で送信されました";
	$obj -> ret = "true";

	$obj -> map = array('A' => 'あいう', 'B' => '123', 'C' => 'abc');
	$obj -> ary = array('aaa', 'bbb', 'ccc');
}

//連想配列からJSONに変換
$result = json_encode($obj, JSON_UNESCAPED_UNICODE);

//処理結果を戻す(出力)
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type');
echo $result;
?>


			
Access-Control-Allow-Origin、Access-Control-Allow-Headersを指定してアクセスを許可します。



Content-Typeを未指定

Content-Typeを指定しないと、Content-Typeはapplication/x-www-form-urlencodedになります。

クライアント側の処理

HTMLとJavaScript

test2.html
				
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>jQuery Test</title>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
	<script type="text/javascript">
		$(function() {

			$("#btn").click(function() {

				var param = {
					str1: $("#txt1").val(),
					str2: $("#txt2").val()
				};
				$.ajax({
					url: "http://localhost/ajax2.php",
					type: "POST",
					data: param
				}).done(function(data, status, xhr) {
					// 正常
					show(data);
				}).fail(function(xhr, status, error) {
					// 異常
					$("#msg").append(xhr);
					$("#msg").append(":" + status);
					$("#msg").append(":" + error);
				}).always(function(data, status, xhr) {
					// 常に
				});
			});
		});

		function show(data) {
			var obj = JSON.parse(data);

			//ここに結果
			$("#msg").html(obj.str);

			//ここにリスト
			if (obj.ret == "true") {
				var str1 = "<table border='1'>";
				$.each(obj.ary, function(i, val) {
					str1 += "<tr><td>" + i + "</td><td>" + val + "</td></tr>";

					console.log(i + ': ' + val);
				});
				str1 += "</table>";
				$("#ret1").html(str1);
			} else {
				$("#ret1").empty();
			}

			//ここにマップ
			if (obj.ret == "true") {
				var str2 = "<table border='1'>";
				$.each(obj.map, function(key, val) {
					str2 += "<tr><td>" + key + "</td><td>" + val + "</td></tr>";
				});
				str2 += "</table>";
				$("#ret2").html(str2);
			} else {
				$("#ret2").empty();
			}
		}
	</script>
</head>
<body>
	<input type="text" id="txt1" />
	<input type="text" id="txt2" />
	<br />
	<input type="button" id="btn" value="ボタン" />
	<div id="msg">
		ここに結果
	</div>
	<br />
	<div id="ret1">
		ここにリスト
	</div>
	<br />
	<div id="ret2">
		ここにマップ
	</div>
</body>
</html>


			
URLをフルパス指定に変えます。

サーバ側の処理

PHPでサーバ処理を記述

Content-Type未指定の場合、$_POST変数で送信データを取得します。
				
<?php

//送信データを取得
$str1 = $_POST['str1'];
$str2 = $_POST['str2'];

//戻り値になる連想配列をセット
$obj = [];
$obj['str'] = $str1 . $str2 . "<BR />" . $_SERVER['REQUEST_METHOD'] . "で送信されました";
$obj['ret'] = "true";
$obj['map'] = array('A' => 'あいう', 'B' => '123', 'C' => 'abc');
$obj['ary'] = array('aaa', 'bbb', 'ccc');

//連想配列からJSONに変換
$result = json_encode($obj, JSON_UNESCAPED_UNICODE);

//処理結果を戻す(出力)
header('Access-Control-Allow-Origin: *');
echo $result;
?>


			
Access-Control-Allow-Originを指定してアクセスを許可します。


ページのトップへ戻る