前編:「XMLデータを返すWeb APIを作る」へ
最大のメリットは、「オープンな環境(インターネットに接続された)で、誰もが使う事が出来る」という事です。
誰でもといっても、内容によってはアカウント登録が必要なもの、住所確認まで必要なものなど様々ですが。
メリットの裏返しがデメリットなのですが、、誰もが使えるからこそ、APIキーなどでユーザ認証を行ったり、コール回数の制限をしたり、アプリごとに使用許可を出したりしなければならないのです。
前編の計算をするだけの機能では、APIにする必要はありません。サーバでしか出来ない事をするのがAPIの主用途です。 例えば、
今回は、用途の多いDB問い合わせについてAPI化する場合を例としてみます。
具体的には、Blog記事を格納した仮りのDBから期間やカテゴリを指定してBlog記事をXML化して取得します。
条件名 | データ表示 | データフォーマット | データ記載例 | デフォルト |
---|---|---|---|---|
データ取得期間(下限) | ds | 区切りなしYYYY年MM月DD日 | ds=20130101 | なし |
データ取得期間(上限) | de | 区切りなしYYYY年MM月DD日 | de=20131231 | API問い合わせ時点の日付 |
記事カテゴリ | dc | テキスト(URLエンコード) | dc=%83e%83X%83g | なし |
データ取得件数 | dn | 1から9999までの整数値 | dn=30 | 100 |
各取得条件をAPIのURLの後ろに&
で連結していきます。
https://entereal.co.jp/api/sample.api?ds=20131010&dc=%83e%83X%83g&dn=20
※ 連結の順番は自由です。
#!/usr/bin/perl use CGI; use CGI::Carp qw(fatalsToBrowser); # 値取得 my %in = &parseForm; # 実処理 my (@rowData, @tableData, @tableInfo, @tableColName, @filter); my $dbSource = "sample.db"; my $sqlStr = "SELECT * FROM articles WHERE postdate >= ? and postdate <= ? and category = ? ORDER BY postdate limit ?;"; if ($in{'ds'} eq "") { $sqlStr =~ s/ postdate >= ? and//g; } else { push(@filter, $in{'ds'}); } if ($in{'de'} eq "") { $in{'de'} = &getDate; } push(@filter, $in{'de'}); if ($in{'dc'} eq "") { $sqlStr =~ s/ and category = ?//g; } else { push(@filter, $in{'dc'}); } if ($in{'dn'} eq "") { $in{'dn'} = 30; } push(@filter, $in{'dn'}); # DB接続 $dbh = DBI->connect("dbi:SQLite:dbname=$dbSource"); # カラム名取得 $sth = $dbh->prepare("PRAGMA table_info(articles);"); $sth->execute; while (@tableInfo = $sth->fetchrow_array) { push(@tableColName, $tableInfo[1]); } # データ取得 $dbh->prepare($sqlStr); $sth->execute(@filter); my ($iCnt, $jCnt) = (0, 0); while (@rowData = $sth->fetchrow_array) { for my $data (@rowData) { $tableData[$iCnt][$jCnt] = $data; $jCnt ++; } $iCnt ++; $jCnt = 0; } # XML化 / ブラウザ返却 &outputXml(\@tableColName, \@tableData); $dbh->disconnect; exit(1); # データ取得 sub parseForm { foreach my $key ($q->param()) { my $val = $q->param($key); $in{$key} = $val; } } # XML化 / ブラウザ返却 sub outputXml { my @colName = @{$_[0]}; my @tableData = @{$_[1]}; my ($xmlRowStr, $xmlDataStr, $iCnt); for my $rowRef (@tableData) { $xmlRowStr = ""; $iCnt = 0; for my $data (@{$rowRef}) { $xmlRowStr .= "<$colName[$iCnt]>$data</$colName[$iCnt]>"; $iCnt ++; } $xmlDataStr .= "\t<Row>$xmlRowStr</Row>\n"; } print "Content-type: text/html\n\n"; print "<Result>\n$xmlDataStr</Result>"; }
与えられたパラメータ(データ取得条件)をもとに、SQLを作成しDBからデータを取得しています。
データのXML化は他でも多用する為、汎用的な一つのファンクションにしています。