PHPを用いて3行でAPIを作る!!
数日前、Webアプリを作っていて、「APIを作成したい」と思いました。
色々調べてみるも、PHPでAPIを作成する方法はあまりヒットしません。
CakePHPなどのフレームワークやライブラリは便利ですが、私は極力利用したくありません。
設置するサーバーで動作するか分からないからです。
そこで、PHPリファレンスを覗いていると、ちょっと気になった関数が。
header()という関数です。
そこでひらめきました、こいつ使えばHTMLでもXMLでも、好きなファイル吐けるじゃないかと。
サンプルコードを書いてテストした結果、普通に動きました。
今回は、PHPを使って簡単なAPIを作成してみます。
以下、XMLを出力するサンプルコードを用意しました。
1
2
3
4
5
6
7
|
<?php
header('Access-Control-Allow-Origin:*');
header("Content-Type: text/xml");
echo('<?xml version="1.0" encoding="UTF-8" ?>');
echo('<test><page><name>Google</name><url>http://google.co.jp</url></page></test>');
?>
|
出力
1
2
3
4
5
6
|
<test>
<page>
<name>Google</name>
<url>http://google.co.jp</url>
</page>
</test>
|
PHPコードの解説をします。
「header(‘Access-Control-Allow-Origin:*’);」という文は、ちょっと特殊です。
単純に言えば、「APIをクロスドメインで利用できるようにするおなじない」みたいなものです。
解説するとちょっと長くなりますが、セキュリティ上知っておいたほうがいいことではあります。
ここでは説明は省略しますが、この記事の最後に書いていますので、気になる方は読んでみてください。
次に「header(“Content-Type: text/xml”);」という文。
読んで分かる通り、出力する文書のヘッダを指定しています。
通常はhtmlが出力されますが、このように出力するファイルを指定することも可能です。
ただし、header()には制約があります。
「この関数より前に何かを出力することは許されない」という制約です。
PHPはインタプリタであり、出力は上から順に出力され、出力するためにはファイルヘッダが定義されている必要があります。
ファイルヘッダが未定義の場合、PHPはデフォルトに設定されたファイルヘッダで、文書を出力します。
説明するとややこしいですが、とにかく「header()はどの出力よりも早く記述する」ということだけ覚えておきましょう。
「echo(‘‘);」は文書宣言です。
「これはXML文書バージョンは1.0で、UTF-8で書かれています。」という宣言です。
この辺りは、環境やプログラムによって適宜調整するといいです。
実際にはこの下に処理を連ねていくのですが、
1
2
3
|
header('Access-Control-Allow-Origin:*');
header("Content-Type: text/xml");
echo('<?xml version="1.0" encoding="UTF-8" ?>');
|
という3行だけでXMLが出力されることがわかったと思います。
次に、作成したAPIを利用してみます。
1
2
3
4
|
<?php
$xml = simplexml_load_file('http://hogehoge.huga/api.php');
printf("%sのURLは%sです。"$xml->page->name, $xml->page->url);
?>
|
出力
「GoogleのURLはhttp://google.co.jpです。」
XML自体が単純なので処理する必要はありません。
これだけでAPIの作成と利用ができてしまいました。
ひとつだけ注意することは、HTTPでAPIを呼び出すということです。
PHPなので通常はHTTPでのリクエストでなければ処理されません。
今作成したのは静的なページで、いつでも出力は変わりません。
しかしAPIというからには、入力を処理し、出力しなければなりません。
さきほどのAPIのソースのように、通常のPHPを書く感覚で書いて行けます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php
header("Content-Type: text/xml");
echo('<?xml version="1.0" encoding="UTF-8" ?>');
echo('<test><result>');
if(isset($_GET['input']) && is_numeric($_GET['input'])){
printf("%d", $_GET['input'] * 5);
}else{
printf("Error. input data is 'null', or not Numeric.");
}
echo('</result></test>');
?>
|
単純にGETやPOSTでデータを渡してあげればいいんです。
このコードは、GETで渡された数値を5倍して返します。
今回作成したAPIはすべてXMLで出力されていますので、多くの言語で容易に利用することができます。
APIをPHPで書き、JSやPerl、Ruby、Pythonなどで処理することも可能です。
このように、PHPを利用してごく簡単なAPIを実装してみました。
特別なライブラリなどは利用しないため、ライトプログラマでも簡単にAPI開発ができます。
今回はここまでー。
ではでは。
以下、余談。
<CORSについて>
—
「header(‘Access-Control-Allow-Origin:*’);」という文の補足説明。
W3Cが定めたCORSという仕組みがあります。
これはクロスサイトスクリプティングを防ぐために定められた仕組みです。
「ブラウザが、AというサーバーからHTMLを読み込んだとしましょう。
そのHTMLにはBというサーバーへ個人情報を投げるスクリプトが仕込まれていました。」
これでは困ります。ユーザーの知らない間に個人情報が引きぬかれているのですから。
そこで、CORSという仕組みです。
開発者が、クロスドメインでの利用許可を明示しない限り、クロスドメインでリクエストができません。
こうすることで、読み込んだHTMLのあるサーバーとは、異なるサーバー(ドメイン)にデータを送信することを防ぎます。
しかし、今回の場合、このCORSが邪魔になります。
今回のケースではAPIを利用するクライアントがPHPなら問題なく動作します。
しかし、JavaScriptを考えてみましょう。
JSはブラウザに読み込まれブラウザが処理します。
ブラウザが処理するということは、CORSの制約を受けるわけです。
結果として、CORSの設定を行わなければ、JSがサーバーのAPIを呼び出しても、データを返してくれないことになります。
「header(‘Access-Control-Allow-Origin:*’);」という文は、すべてのホストからのアクセスを許可するという文です。
セキュリティ上好ましくないと思われる場合は、
header(‘Access-Control-Allow-Origin:hogehoge.com’);のように、許可するホストを指定しましょう。
—