しばらく休憩した後、もう一度問題に取り組みました。今回は、この素晴らしい記事に出くわしました(元同僚の Mike の功績によるものです)。属性elementFormDefaultが schema タグで宣言されていない場合、その値は unqualified と見なされます。「qualified」という値を指定すると、次のことが起こります。
しかし、document/literal でラップされた WSDL 内のすべてのスキーマに elementFormDefault="qualified" を追加すると、メッセージ内のすべての要素が親の名前空間で修飾されます。
通常、 elementFormDefault="qualified" を使用するとメッセージが肥大化するため使用しませんが、1 年以上前にさまざまなベンダー間で相互運用性の問題があり、この属性を設定すると問題が解決する場合がありました。
document/literal を使っていませんでしたが、試してみたいと思いました。属性を自分のスキーマ タグに追加し、別の呼び出しに要求を行いました。これが私が得た応答です:
<ns1:getUserResponse>
<return>
<ns1:firstname>First</ns1:firstname>
<ns1:lastname>Last</ns1:lastname>
</return>
</ns1:getUserResponse>
ご覧のとおり、"return" 要素の子要素には名前空間がプレフィックスとして付けられています。この時点で、自分がなりたいと思っていた場所にようやく近づいたので、本当に興奮しました。残念ながら、戻り要素には名前空間のプレフィックスがありませんでした。以前の電話 (質問の投稿を参照) をもう一度試しましたが、応答は以前と同じでした。
この問題にこれ以上時間をかけることはできませんでした。結局、それはただのプロトタイプでした。そのため、Zend_Soap_Server のハンドル関数にフックして、応答を出力する前に変更することにしました。
class Custom_Soap_Server extends Zend_Soap_Server
{
public function __construct($wsdl = null, array $options = null)
{
parent::__construct($wsdl, $options);
// Response of handle will always be returned
$this->setReturnResponse(true);
}
public function handle($request = null)
{
$response = parent::handle($request);
echo str_replace(array('<return>', '</return>'), array('<ns1:return>', '</ns1:return>'), $response);
return;
}
}
正直なところ、これは厄介なハックです。名前空間は 1 つだけであると常に想定しています。置換関数は、はるかに適切に記述できます。でも結局は試作品だったので、これを動かそうと思ったのが最初でした。
Zend_Soap_Server の代わりに新しいカスタム クラスを使用した後、返されるすべての要素の前に ns1 が付きました。