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