SOAP : してログ

今ではすっかり廃れた感のある SOAP だが、久しぶり(というか PHP では初)に作成する機会があり、やっぱり苦労の連続になりました。XML 地獄という言葉もあるらしいが、しっかりと設計されておらず名前空間が入り乱れてるような複雑な XML は、もはやいじめでしかないように思う。せめて、stdClass や SimpleXML で軽くアクセスできるようなレベルに留めてもらいたいものである。

今回悩んだのは、あるメソッドに XML 文書をポストしてくる仕様で、受け取った時点で stdClass にパースされてしまっているというもの。その XML がシンプルな要素のみで構成されているなら、むしろ簡単にアクセスできるのでいいのだが、前述したような名前空間が入り乱れ、同じ要素名で属性が違うとかいうものがあると対応できない。stdClass では、名前空間プレフィクスは消えるし、属性にはアクセスできないためである。それであれば、プレーンテキストで受け取れれば簡単に解決できるのにどうしても出来ない。そもそもデフォルトでオブジェクトにするのなら DOMDocument じゃないのかなあ?

という訳で、PHP の SOAP エクステンションじゃあどうにもならないので、裏技的な手法で生の XML を取得することができたので紹介します。SOAP のリクエストは POST で来ますので、その生データを横取りする方法です。

$soapxml = file_get_contents('php://input');

注意点としては、返ってくるのは SOAP エンベロープにラップされた XML になるので、適切に抜き出す必要があるということ。具体的には、DOMDocument に変換してルート要素を抜き出して saveXML すれば良いです。他にスマートな方法があるかも知れませんが、とりあえずこれでうまく行っています。