2009-04-01 22 views
6

メッセージ内に複数の名前空間を使用するnuSOAP(ここではPHP4にバインドされているため)を使用してWebServiceにアクセスしようとしています。それは可能ですか?複数の名前空間を持つメッセージにnuSOAPを使用する方法

例要求メッセージは、次のようになります。

<soapenv:Envelope ... 
    xmlns:ns1="http://domain.tld/namespace1" 
    xmlns:ns2="http://domain.tld/namespace2"> 
    <soapenv:Header/> 
    <soapenv:Body> 
    <ns1:myOperation> 
     <ns2:Person> 
     <ns2:Firstname>..</ns2:Firstname> 
     .. 
     </ns2:Person> 
     <ns1:Attribute>..</ns1:Attribute> 
    </ns1:myOperation> 
    </soapenv:Body> 
</soapenv:Envelope> 

を私は次のように試してみました:nuSOAPが正しい名前空間とのノードにこれらの名前を一致させようという希望で

$client = new nusoap_client("my.wsdl", true); 
$params = array(
    'Person' => array(
    'FirstName' => 'Thomas', 
    .. 
    ), 
    'Attribute' => 'foo' 
); 

$result = $client->call('myOperation', $params, '', 'soapAction'); 

。それから私は、要素とその名前空間を生成する)(soapvalを使用しようとした - しかし、私は、操作を呼び出す場合、nuSOAPは以下の要求を作成します。

<SOAP-ENV:Envelope ...> 
    <SOAP-ENV:Body> 
    <queryCCApplicationDataRequest xmlns="http://domain.tld/namespace1"/> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

だから、何かが「マッチング」段階中に問題が発生しました。

答えて

5

マッチングの周り試みた後、私は2つの解決策が見つかりました:

1)メッセージ を作成するためにnusoap_clientとsoapvalを()を作成するWSDLを使用しないでくださいをこのメッセージが含まれているという欠点を有しています多くのオーバーヘッド(各要素に名前空間が定義されています)。それほどうまくない。

2)パラメータのマッチングに頼る代わりに、xmlで返信を構成し、接頭辞のすべての定義を最初の要素に入れます。

$params = "<ns1:myOperation xmlns:ns1="..." xmlns:ns2="..."> 
     <ns2:Person> 
     <ns2:Firstname>..</ns2:Firstname> 
     .. 
     </ns2:Person> 
     <ns1:Attribute>..</ns1:Attribute> 
    </ns1:myOperation>"; 
まだ

ない非常に素晴らしいソリューションが、それは:-)

+0

私はちょうどあなたのソリューションを試して、それは動作します....ありがとう男。 –

0

を働くうん、私はこの同じ問題を抱えてきた(グーグル経由であなたのqを見つけました!)と私はこの遭遇しました: http://www.heidisoft.com/blog/using-nusoap-consume-net-web-service-10-min ここで、devはcoeのメッセージのxml本文を作成し、nusoapを使用して送信します。

+0

ええと、リンクが現在動作していないようです。あなたが言っていることから、彼らは同様のアプローチ(xmlを "手動で"作成する)に従ったようですね。 – wilth

4

アーウィンのポストにビルドすると、私は手動でxmlを作成し、残りの部分は実行しませんでした。私のwebhostにはPHPのsoap拡張子がないので、nusoapと一緒に行かなければなりませんでした。消費しようとしているWebサービスが各タグの名前空間を必要としていました。

Notice: Undefined property: nusoap_client::$operation in ./lib/nusoap.php on line 7674 

だから私は怠惰なルートを行って、nusoap.phpのに行って、それを幸せにするためにライン7674の前にこのコードを追加:

if(empty($this->operation)) { 
     $this->operation = ""; 
    } 

require_once('lib/nusoap.php'); 

$client = new nusoap_client('https://service.somesite.com/ClientService.asmx'); 
$client->soap_defencoding = 'utf-8'; 
$client->useHTTPPersistentConnection(); // Uses http 1.1 instead of 1.0 
$soapaction = "https://service.somesite.com/GetFoods"; 

$request_xml = '<?xml version="1.0" encoding="utf-8" ?> 
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> 
    <env:Body> 
    <n1:GetFoods xmlns:n1="https://service.somesite.com"> 
     <n1:username>banjer</n1:username> 
     <n1:password>theleftorium</n1:password> 
    </n1:GetFoods> 
    </env:Body> 
</env:Envelope> 
'; 

$response = $client->send($request_xml, $soapaction, ''); 

echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>'; 
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>'; 
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>'; 

は、その後、私は言ったエラーが発生しました

+0

インターネットを数日間精練した後、これが私を理解するのを助けた唯一のものです。ありがとうございました!そのエラーは出ませんでしたが、$ client-> endpoint = ''を設定する必要がありました。 – Cypher909

1

この問題を回避するには、nusoap_client :: call()関数を変更します。 nusoap.phpの中(バージョン1.123で7359)は、この行に次へ:

$nsPrefix = $this->wsdl->getPrefixFromNamespace("other_ns_name"); 

そして、それが働いた:$nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace);

は、私はこの1つを追加しました! 1つのプロジェクトにはこのライブラリが必要なので、このハッキングをハードコードすることは問題ありませんでした。さもなければ、私はより多くを掘り下げ、namespaceパラメタのために文字列の代わりに配列を受け入れるように関数を修正するでしょう。

関連する問題