Archive for the 'XML-RPC' Category

2015/10/06 XML-RPCのテスト

オープンソースのXML-RPCフレームワークを利用して、Web上のXML-RPCのサービスを呼び出すAppleScriptです。

AppleScriptにはcall soapやcall xmlrpc命令などが標準で実装されており、割と便利に使っています。

ただし、複雑な処理を行った場合に問題が見られました。たとえばWordPressに対して新規記事作成をリクエストした場合に、call xmlrpc命令自体が実行途中で100%クラッシュするなど、信頼性については疑問符がつき、安定性については「出たとこ勝負」なヤケッパチ感が漂っておりました。

AppleScriptの処理系がSOAPやXML-RPCの命令を実装したのは比較的早く、Mac OS X登場後間もないタイミングであったと記憶しています。ただし、この「早すぎた登場」にのちのち苦しめられることになります。

のちにAppleがOS XのIntel移行+64bitへの移行を決定。これに伴い、Carbon系の機能を使っているプログラムは事実上アップデートされないことになりました。

AppleScriptの処理系自体はIntel対応→Cocoa化→64bit化→マルチスレッド化+Scripting Bridge対応など進化して行ったのですが、call xmlrpcの機能モジュールについては「Carbon APIを使っているためアップデートしない(=バグ修正しない)」との明確な回答がAppleのエンジニアからありました。

XML-RPCの利用頻度自体はそれほど高くないため、致命的な問題にはなってはいないものの「いつか、Apple標準のcall xmlrpc命令の代わりになるものを見つけなくては」という問題意識は持っていました。

そんな中、オープンソースのXML-RPCのフレームワークをいくつか見つけ、AppleScriptから呼び出す実験を実施。その中で同期通信の機能を持っていたEric Czarny氏とNikolay Kasyanov氏のフレームワークにたどりつきました。

いろいろ試行錯誤して、AppleScriptからこのオープンソースのXML-RPCフレームワークを呼び出して、インターネット上のサービスを呼び出して使えることを確認したのが本AppleScriptです。Script Editor+ASObjC Explorer 4+OS X 10.11.0、Script Editor+OS X 10.10.5上での動作を確認しています。

XML-RPC frameworkについて、OS X 10.10以降をターゲットOSにしてビルドしたものも用意しておきました。興味のある方はおためしを(~/Library/Frameworks/にインストール)。

→ Download Framework(binary)

AppleScript名:ASOCでXML-RPCのテスト v3
– Created 2015-10-06 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
use framework “XMLRPC”
–XMLRPC.framework
–https://cocoapods.org/pods/xmlrpc
–Cocoa XML-RPC Framework © 2011 Divisible by Zero
–v2.3.4

set aRes to (my callXMLRPC(“http://yubin.senmon.net/service/xmlrpc/”, “yubin.getMaxFetchCount”, missing value)) as integer
–>  100

set bRes to (my callXMLRPC(“http://yubin.senmon.net/service/xmlrpc/”, “yubin.getVersion”, missing value)) as text
–> “15.09a”

on callXMLRPC(paramURL, aMethod, aParamList)
  
  
set aURL to current application’s |NSURL|’s URLWithString:paramURL
  
set aReq to current application’s XMLRPCRequest’s alloc()’s initWithURL:aURL
  
aReq’s setMethod:aMethod withParameter:aParamList
  
set aRes to current application’s XMLRPCConnection’s sendSynchronousXMLRPCRequest:aReq |error|:(missing value)
  
  
set errF to (aRes’s isFault()) as boolean
  
  
if errF = true then
    set xmlRPCres to faultCode of aRes
    
–set xmlRPCbody to faultString of aRes
  else
    set xmlRPCres to aRes’s object()
    
–set xmlRPCbody to aRes’s body()
  end if
  
  
return xmlRPCres
  
end callXMLRPC

★Click Here to Open This Script