AppleScriptでSOAPクライアント。エンコードで玉砕か?
SOAP-RPCサーバの実装は一応完了しました。後は当初の目的であるAppleScriptによるクライアントの実装。Rubyスクリプトでも事は足りているのですがやっぱりマックチームにはGUIで提供したいというのが今回の主眼。
ApplescriptでのSOAPクライアントの実装は意外と簡単そうで、XML-RPC and SOAP Programming Guide: AppleScript Support for Remote Procedure Callsで大体のことはわかります。
情報取得の部分はたったのこれだけ、適当な変数(この例ではreturnArray)に取得します。
with timeout of 15 seconds
tell application "http://10.0.1.4:3000/lovemac/service"
--データの取得
set returnArray to call soap {method name:"GetItemInfoById",
method namespace uri:"urn:LovemacService",
SOAPAction:"", parameters:{age:20}}
end tell
end timeout
end try
結果は、TableViewに表形式で表示するのでこんなカンジになります。
tell window "mainwin" set item_list to table view "tableview" of view "scrollview" end tell set ds to data source "itemsource" of item_list repeat with k from 1 to (returnArray count) set info to (item k of returnArray) set theNewRow to make new data row at end of data rows of ds set contents of data cell "name" of theNewRow to (name of info) set contents of data cell "age" of theNewRow to (age of info) end repeat
ところで、この例でnameデータは日本語を含む名称なんですがここはどうやらURLエンコーディングされたデータでセットされるようでこのままでは表示できませんでした。それで、デコードすればいいのかってことでApplescriptでURIデコードする方法を探したのですがなんとApplescirptにはURLエンコード・デコードをする機能がない!らしい...as stringやas textとやってみましたがダメ。
ここまできて、そりゃないよぉ。CoreFoundationにCFURLCreateStringByReplacingPercentEscapesUsingEncoding()というメソッドがあってこれを使えばできそうなんだけど...
というわけで、まだ完成していません。このまま玉砕・撤退するか思案中です。まあ、それ以外にもいくつか選択肢はあって楽な順に書くと
- 玉砕・撤退。いいじゃん、ターミナルでという態度を貫く
- Applescriptからshell経由で外部プログラム(ex.ruby:URI.decode())を呼び出して変換
- Objective-Cのクラスを実装してこれをApplescriptから使う
- Applescriptでデコードをシコシコ実装する
- Objective-Cでネイティブなアプリを書く
といったところです。いづれにせよ、やってみないとうまくいくのかどうか?やれやれ...ですね。
それにしてもCFURLCreateStringByReplacingPercentEscapesUsingEncoding()って、長すぎません?
この記事のトラックバックURL:
六本木レストラン・RUBYはワイン色の宝石。ワインは宝石のように貴重なもの・・・
店名のRUBYはワインの意味でもあり、ワインにこだわり、どこまでもワインをテーマにしていく








Comments
コメントありがとうございます。ご指摘のとおり、nameやinfoの変数名はちょっと危険そうですが、デバガで確認するとちゃんと値は入っているようで大丈夫かなと思います。(パイプで囲んでもファイルを保存するとパイプは消えちゃいます。)次のエントリにも書いたのですが日本語以外であればちゃんとsetできるんですよ。URLエンコードの事に関しては完全に僕の勘違いで、普通にUTF8のコードが入っているようです。
いずれにせよ、貴重なアドバイスありがとうございます。ASは今回初めてのトライなのでまたアドバイス頂ければ幸いです。
もしかしたら、僕が話の流れを読み間違えているかもしれませんが…(汗)
ソースを鵜呑みにすると、
nameやinfoをパイプで囲って(「set |info| to...」「|name| of info」)いないので詰まっている、ってことはないでしょうか。URL デコードできなくても、無理矢理表示することはできそうな気がするので、その前が怪しいのかなと。