WebプログラミングV

 目次へ 前へ 次へ

2013/10/29 久米

T.XMLとJSONとAPI

3.API

Application Program Interface
webアプリケーションがみずからの機能を外部利用者(ソフトや人)に使用できるようにするインターフェース

通常GETやPOST送信でパラメータを付加して送り(付加しない場合もある)
その結果(通常JSONかXML)をもらうこと

本節では実際に簡単なAPIを作ってみる。

3.1 JSON生成

データベースなどから読み取ったデータをJSONファイルで配信する方法

  json
メソッド
$arr = 連想配列;
$json = json_encode($arr);
header("Content-Type: text/javascript; charset=utf-8");
print $json;
つまり 連想配列でデータを準備し(通常はデータベースから読み取る)
jsonファイルを生成するのはjson_encodeメソッドを使う

具体例

通常はDBから読み取ったデータをJsonにするが、下記では簡単のためphpで作ったデータをJsonにしている。

  json
生成例
<?php
/*$arr = array(
                'book' => array(
				array(
				'ISBN'=>'1254003',
				'category'=>'小説',
				'title'=>'我輩は猫である',
				'price'=>500
				),
				array(
				'ISBN'=>'25004000',
				'category'=>'小説',
				'title'=>'坊ちゃん',
				'price'=>600
				),
				array(
				'ISBN'=>'40880500',
				'category'=>'漫画',
				'title'=>'スラムダンク',
				'price'=>400
				)
			)
	);*/

//$arr["shop"]="yajimaya";
$arr["book"][0]["ISBN"]="1254003";
$arr["book"][0]["category"]="小説";
$arr["book"][0]["title"]="我輩は猫である";
$arr["book"][0]["price"]=500;
$arr["book"][1]["ISBN"]="25004000";
$arr["book"][1]["category"]="小説";
$arr["book"][1]["title"]="坊ちゃん";
$arr["book"][1]["price"]=600;
$arr["book"][2]["ISBN"]="40880500";
$arr["book"][2]["category"]="漫画";
$arr["book"][2]["title"]="スラムダンク";
$arr["book"][2]["price"]=400; $json = json_encode($arr); header('Content-Type: text/javascript; charset=utf-8'); print $json; ?>
確認例
<?php
$json = file_get_contents("http://から上記phpファイルを指定");

if ($json == false) {
	print "保守中です";
	return;
}

$obj = json_decode($json);

$book = $obj->book; 
$ttl0 = $book[0]->title; 
$ttl1 = $obj->book[1]->title;
print "$ttl0 $ttl1 \n"; 
?>

(1)手作り方法

データベースから読み取り、json形式で出力するスクリプト例

<?php
$con=mysqli_connect("localhost", "root", "", "web2");
mysqli_set_charset($con, "UTF8");
$sql="SELECT * FROM webseiseki";
$rst=mysqli_query($con, $sql);

$arr=array();
$i=0;
while($row=mysqli_fetch_array($rst)){
    $arr["seiseki"][$i]["name"]=$row["name"];
    $arr["seiseki"][$i]["design"]=$row["design"];
    $arr["seiseki"][$i]["script"]=$row["script"];
    $arr["seiseki"][$i]["team"]=$row["team"];
    $i++;
}

mysqli_free_result($rst);
$cls=mysqli_close($con);

$json = json_encode($arr);
header('Content-Type: text/javascript; charset=utf-8'); print $json; ?>

 

3.2 XML生成

データベースなどから読み取ったデータをXMLファイルで配信する方法

  XML
方法
手作りで生成する方法と
DOMオブジェクトを使う方法がある。

 

(1)手作り方法

データベースから読み取り、xml形式で出力するスクリプト例

<?php
$con=mysqli_connect("localhost", "root", "", "web2");
mysqli_set_charset($con, "UTF8"); $sql="SELECT * FROM marufuku ORDER BY yobino"; $rst=mysqli_query($con, $sql); $m="<?xml version='1.0' encoding='utf-8'?>"; $m.="<marufuku>"; while($row=mysqli_fetch_array($rst)){ $m.="<kondate><ryori>".$row["ryori"]."</ryori>"; $m.="<nedan>".$row["nedan"]."</nedan>"; $m.="<shasin>".$row["shasin"]."</shasin></kondate>"; } $m.="</marufuku>"; mysqli_free_result($rst);
$cls=mysqli_close($con); //$m = mb_convert_encoding($m, "UTF-8");//文字コードをUTF-8に変換する print $m; ?>

