2

以前は、PHP の SoapClient ライブラリを使用して .NET サービスを問題なく呼び出すことができましたが、現在は非 WSDL モードで同じサービスにアクセスする必要があるシナリオに直面しています。

多かれ少なかれ、サービスに送信する正しい XML 構造を作成したように見えますが、送信している変数をサーバーが取得していないようです。

SOAPUI からの出力に基づいて、次の SOAP 呼び出しを生成しようとしているはずです。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:int="http://someservices.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <int:getService>
         <int:foo>String value for foo</int:foo>
         <int:bar>String value for bar</int:bar>
      </int:getService>
   </soapenv:Body>
</soapenv:Envelope>

SOAPClient で生成している出力は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://someservices.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:enc="http://www.w3.org/2003/05/soap-encoding">
<env:Body>
        <ns1:getService env:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
            <foo xsi:type="xsd:string">String value for foo</foo>
            <bar xsi:type="xsd:string">String value for bar</bar>
        </ns1:getService>
    </env:Body>
</env:Envelope>

.NET サービスから返されたエラーは、"bar expected!" です。-少なくとも、サービスが2番目のパラメーターを取得していないことを示しています。

以下を使用して石鹸呼び出しを作成しています。

$foo = 'String value for foo';
$bar = 'String value for bar';    

$options = array(
                     'trace' => 1,
                     'exceptions' => 1,
                     'uri' => 'http://someservices.com',
                     'soapaction' => 'http://someservices.com/getService',
                     'soap_version' => SOAP_1_2,
                     'type_map' => array('type_ns' => 'int')
                     );

$response = $soapclient->__soapCall('getService', array( new SoapParam($foo, 'foo'), new SoapParam($bar, 'bar')), $options);

問題が何であるかわかりません。現在、xmlns 属性の問題である可能性があると推測しています。SOAPUI 呼び出しでは、関数呼び出しとパラメーターの前に int: が指定されていることに注意してください。このxmlnsを指定しようとしましたが、うまくいきませんでした。ご覧のとおり、Soap Client 呼び出しによって生成された xmlns は次のとおりです。

xmlns:ns1

どんな助けでも大歓迎です。

4

1 に答える 1

2

結局のところ、名前空間のラベルが int ではなく ns1 であることは問題ではありませんでした。

問題は、変数 foo と bar がそうではなかったのに対し、getService パラメーターがネームスペース ns1 でプレフィックスされていたことでした。

そのため、次のように、soapCall 関数の Soap Params に「ns1:」を追加することで解決されました。

$response = $soapclient->__soapCall('getService', array( new SoapParam($foo, 'ns1:foo'), new SoapParam($bar, 'ns1:bar')), $options);
于 2012-08-21T12:29:57.003 に答える