2016-06-16 3 views
0

非常に基本的なWebサービス「操作」を「hello」という操作で作成しました。それはSoapUIから完全に動作しますが、Matlab 2014aを使用すると、入力パラメータは決して取得されません。したがって、hello()は常に「Hello null!」を返します。 addition()などの他の操作は常に0を返します。私はMatlabのヘルプに従っており、何が起こっているのかを見ることができません。私がやっていることMatlabから呼び出されるこのWebサービスがnullを受け取るのはなぜですか?

は次のとおりです。

>> createClassFromWsdl('http://ip/WebServiceTest/operation?wsdl') 
ans = operation 
>> obj = operation 
endpoint: 'http://ip/WebServiceTest/operation' 
     wsdl: 'http://ip/WebServiceTest/operation?wsdl' 
>> methods(obj) 
addition   display  hello  operation 
>> hello(obj, 'John') 
ans = 

Hello null! 

これは、Webサービスが正しく呼び出されることを実証しているとそれが答えを返しますが、入力パラメータが得られません。私は、SOAPメッセージを確認するために、ネットワークトラフィックをキャプチャしている

function xReturn = hello(obj,name) 
%hello(obj,name) 
% 
%  Input: 
%  name = (string) 
% 
%  Output: 
%  return = (string) 

% Build up the argument lists. 
values = { ... 
    name, ... 
    }; 
names = { ... 
    'name', ... 
    }; 
types = { ... 
    '{http://www.w3.org/2001/XMLSchema}string', ... 
    }; 

% Create the message, make the call, and convert the response into a variable. 
soapMessage = createSoapMessage(... 
    'http://webservices/', ... 
    'hello', ... 
    values,names,types,'document'); 
response = callSoapService(... 
    obj.endpoint, ... 
    '', ... 
    soapMessage); 
xReturn = parseSoapResponse(response); 

とMatlabのは確かにパラメータを送信し、メッセージが正常に見える:

生成されたコードhello.mは、私には罰金だ

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
     <hello xmlns="http://webservices/"> 
     <name xsi:type="xs:string">John</name> 
     </hello> 
    </soap:Body> 
</soap:Envelope> 

SoapUIから返された同じメッセージ、正しいHello John!の値は次のようになります。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservices/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <web:hello> 
     <!--Optional:--> 
     <name>John</name> 
     </web:hello> 
    </soapenv:Body> 
</soapenv:Envelope> 

何が起こっていますか?私もログでこれを発見した


EDIT

Received WS-I BP non-conformant Unquoted SoapAction HTTP header 

答えて

0

多くのテストの後、私は、これは古いMatlabのWebサービスの実装上のエラーが原因であると考えています特にここでは明示的な名前空間の欠如に関連しています<hello xmlns="http://webservices/">

バージョン2014bからは、JDKとApache CXFに基づく、およびWebサービスの使用は正しく呼び出されます。文書によると、手順は次のとおりです。

  1. は、インストールおよび/またはJava JDKとApache CXFプログラムを探します。
  2. matlab.wsdl.setWSDLToolPath関数を使用して、JDKおよびCXFプログラムへのパスを に設定します。パスの値は、ユーザーの設定でセッション間で に保存されるため、一度指定する必要があるのは です。
  3. MATLABの現在のフォルダを、WSDLドキュメントから生成されたファイルを使用する の場所に変更します。 このフォルダには書き込み権限が必要です。
  4. matlab.wsdl.createWSDLClientを実行し、WSDLドキュメントの場所を指定します。 は、URLまたはファイルのパスにすることができます。関数は サーバーのAPIをMATLABクラスに変換し、現在のフォルダ にクラスフォルダを作成します。クラスフォルダには、 サーバーのAPIを使用するためのメソッドが含まれています。この関数は常に、 がクラスと同じ名前を持つコンストラクタメソッドを作成します。 matlab.wsdl.createWSDLClient関数を実行する必要があります。その後、いつでもクラス にアクセスできます。
  5. でサービスの操作を使用するときはいつでもクラスのオブジェクトを作成します。
  6. クラスについての情報を参照して、使用できるメソッド(操作)を確認してください。
  7. オブジェクトのメソッドを使用してアプリケーションを実行し、サーバーと データを交換します。 MATLABは自動的にXMLデータ型 をMATLAB型に変換します。逆もまた同様です。

注:

jdk = 'C:\Program Files\Java\jdk1.7.0_79' 
cxf = 'C:\Program Files\apache\apache-cxf-2.7.18' 
matlab.wsdl.setWSDLToolPath('JDK',jdk,'CXF',cxf) 
matlab.wsdl.createWSDLClient('http://ip/WebServiceTest/operation?wsdl') 
javaaddpath('.\+wsdl\operation.jar') 
obj = operation 
methods(obj) 
hello(obj, 'John') 

新しい:Matlabののバージョンによってはあなたの例では、可能な最小またはJDK

の特定のバージョンを提供する必要がある場合があります使用しました次のSOAPメッセージが生成されます。

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <ns2:hello xmlns:ns2="http://webservices/"> 
      <name>John</name> 
     </ns2:hello> 
    </S:Body> 
</S:Envelope> 
関連する問題