7

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

リクエスト メッセージの例は次のようになります。

<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>

私は次のことを試みました:

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

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

nuSOAP がこれらの名前を正しい名前空間とノードに一致させようとすることを期待して. 次に、soapval() を使用して要素とその名前空間を生成しようとしましたが、操作を呼び出すと、nuSOAP は次の要求を作成します。

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

そのため、「マッチング」フェーズで何か問題が発生します。

4

4 に答える 4

5

マッチングを試してみたところ、2 つの解決策が見つかりました。

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

2) パラメータの一致に頼る代わりに、xml で返信を作成し、プレフィックスのすべての定義を最初の要素に入れます。

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

まだあまり良い解決策ではありませんが、うまくいきます:-)

于 2009-04-09T12:49:11.690 に答える
4

Irwin の投稿に基づいて、xml を手動で作成し、残りは nusoap に任せました。私のウェブホストにはphp soap拡張機能がないため、nusoapを使用する必要があり、消費しようとしているウェブサービスには、各タグの名前空間が必要でした(たとえば、ここの例のユーザー名とパスワード)。

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>';

次に、次のようなエラーが発生しました。

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

そこで私は怠惰な方法で nusoap.php に入り、7674 行目の前に次のコードを追加して満足させました。

    if(empty($this->operation)) {
        $this->operation = "";
    }
于 2010-06-08T21:41:11.237 に答える
2

この問題を回避するもう 1 つの方法は、nusoap_client::call() 関数を変更することです。nusoap.php のこの行 (バージョン 1.123 では 7359) の横:

$nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace);

これを追加しました:

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

そしてそれは働いた!このライブラリは 1 つのプロジェクトにしか必要なかったので、このハックをハードコーディングしても問題ありませんでした。それ以外の場合は、さらに掘り下げて、名前空間パラメーターの文字列ではなく配列を受け入れるように関数を変更します。

于 2010-12-14T01:06:35.660 に答える
0

ええ、私はこれと同じ問題を抱えていました(Google経由でqを見つけました!)、これに出くわしました: http://www.heidisoft.com/blog/using-nusoap-consume-net-web-service- 10 分 ここで、開発者はメッセージの xml 本文を coe で作成し、nusoap を使用して送信します。

于 2009-11-05T11:20:28.223 に答える