ENTEREAL

XMLデータを返すWeb APIを作る

APIとは

世の中にたくさんのAPIがありふれる現在、改めて説明する必要はないかもしれませんが、知らない方のために改めてWikipediaで調べてみると、

アプリケーションプログラミングインタフェース (API、英: Application Programming Interface) とは、ソフトウェアコンポーネントが互いにやりとりするのに使用するインタフェースの仕様である。APIには、サブルーチン、データ構造、オブジェクトクラス、変数などの仕様が含まれる。APIには様々な形態があり、POSIXのような国際規格、マイクロソフトの Windows API のようなベンダーによる文書、プログラミング言語のライブラリ(例えば、C++の Standard Template Library や Java API(英語版) など)がある。
APIは Application Binary Interface (ABI) とは異なる。APIはソースコードベースだが、ABIはバイナリインタフェースである。例えば、POSIXはAPIだが、Linux Standard Base(LSB)はABIである[1](LSBはいろいろな規定の集合なので、正確には「LSBには、ABIにまで踏み込んでいるもある」)。
と書いてある。
人間の世界に置き換えると、人や機械が互いに会話するための共通の言葉という事になる。お互いに決まった共通のルールがあれば、言葉は英語や日本語みたいな広く認知されたものでなくても良いのです。

要するに

実現したい内容に応じて自由にルールを決めて良いのです。「2つの値を受け取り、その二つを足し算した結果を返す」というように、各言語で関数を作るような感覚で良いのです。
つまり、APIは関数のようなものです。インターフェイスの仕様に従い関数をコールするだけ。中の処理は重要視せず、受け取る結果のみを利用します。

では、「ふつうのAPI」と「Web API」の違いは何なのでしょうか?
決定的な違いは、「クーローズされた環境ではなく、インターネットに接続された誰もが使う事を想定している」という事です。

裏を返すと、誰もが使えるからこそ、APIキーなどでユーザ認証を行ったり、コール回数の制限をしたり、アプリごとに使用許可を出したりしなければならないのです。
それら、負荷の問題、セキュリティの問題を除外すると、単純なAPIになるのです。


サンプル

上記を例に取り、「2つの値を受け取り、その二つを足し算した結果を返す」フォームを作るとします。

関数で処理する場合 (JavaScript)

1. クライアントインターフェース(フォーム: sample_js_function.html)
<h3>AとBの和を求める</h3>

<input type="text" class="form-control" id="valueA"> +
<input type="text" class="form-control" id="valueB"> =
<input type="text" class="form-control" id="valueWA"><br>
<input type="button" value="計算" onClick="calc();">
2. クライアント側処理(トリガー: sample_js_function.html)
function calc() {
// 値取得
var valueA = document.getElementById('valueA').value;
var valueB = document.getElementById('valueB').value;

// 計算関数呼び出し
var valueWA = addValues(valueA, valueB);
}
// 計算部
function addValues(valA, valB) {
return (valA + valB);
}
3. サーバ側処理(計算&データ返却部)

サーバ側処理なし。

4. クライアント側処理(データ表示部: sample_js_function.html)
function calc() {
// 値取得
var valueA = document.getElementById('valueA').value;
var valueB = document.getElementById('valueB').value;

// 計算関数呼び出し
var valueWA = addValues(valueA, valueB);

// 結果出力
document.getElementById('valueWA').value = valueWA;
}

Web APIで処理する場合 (JavaScript + Perl)

1. クライアントインターフェース(フォーム: sample_web_api.html)
<h3>AとBの和を求める</h3>

<input type="text" class="form-control" id="valueA"> +
<input type="text" class="form-control" id="valueB"> =
<input type="text" class="form-control" id="valueWA"><br>
<input type="button" value="計算" onClick="calc();">
2. クライアント側処理(トリガー: sample_web_api.html)
function calc() {
// 値取得
var valueA = document.getElementById('valueA').value - 0;
var valueB = document.getElementById('valueB').value - 0;

// 「sampleAPI.cgi?ValA=valueA&ValB=valueB」と同じ
$.post('sampleAPI.cgi' ,{
ValA: valueA,
ValB: valueB,
},
// 以下、APIデータ取得後処理
~省略~
);
}
3. サーバ側処理(計算&データ返却: sampleAPI.cgi)
#!/usr/bin/perl
use CGI;
use CGI::Carp qw(fatalsToBrowser);

# 値取得
my %in = &parseForm;

# 実処理
my $valA = $in{'valueA'} - 0;
my $valB = $in{'valueB'} - 0;
my $valWA = $valA + $valB;
my $returnXml = << "EOS";
<sampleAPI>
<Data>
<answer>$valWA</answer>
</Data>
</sampleAPI>
EOS

print "Content-type: text/html\n\n";
print $returnXml;
exit(1);

# データ取得
sub parseForm {
foreach my $key ($q->param()) {
my $val = $q->param($key);
$in{$key} = $val;
}
}
4. クライアント側処理(データ表示部: sample_web_api.html)
function calc() {
~省略~
// 以下、APIデータ取得後処理
function(return) {
$(return).find('Data').each(function() {
	$('#valueWA').val($(this).find('answer').text());
});
}
);
}

この例ではあえてWeb APIで処理する必要性は全くないので、メリットを感じにくいかもしれませんが、後編では利点を最大限生かした使い方を開設予定です。

続き:「中編:Web APIの基本機能を作る」へ


Tags

Same Category

2つの住所から距離を計算する

日本語形態素解析APIに関する件

IPアドレスからアクセス元を探る