WEB APIを簡単に実装しよう

今回、既存のサイトとクロスドメインで連携するサイトを構築する事になりました。

で、悩んだのは新規サイトの方はDBを持たずに、既存サイトのデータを利用すると言うところ。

色々調べたり、教えてもらったりして辿り着いたのが以下の方法。

とりあえず自分メモとして。

まず、既存サイトにAPIを用意する。

例えば

<?php
	header('Access-Control-Allow-Origin:*');
	header("Content-Type: text/xml");
	
	// データベース操作関連定義ファイル読み込み
	require_once( '../lib/db.php' );
	// 汎用関数定義ファイル読み込み
	require_once('../lib/common.php');
	// データベース接続
	if( !connect_db())	{
		// データーベース接続失敗時はメッセージを表示して、以降の処理を中止
		$msg = 'データベースに接続できません。<br>システム管理者に問い合わせてください。';
		die( $msg );
	}
	$cat = $_GET['cat'];
	$area = $_GET['area'];
	$where = "";
	$sql = "SELECT * FROM M_SHOP ";
	if( $cat != "" )
	{
		$where = "WHERE CAT = " . $_GET['cat'];
	}
	if( $area != "" )
	{
		if( $where == "" )
		{
			$where = "WHERE AREA = " . $_GET['area'];
		}
		else
		{
			$where = $where . " AND AREA = " . $_GET['area'];
		}
	}
	if( $where == "" )
	{	
	 	$where =  "WHERE DELETED = FALSE ORDER BY CHANGED ";
	}
	else
	{
		$where =  $where . " AND DELETED = FALSE ORDER BY CHANGED ";
	}
	$sql = $sql . $where;
	$rs = exec_sql( $sql );
	$reccnt = get_row_count( $rs );
	echo('<?xml version="1.0" encoding="UTF-8" ?>');
	echo( '<SHOPS>');
	for( $i = 0; $i < $reccnt; $i++ )
	{
		echo( '<SHOP>' );
		$rec = get_row( $rs );
		echo( '<ID>' . $rec['ID'] . '</ID>' );
		echo( '<NAME>' . $rec['NAME'] . '</NAME>' );
		// 以下必要な項目を定義していく…
		echo( '</SHOP>' );
	}
	echo( '</SHOPS>')
?>

といった感じです。

先頭行の

header('Access-Control-Allow-Origin:*');

は、クロスドメインでの利用を許す為の魔法のおまじない。

で、新規サイトの方では

<!doctype html>
<html lang="ja">
	<head>
		<meta charset="UTF-8">
		<title>APIサンプル</title>
	</head>
	<body>
<?php
	require_once( "Pager/Pager.php" );
	// 上で作ったhoge.phpと言うAPIを叩く
	$xml = simplexml_load_file('http://www.foo.com/api/hoge.php?cat=1&area=2');
	
	// xml_parseで出来るかと思ったけど、simplexml_load_fileを使うと
	// object(SimpleXMLElement)#1 (1) { ["SHOP"]=> array(46)
	// { [0]=> object(SimpleXMLElement)#2 (8) { ["ID"]=> string(2) "14" 
	// ["NAME"]=> string(28) "E-class(イークラス)"
	// の様にSimpleXMLElementと言うobject要素が付くのでうまくいかない。
	// その為、直接取り出す事にする。
	// foreachの方が高速なので、全件表示で構わない場合は
	// foreach ($xml->SHOP as $item)とすれば良い。
	// 今回はページングをするので、通常のfor文を利用
<?php
	$ttlcnt = count( $xml );
	$perPage = 10;
	
	$params = array(
		'perPage'=>$perPage,
		'totalItems'=>$ttlcnt,
		"curPageSpanPre" => "[",
		"curPageSpanPost" => "]",
		'httpMethod' => 'POST',
		'firstPagePre' => '{','firstPageText'=>'先頭','firstPagePost'=>'}',
		'lastPagePre' => '{','lastPageText'=>'最後','lastPagePost'=>'}'	);
	// Pagerオブジェクト生成
	$p = Pager::factory( $params );
	// 現在ページの情報を出力
	ShowPage(( $p->getCurrentPageID()-1 ) * $perPage, $perPage, $xml );
	function	ShowPage( $start, $cnt, $xml )
	{
		for( $i = $start; $i < $start + $cnt; $i++ )
		{
			$item = $xml->SHOP[$i];
			echo( $item->ID );
			echo( $item->NAME );
			echo( "<br>" );
		}
	}
?>
	</body>
</html>

これで、各要素を必要な件数だけ取り出せる。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください