こんにちは。エクセルソフトの田淵です。
前回のエントリーでは Amazon API を試しに使ってみるところまでを行いました。
2016/7/21 時点での API 仕様です。変わる場合がありますのでご注意ください。
署名について
Scratchpad で[Run Request]ボタンからリクエストを生成した際に、[Request URL]セクションに生成された URL が表示されたはずです。[Unsigned URL]と[Signed URL]があり、例えば次のようになっています。
[Signed URL]が署名済みの URL なのですが、通常の URL にタイムスタンプと、URL をシークレットキーを使用して HMAC-SHA256 でハッシュ化した署名を追加する必要があります。署名については以下をご参照ください。
EULA に基本的には 1秒に 1回のアクセスが認められる。とあるように、沢山アクセスされては困るのでこのような処理をしているんだと思いますが、面倒ではありますね。ここからは実際にコードで URL を生成したいと思います。幸い Amazon にサンプルコードがありましたのでそれを使いましょう。
サンプルコードを見てみよう
Product Advertising API Signed Requests Sample Code - C# REST/QUERY
こちらをダウンロードして展開します。
コンソールアプリで動作を確認
AmazonProductAdvtApiSample.sln
を開きます。
Mac の場合は、プロジェクトの .NET のバージョンを 4.5.1 にします。(Windows は恐らくそのまま使える?未調査です。すみません。)
変更時に警告が出る場合は OK で進みます。
ItemLookupSample.cs
と SignedRequestHelper.cs
がサンプルなのですが、そのままでは動きません。Product Advertising API の仕様が変わる前のサンプルコードのようです。正しく動くように変更していきます。
現行の仕様に合わせる
まずは現在の API の仕様に合わせて問い合わせの URL を作成する部分を変更します。
ItemLookupSample.cs
の ItemLookupSample
クラスは主に以下を。
- クラス変数を追加、変更。
MY_AWS_ASSOCIATE_TAG
、ID_TYPE
を追加。DESTINATION
、NAMESPACE
を変更。
- 上記の必要な定数を
SignedRequestHelper
の引数に追加。
SignedRequestHelper.cs
の SignedRequestHelper
クラスは主に以下を。
ItemLookupSample
で引数に追加した変数を受け取れるように。sortedMap
Dictionary に必要事項を追加。
この時点での変更点は以下です。
これで実行してみましょう。以下の出力が得られれば成功です。
Method 1: ItemLookup Dictionary form. Title is ".NET開発テクノロジ入門2016年版Visual Studio 2015対応版"
Xamarin.Forms で動くように、PCL 対応する
では、これをそのまま Xamarin.Forms に持って行って動くか?というと動かないわけです。
うろ覚えですが、PCL の Profile 7 には System.Xml.XPath
, System.Net.WebRequest
, System.Security.Cryptography
などの名前空間がなかったと思います。そのため、これらを別の方法で実装しなくてはいけません。
まずは以下を変更しました。
この時点での変更点は以下です。
次は PCLCrypto を使用した署名の処理に置き換えます。
- ハッシュ化するアルゴリズム(Amazonの場合はHMAC-SHA256)を決めて SecretKey を用いて
hasher
をインスタンス化 - PCLCryptoを使用して、リクエストURLをhasherでハッシュ化して署名
この時点での変更点は以下です。
これで実行して、以下の出力が得られれば成功です。
Method 1: ItemLookup Dictionary form. Title is ".NET開発テクノロジ入門2016年版Visual Studio 2015対応版"
Xamarin.Forms で使ってみよう
ということで無事 PCL で動くようになりましたので、Xamarin.Forms アプリに組み込めば完成です(^^)
今回は Azure の Easy Table に接続するサンプルで使った関係でコードビハインドでゴリゴリですが、以下、サンプルです。
Azure の Table クラスを Task で返すように public async Task<TodoItem> Lookup(string isbn)
にして、ISBN が 10桁の場合を考慮して IsbnConverter.ConvertToISBN13(isbn);
だけ追加していますが、後はそのまま使っています。
こんな感じでタイトルを取得して、ListView には Title と画像と商品ページへのリンク(必要みたいだし)を入れています。
これで Amazon API も怖くないですね。AWS への問い合わせはわかりませんが、EC サイトはすべてこのように署名を追加する必要があるようです。
なお、10桁>13桁の変換は @ch3cooh 先生の PCL で動作する ISBN 10桁13桁入れ替えのコードをそのまま使わせてもらいました。ありがとうございます。
Xamarin 気になった方は
是非 ダウンロード して触ってみてください。Visual Studio 2015 をご利用の方は Update 3 にアップデートする際にカスタムインストールで Xamarin を追加しましょう。 学習用リソース や JXUG リンクページ に参考資料を纏めてますので併せてどうぞ。
Xamarin の導入支援サービスを始めました。ベースは基本的なアプリを一緒に作ることで Xamarin を使えるようになって頂く内容ですが、ご要望に応じて講習内容のカスタマイズも可能です。詳しくは田淵までお問い合わせください(^^)
Xamarin の情報が欲しい方はこのブログも購読いただいたり、私のTwitterアカウントをフォローいただいたりすると嬉しいです。
私が所属している エクセルソフト の宣伝を少しさせてください。弊社は開発者向けの様々なソフトウェアを扱っています。おなじみの ReSharper (JetBrains)、 や Atlassian の JIRA, Confluence、Office/PDF ファイルを .NET/Java で操作するライブラリ Aspose(アスポーズ)、Windows アプリ、Web ページ、iOS/Android アプリの UI テストができる TestComplete などお勧めです(^^) また、Visual Studio Professional/Enterprise with MSDN も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば 弊社ページ を覗いてみてください。
以上です。