SOAPAction

昨日のエラーは、SOAPpyのSOAPActionがなんかおかしいということで落ち着いた。

あれこれとwebをあさってみたのだけど、結局デバッグのやり方がわからなかったので、直接観測することにした。久しぶりのetherealだ。

とかいって、ここんとこ使う機会もなかったのでインストールから。最近のFCだと

yum install ethereal

だとGUIが入らなくて、

yum install ethereal-gnome

なのね。知らんかった。

でもって、パケットキャプチャーしながら、httpのみフィルタでSOAP::Liteのクライアントと、SOAPpyクライアントのXMLを比較したところ、SOAPpyはヘッダーのSOAPActionがなんか変だということに気付いた。

SOAPAction:"hi"\r\n

と、メソッド名が入ってるし、、、、エラーの原因がなんとなく見えてきた。で、なんじゃこりゃーとかいいながらSOAPAction直接指定したらやっぱ動いた。

>>> server = SOAPProxy('http://localhost/cgi-bin/test.cgi','http://localhost/Demo', \
soapaction='http://localhost/Demo#hi')
>>> server.hi()
'hello, world'

でも、これだとあんま意味ないし。なんでデフォルト空文字列にならないのかなぁ(ソースをちら見したけどわからんかった)。SOAP::Liteで書いたサーバーのほうでSOAPAction無視するようにすればいいのかも知れないけどなんか気持ち悪いんだよナァ。

SOAP関連

DWの第三部は相互運用性とかいうネタなのな。なんだかなー(といまさらながら)思った。

KEGGみたいにWSDL書いてやればこういうことあんま気にしなくていいのかなぁ(rubyでもperlでもpythonでも楽チンですよみたいに見えるし)。それとも結構苦労したのかな?

SOAPなのに異種言語間で躓く

perl同士だと、うまく通信できてんのにpythonのクライアントだとこける。
が、原因がさっぱしわからん。

サーバー

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/perl -w

use SOAP::Transport::HTTP;

SOAP::Transport::HTTP::CGI   
  -> dispatch_to('Demo')     
  -> handle;

package Demo;

sub hi {                     
  return "hello, world";     
}

1;

perlクライアント

1
2
3
4
5
6
7
8
9
#!/usr/bin/perl -w

use SOAP::Lite;

print SOAP::Lite
  -> uri('http://localhost/Demo')
  -> proxy('http://localhost/cgi-bin/soap.cgi')
  -> hi()
  -> result;

でうまく動くのに、Dive into python 12章を参考にしたpythonクライアントは動かん。

>>> from SOAPpy import SOAPProxy
>>> server = SOAPProxy('http://localhost/cgi-bin/soap.cgi',namespace='urn:Demo')
>>> server.hi()

で実行すると、下のエラー

SOAPpy.Types.faultType: \
<Fault soap:Client: SOAPAction shall match 'uri#method' \ 
if present (got 'hi', expected 'urn:Demo#hi'

もうすこし、ちゃんと理解しないといけないなぁ。

SOAPsh.pl

SOAP::Liteをインストールすると、もれなくSOAPsh.plがついてくることをいまさら知った。

webmonkeyのSOAPを使ってスッキリサッパリの乱数生成サンプルを対話的に処理してみると

$ SOAPsh.pl http://localhost/cgi-bin/random.cgi http://localhost/Random Usage: method[(parameters)] > choose() --- SOAP RESULT --- '1'

こんな感じで、対話的に処理できるようになるのでデバッグとか便利。あとはシェルからちょこっと叩きたいときか。

IDとかの手で打てるぐらい短い文字列を入力にして、ちょっとした数字とか文字が帰ってくるようなツールだったらなんでも便利に使えそうな気がする。

物性の予測とかSOAPにしてあるので、smilesなげてやると結果が戻ってきたりとか。rule of 5とかrule of 3戻したりでもいいなぁ。

DDBJにSOAPってみる

SOAPな環境も出来たので、外のサーバーにSOAPでクエリを送ってみることに、わりと近めの遺伝研チュートリアルをみながら。

楽勝!! スクリプトがスッキリしててなんか気持ちいい

#!/usr/bin/perl #SOAP Lite のインクルード use SOAP::Lite; #WSDLの指定 $service = SOAP::Lite -> service('http://xml.nig.ac.jp/wsdl/GetEntry.wsdl'); #WEBサービスの呼び出し $result = $service->getXML_DDBJEntry("AB000003"); print $result;

この勢いで、E-Utilities Web Serviceにチャレンジしたが、どうもうまくいかない。パラメータの辺りなんだけど、、、

SOAPでpubmed検索してみたかったんだが、、、、