(2)DOMオブジェクトを使用する方法

PHPのDOMオブジェクトを使用すれば、より簡単にxmlファイルを作成し保存できる。
(JSON用のオブジェクトは標準ではまだ無い)

下記使用例は、管理者がフォーム投稿により、xmlファイル作成保存を行なっている。
もちろんprintで表示してもよい。

<?php
$m="";
if(isset($_POST["sub"])) {
    $file_name="my_xml.xml";
    if($_POST["file_name"]!="")$file_name=$_POST["file_name"];
    $name_value=mb_convert_encoding($_POST["name"], "UTF-8");
    $price_value=mb_convert_encoding($_POST["price"], "UTF-8");
    
    $dom = new DomDocument("1.0", "UTF-8");
    
    //ノードの作成
    $turukame = $dom->createElement("turukame");
    $shohin = $dom->createElement("shohin");
    $name =$dom->createElement("name", $name_value);
    $price =$dom->createElement("price", $price_value);
    
    //各ノードを商品ノードに配置
    $shohin->appendChild($name);
    $shohin->appendChild($price);
    
    //商品ノードをつるかめノードに配置
    $turukame->appendChild($shohin);
    
    //つるかめノードをトップに配置
    $dom->appendChild($turukame);
    
    //ファイル保存
    $dom->save($file_name);
    
    $m= "保存しました";
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>xmlファイル保存</title>
</head>
<body>
<h1>xmlファイル保存</h1>
<form method="post" name="f" action="<?php print $_SERVER['PHP_SELF']; ?>">
ファイル名:<input type="text" name="file_name"><br>
商品名:<input type="text" name="name"><br>
価格:<input type="text" name="price"><br>
<input type="submit" name="sub" value="作成"><br>
</form>
<p><?php print $m; ?></p>
</body>
</html>

 

 

昔のコラム再掲 連想配列の=>

連想配列や自分でキーを割り振りたい場合には「 => 」という記号を使います。
<?php
$fruit = array(
"apple" => "りんご",
"orange" => "オレンジ",
"grape" => "ぶどう",
);
?>

改行しているのは見やすくするためです。必要なければ1行で書いても構いません。

上記の例は以下のように書くのと同じです。
<?php
$fruit["apple"] = "りんご";
$fruit["orange"] = "オレンジ";
$fruit["grape"] = "ぶどう";
?>
多次元配列

多次元配列を作成したい場合はarray()関数をネスト(入れ子)します。

ややこしいですが、実際にサンプルを見た方が分かりやすいです。
<?php
$food = array(
"vegetable" => array(
"carrot" => "にんじん",
"tomato" => "トマト",
"onion" => "たまねぎ"
), //カンマ「,」で区切る
"fruit" => array(
"apple" => "りんご",
"orange" => "オレンジ",
"grape" => "ぶどう"
)
); //終了のセミコロン「;」
?>

これは以下のように書くのと同様です。
<?php
$food["vegetable"]["carrot"] = "にんじん";
$food["vegetable"]["tomato"] = "トマト";
$food["vegetable"]["onion"] = "たまねぎ";

$food["fruit"]["apple"] = "りんご";
$food["fruit"]["orange"] = "オレンジ";
$food["fruit"]["grape"] = "ぶどう";
?>

 

 

json_encodeの出力

json_encoesの出力は、なにも指定しないと通常下記のように\uxxxxの形式になる。

\u30b9\u30e9\u30e0\u30c0\u30f3\u30af

これはunicodeでエスケープされているためである。(UTF-16で符号化されたコード)

これがいやで生の日本語で出力したい場合は、かつPHP5.4以降であれば、
下記のようにJSON_UNESCAPED_UNICODEのオプションを付ければよい。

$json = json_encode($arr, JSON_UNESCAPED_UNICODE);