世の中にたくさんの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()); }); } ); }