2006年02月05日

F#でWebサービス(SOAP)を使う

 予告どおりVisual Studio 2005 Proを買い、F#している。まずはWebサービスを試した。

 結論からいこう。この記事のサンプルコードとほぼ同じことをするサンプルを、以下に示す。

#r @"awsecommerceservice.dll";;
open com.amazon.webservices
let rec searchRequest = new ItemSearchRequest() and do
searchRequest.Keywords <- "Star Wars";
searchRequest.SearchIndex <- "DVD";
searchRequest.ResponseGroup <- [|"ItemAttributes"; "Images"|];
searchRequest.ItemPage <- "1"
let rec itemSearch = new ItemSearch() and do
itemSearch.AWSAccessKeyId <- "14HA028HBEN2D7NVSVG2";
itemSearch.Request <- [|searchRequest|]
let ecs4 = new AWSECommerceService()
let searchResponse = ecs4.ItemSearch(itemSearch)
let items = searchResponse.Items.(0)
do Printf.printf "Total Results : %s\n" items.TotalResults
do Printf.printf "Total Pages : %s\n" items.TotalPages
let printItem = let c = ref 1 in fun (item : Item) ->
Printf.printf "%d\n" !c;
c := !c + 1;
Printf.printf "Title : %s\n" item.ItemAttributes.Title;
Printf.printf "Detail : %s\n" item.DetailPageURL;
Printf.printf "Small Image : %s\n" item.SmallImage.URL;
Printf.printf "Medium Image : %s\n" item.MediumImage.URL;
Printf.printf "Large Image : %s\n" item.LargeImage.URL
do Array.iter printItem items.Item

 読者諸氏が手元でこのコードを実行するときには、AWSAccessKeyIdをAmazonから取得してそれを使うことをお勧めする。
 バグと死は避けられない。F#のコンパイラ(バージョン1.1.8.1)のバグにより、日本語の文字列リテラルは正しく処理されない。というわけでサンプルコードは日本語を使っていない。
 さて本題に入る。1行目から。
 Visual StudioのF#プロジェクトには、「参照の追加」のたぐいが一切ない。IDEが認識する形で.NETアセンブリを参照するには、1行目のように書く。
 この awsecommerceservice.dll は、Amazon Webサービス ECS4のWSDLから生成したものだ(.NET Framework SDKのwsdlコマンドを使う)。このファイルを置くフォルダは、F#プロジェクトファイル(拡張子fsharpp)と同じでなければならない。さらに、Visual Studioを起動するときは、このプロジェクトファイルをダブルクリックして起動しなければならない。「参照の追加」のたぐいが一切ないというのは、そういうことだ。
 [| "ItemAttributes"; "Images"|]の[|...|]というカッコは、.NETの配列を作るための方言だ。中身の型から配列の型を型推論してくれる。
 let c = ref 1とc := !c + 1。F#では変数は不変なので、可変変数(?)が欲しければ、変数を参照として作る。詳しくは各種のO'Caml入門を参照のこと。
 let c = ref 1のあとのinがわかりにくい。inの右が主役で、左は脇役である。脇役がletした変数は、主役の中で使われる。脇役の位置は右のほうがわかりやすいと思うが、文句はML系言語の設計者にどうぞ。
 あとは一目瞭然だろう。

Posted by hajime at 2006年02月05日 23:05
Comments