Guzzle 6 のドキュメント

PHPだけでクロスドメイン

通常、クロスドメイン通信はAjaxで行う。そのためJavaScriptの力も借りることになる。
しかし、Guzzleを使えばPHPだけでクロスドメイン通信ができる。

サンプル

下記サンプルではサーバーAから別ドメインであるサーバーBにクロスドメイン通信する。
POSTデータの送信とレスポンスの受取も行っている。

バージョン情報
サーバーA
	<?php 
		// Composerでインストールした各種ライブラリを読み込む(Guzzleもインストールされていること)
		require_once 'vendor/autoload.php';
	
		// サーバーBへのURL
		$url = "http://example.com/server_side.php";
	
		// サーバーBへ送信するPOSTデータ
		$data = ['id'=>888,'name'=>'dog'];
		$json = json_encode($data);
		
		// サーバーBとクロスドメイン通信を行う。
		$client = new GuzzleHttp\Client();
		$res = $client->request('POST', $url,['form_params'=>['key1'=>$json]]);
		
		// クロスドメイン通信のレスポンスを出力
		echo $res->getStatusCode();
		echo '<br>';
		
		$body = $res->getBody();
		$contents = $body->getContents();
		var_dump($contents);
	?>
	

サーバーB (server_side.php)
	<?php 
		// クロスドメイン通信を許可する(本来なら認証チェックや、アクセス元のオリジン【ドメイン+ポート】に制限をかけるべき)
		header('Access-Control-Allow-Origin: *');
		header('Access-Control-Allow-Methods: POST');
		
		// デフォルトデータにPOSTデータをマージする。マージしたデータはJSONに変換して出力。
		$data = ['id'=>1,'name'=>'cat','status'=>2];
	
		if(!empty($_POST['key1'])){
			$json=$_POST['key1'];
			$data2=json_decode($json,true);//JSONデコード
			$data = array_merge($data, $data2);
		}
		
		$json = json_encode($data);//JSONエンコード
		
		echo $json;
	
	?>
	

出力
	string '{"id":888,"name":"dog","status":2}' (length=34)
	

Guzzle3によるクロスドメイン

Guzzle3はComposerでインストールする。また動作条件はPHP5.3.3以上が必要

サンプルはサーバーAとサーバーBのクロスドメイン通信である
POSTデータを送信して、JSONデータを受け取る。


サーバーA


	
	// Composerでインストールしたライブラリ群をインクルードする(Guzzle3ライブラリも含まれる)
	require_once '../vendor/autoload.php';

	// 送信データ
	$data = ['id'=>1200,'delete_flg'=>false, 'animal_name'=>'lion'];
	$json = json_encode($data);
	
	// クロスドメイン通信先URL(別ドメインのサイト)
	$url = "http://amaraimusi.sakura.ne.jp/sample/php/guzzle3/cross_domain/test_serv_side.php";

	// 通信先URLと送信データをセットして、クロスドメイン通信を開始する。
	$client = new \Guzzle\Http\Client($url);
	$request = $client->post($url,null,array('key1' => $json));
	$res = $request->send();
	
	// レスポンスをJSONとして受け取り出力する
	$json = $res->json();
	var_dump($json);
	

サーバーB

.
	<?php 
	// クロスドメイン通信を許可する
	header('Access-Control-Allow-Origin: *');
	header('Access-Control-Allow-Methods: POST');
	
	
	$data = ['id'=>1,'animal_name'=>'cat','delete_flg'=>true];
	if(!empty($_POST['key1'])){
		$json=$_POST['key1'];
		$data2=json_decode($json,true);//JSONデコード
		$data = array_merge($data, $data2);
	}
	
	$json = json_encode($data);//JSONエンコード
	
	echo $json;
	
	?>
	

出力

array (size=3)
	  'id' => int 1200
	  'animal_name' => string 'lion' (length=4)
	  'delete_flg' => boolean false