1

次のMATLABコードを使用して、http: //www.webservicex.net/にあるサンプルのsoapサーバーに接続しようとしています。

% createSoapMessage(NAMESPACE,METHOD,VALUES,NAMES,TYPES,STYLE) creates a SOAP message.
% VALUES, NAMES, and TYPES are cell arrays.  
m = createSoapMessage('http://www.webserviceX.NET', 'GetCitiesByCountry', ...
  {'Australia'}, {'CountryName'}, { '{http://www.w3.org/2001/XMLSchema}string' }, 'rpc')

%    callSoapService(ENDPOINT,SOAPACTION,MESSAGE) sends the MESSAGE,
%    a Java DOM, to the SOAPACTION service at the ENDPOINT.
response = callSoapService('http://www.webservicex.net/globalweather.asmx?WSDL', ...
  'http://www.webserviceX.NET/GetCitiesByCountry', m);

次の応答があります(表示用に行末が挿入されています)。

val =
  <?xml version="1.0" encoding="utf-8"?>
  <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
      <soap:Fault>
        <faultcode>soap:Server</faultcode>
          <faultstring>System.Web.Services.Protocols.SoapException: 
          Server was unable to process request. 
          ---&gt; System.Data.SqlClient.SqlException: 
          Procedure or function 'getWCity' expects parameter '@CountryName',
          which was not supplied.
          at WebServicex.GlobalWeather.GetCitiesByCountry(String CountryName)
          --- End of inner exception stack trace ---
        </faultstring><detail />
      </soap:Fault>
    </soap:Body>
  </soap:Envelope>

サーバーが応答していることを知っています。私はそれをPythonと次のようにsudsで調べることができます:

from suds.client import Client
url = 'http://www.webservicex.net/globalweather.asmx?WSDL'
client = Client(url)
result = client.service.GetCitiesByCountry('Australia')

私の簡単な質問は、私が何を間違っているのかということです。

また、createSoapMessageが作成するDOMオブジェクトを表示する方法と、MATLABが送受信するxmlを表示する方法も知りたいです。

4

1 に答える 1

1

正しいコードは次のようになります。

% createSoapMessage(NAMESPACE,METHOD,VALUES,NAMES,TYPES,STYLE) creates a SOAP message.
message = createSoapMessage( ...
  'http://www.webserviceX.NET', ...
  'GetCitiesByCountry', ...
  {'Australia'}, ...
  {'CountryName'}, ...
  {'{http://www.w3.org/2001/XMLSchema}string' }, ...
  'document')

% callSoapService(ENDPOINT,SOAPACTION,MESSAGE) sends the MESSAGE,
response = callSoapService( ...
  'http://www.webservicex.net/GlobalWeather.asmx', ...
  'http://www.webserviceX.NET/GetCitiesByCountry', ...
  message);

% parseSoapResponse Convert the response from a SOAP server into MATLAB types.
cities = parseSoapResponse(response)  

特定の違いは次のとおりです。

  • STYLEパラメーターは「rpc」ではなく「document」です
  • www.webservicex.netは、それらがどのように資本化されるかについて非常に一貫性がなく、それは重要です!
  • エンドポイントパラメータは.asmxを終了し、?WDSLを含みません。

parseSoapResponse呼び出しの例も追加しました。これも私にトラブルを引き起こしました。このWebサービスの場合、この呼び出しは、要求されたデータを含む構造のみを返します。同じホストで別のサービスを使用している場合、parseSoapResponse2つの出力、良い/悪い結果とデータが返されました。Matlabを使用したSOAPリクエストの送信を参照してください。

message最後に、MATLABでのSOAPメッセージなどの中間XMLの表示に関する補足の質問に答えるには、次を使用します。

 javaString = message.saveXML(message.getFirstChild())

Java文字列でXMLを取得してから、次のようにします。

 matlabString = char(javaString)

XMLをMATLAB文字列で取得します。

次のコードは、デバッグに役立つように、XMLを複数行にわたって表示するための改行とスペースを追加します。

ms2 = regexprep(matlabString ,'>','>\n')
ms3 = regexprep(ms2,' x','\n  x')

ブラウザでできるように、MATLABで発信および着信HTTPトラフィックを表示する方法がまだわかりません。

于 2012-08-15T10:19:40.570 に答える