世の中にたくさんの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つの値を受け取り、その二つを足し算した結果を返す」フォームを作るとします。
<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();">
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);
}
サーバ側処理なし。
function calc() {
// 値取得
var valueA = document.getElementById('valueA').value;
var valueB = document.getElementById('valueB').value;
// 計算関数呼び出し
var valueWA = addValues(valueA, valueB);
// 結果出力
document.getElementById('valueWA').value = valueWA;
}
<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();">
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データ取得後処理
~省略~
);
}
#!/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;
}
}
function calc() {
~省略~
// 以下、APIデータ取得後処理
function(return) {
$(return).find('Data').each(function() {
$('#valueWA').val($(this).find('answer').text());
});
}
);
}