これはPerl Advent Calendar 2017 15日目のエントリです。
広告
YAPC::Okinawaは現在カンファレンス参加チケット・トークプロポーザルを絶賛募集中です!!!是非ご応募ください!!!
さて今回のエントリですが,実際にAPIクライアントが完成…とまでは時間の都合上行かなかったので,大まかな実装の内容と機能についてのご紹介となります。また実装についてアドバイスなどがあれば感激です!!!(むしろそこが目的)
CPAN名前空間にはWebService::*
というものがあり,こちらには主にAPIクライアントのCPANモジュールが登録されています。
この名前空間についてはpapixさんの資料が詳しいのでそちらをお読みください。
今回は練習も兼ねてタイトルにある通りDMM.comのAPIクライアントの作成を行っています。
DMM APIクライアントについて
さてDMMAPIクライアントの前にDMMのAPIについて解説していきます。 DMMは公式にAPIをアフィリエイトサービスの活性化の為に公開しており,誰でもアフィリエイトユーザー登録を行えば使用することが可能です。
主にDMMの花形である動画サービスに関するAPIで構成されています。 例えばそういったビデオの作者,シリーズ,ジャンル検索や 女優に関してはスリーサイズをクエリパラメータとして設定可能という点で異彩を放っています。
DMM APIは2017/12/15現在でversion3.0となっており,ここ1年ほど目立った更新がない為,安定したAPIと言ってもいいでしょう。
以前はレスポンスがXMLのみでしたが,version3.0よりJSON形式が標準のレスポンスとなった為,FurlとJSON系のモジュールさえあれば簡単にPerl経由でAPIを叩くことが可能です。
DMM公式(DMM.com Labo)は現在SDKを公開しています。
現在公式が対応しているSDKですが
この3言語が対応・公開されています。
またRubyの場合gemにruby-dmmとしてmeganemuraさんが公開されています。
広告
皆さん是非トーク応募しましょう!!!
PerlにおけるDMM APIの対応状況
Perlでは現在CPANを見るとsyohexさんが作成されたWebService::DMMがAPIクライアント実装となっています。
ですがこちらはversion2.0までのAPI実装によって作成されているので現在は使用する事が不可能となっています。
そこで現在考案しているのが新たなDMMのAPIクライアントであるWebService::YDMMです。
実装予定案
ここからは実装予定となっています。 現在作業しているリポジトリはこちらとなっております
利用予定モジュール
- HTTP::Tiny
- JSON
こちらですがFurlの利用も考えていましたが,基本コアモジュールによせて書いていきたいという方針でHTTP::Tinyでの実装で進めています。
またXML形式でなく,JSONを選択しているのは個人的に(JSONの方が)使い慣れているという点です。
予定上のサンプルコード
予定上のサンプルコードです。。基本はPHP,javascript実装によせて作ることを計画しています。
use strict; use warnings; use utf8; use WebService::YDMM; my $dmm = WebService::DMM->new(+{ affiliate_id => $ENV{affiliate_id}, api_id => $ENV{api_id}, });
まずこの用にしてAPIクライアントのインスタンスである $dmm
を作成します。今回はnewで呼び出し時に明示的にアフィリエイトIDをAPI IDを指定する方式にしています。
$keyword = 'ナース'; $responses = $dmm->product->("DMM.co.jp", +{ 'keyword' => $keyword }); map { "print $_->{title}\n" } @$responses; # ナースなんとか…etc.
公式PHPのSDKに寄せててこのように検索対象のドメインをメソッドの第一引数として取る方法と,クエリパラメータとして site=xxx
の用に取る2パターンに対応を予定しています。
またレスポンス自体はオブジェクトに包まず,JSONでデコードしてhasrefの形にして複数の場合は配列形式で返却する予定です。
懸念点
バリデーションどうする問題が微妙にあります。 ここはDMM公式SDKでも各実装によって異なっており,例えばPHP実装はクエリパラメータのバリデーションは行っていません。
また公式でないですが,Rubyでの実装に関しては,一切のバリデーションは行っていないようです。
ですがGolangの実装の場合,きちんとバリデーションをしています(ここはGolangが型付き言語であることも起因してそうですが…)
今回のようなあるサービスに特化し,さらに各クエリパラメータに最大値最小値などの制限がある場合,明確にバリデーションをAPIクライアント側でした方が良いのか…?というのは疑問点です。
今後の展望
まずは年内-年明けを目指して実装していきたいと考えています。 他にもAPIクライアントとして作成したいwebサービスがあるので,このあたりを勢いで実装出来るようになっていけるといいですね!!アドバイスなどもお待ちしています!! ありがとうございました。