ENTEREAL

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

前編:「XMLデータを返すWeb APIを作る」へ

APIのメリット

最大のメリットは、「オープンな環境(インターネットに接続された)で、誰もが使う事が出来る」という事です。
誰でもといっても、内容によってはアカウント登録が必要なもの、住所確認まで必要なものなど様々ですが。

APIのデメリット

メリットの裏返しがデメリットなのですが、、誰もが使えるからこそ、APIキーなどでユーザ認証を行ったり、コール回数の制限をしたり、アプリごとに使用許可を出したりしなければならないのです。

APIの主用途

前編の計算をするだけの機能では、APIにする必要はありません。サーバでしか出来ない事をするのがAPIの主用途です。 例えば、

  • DBやその他ソースから条件に応じたデータを取得する等の用途 (Twitter, Pinterest, Google Calender等)
  • 条件応じた地図や画像データを生成し表示する等の用途 (Google Map等)
  • 処理やデータ操作を行う等の用途 (Facebook等)


サンプル

今回は、用途の多い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 ※ 連結の順番は自由です。

APIプログラム (例はPerl)

#!/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化は他でも多用する為、汎用的な一つのファンクションにしています。


Tags

Same Category

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

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

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