为什么从Matlab调用此Web服务接收null?

时间:2016-06-16 16:10:36

标签: matlab web-services soap

我创建了一个非常基本的Web服务“操作”,其操作名为“hello”。它完全可以从SoapUI中运行,但是当我使用 Matlab 2014a 来调用它时,永远不会获得输入参数。所以hello()总是返回“Hello null!”和其他操作,如addition(),总是返回0.我已经遵循Matlab的帮助,我无法看到发生了什么。

我所做的是:

>> 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 Service并返回了答案,但未获得输入参数。

生成的代码hello.m对我来说似乎很好:

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

我已捕获网络流量以查看SOAP消息,而Matlab确实发送了参数,消息看起来很好:

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

发生了什么事?

修改

我也在日志中找到了这个:

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

1 个答案:

答案 0 :(得分:0)

经过大量测试后,我认为这是由于旧的Matlab Web Service实现出现错误,特别是与此处缺少显式命名空间相关body { background-color: black; } #earth { width: 100px; height: 100px; background: url(http://www.noirextreme.com/digital/Earth-Color4096.jpg); border-radius: 50%; background-size: 210px; box-shadow: inset 16px 0 40px 6px rgb(0, 0, 0), inset -3px 0 6px 2px rgba(255, 255, 255, 0.2); animation-name: rotate; animation-duration: 4s; animation-iteration-count: infinite; animation-timing-function: linear; } @keyframes rotate { from { background-position-x: 0px; } to { background-position-x: 210px; } }

从版本2014b开始,a new way to call Web Services基于JDK和Apache CXF,并且正确调用使用Web服务。根据文档,步骤是:

  
      
  1. 安装和/或找到Java JDK和Apache CXF程序。
  2.   
  3. 设置   JDK和CXF程序的路径使用   matlab.wsdl.setWSDLToolPath函数。保存路径的值   在您的用户首选项中跨会话,因此您只需要   指定一次。
  4.   
  5. 将MATLAB当前文件夹更改为该位置   您要在哪里使用从WSDL文档生成的文件。   您必须拥有此文件夹的写入权限。
  6.   
  7. 运行   matlab.wsdl.createWSDLClient,提供WSDL文档位置,   它可以是URL或文件的路径。该函数转换为   服务器的MATLAB类API,并在其中创建一个类文件夹   当前文件夹。类文件夹包含使用的方法   服务器的API。该函数始终创建一个构造函数方法   与班级同名。你只需要运行   matlab.wsdl.createWSDLClient函数一次。您可以访问该课程   之后的任何时候。
  8.   
  9. 随时创建班级的对象   使用服务的操作。
  10.   
  11. 查看有关的信息   用于查看可供您使用的方法(操作)的类。
  12.   
  13. 使用对象的方法来运行应用程序并进行交换   与服务器的数据。 MATLAB自动转换XML数据类型   到MATLAB类型,反之亦然。
  14.   

注意:根据所使用的Matlab版本,您可能需要提供最低版本或特定版本的JDK

一个例子可以是:

<hello xmlns="http://webservices/">

较新版本生成以下SOAP消息:

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