某 WebService に Perl プログラムから SOAP で接続する案件があった。
で、何度やっても VersionMismatch(SOAPエンベロープの名前空間が合わない・・・というエラー)が発生する。
なんか、SOAP::Lite モジュールではよくあることのようで、ググってたら SOAP::Data で明示的に SOAP要素に値、名前を指定してやったらOKになった・・・なんて記述もあったのでやってみたのだが、今度は namespace mismatch なエラーが。
つーか、これも名前空間が合わないってエラーじゃん。
エラー時に Only SOAP 1.1 or SOAP 1.2 messages are supported in the system って言われたので、SOAP v1.1 でずっと通信してたのだが、ここで、SOAP v1.2 での処理に変えてみると・・・
・・・あっけなく上手くいってしまった・・・
例えば、ID,Password を投げてユーザ情報を取ってくる処理なら、
use SOAP::Lite +trace;
my $client = SOAP::Lite->service('https://service.exsample.com/ServiceHandler?wsdl');
# SOAP 1.2 で接続
$client->soapversion('1.2');
$client->envprefix('soap12');
$client->readable('true');
$result = $client->getUserInfo('hogehoge', 'hogepass');
print "Name=" . $result->{'name'} . "\n";
print "Phone=" . $result->{'phone'} . "\n";
print "Address=" . $result->{'address'} . "\n";
みたいな感じ。
まあ、上手くいったので取りあえずはOKなのだが、SOAP v1.1 の時は何がいけなかったのか気になってしまう、45の冬。