WSDL就是描述XML Web服务的标准XML格式,WSDL由Ariba、Intel、IBM和微软等开发商提出。它用一种和具体语言无关的抽象方式定义了给定Web服务收发的有关 *** 作和消息。就其定义来说,你还不能把WSDL当作一种对象接口定义语言,例如,CORBA或COM等应用程序体系结构就会用到对象接口定义语言。 WSDL保持协议中立,但它确实内建了绑定SOAP的支持,从而同SOAP建立了不可分割的联系。所以,当我在这篇文章中讨论WSDL的时候,我会假定你把SOAP作为了你的通讯协议。
WSDL协议已经被提交给了Internet标准组织W3C审批,目前还处于“确认提交”状态。W3C维持着正规的标准化系统同时提交提案必须经过确定的一套批准过程才能最终成为官方协议。在这种情况下,WSDL的地位,照外行看,至少标准组织在考谨饥改虑让其成为将来可能标准中的一部分。如果你对这方面的情况感兴趣,或碰巧是一位特关心结果的“失眠症患者”,那么你不妨到W3C网站上去读读有关的建议标准。
用WSDL说明服务
作为一种基于XML的标准,如果你对XML具有一定的了解,那么WSDL的结构对你就不会陌生了。WSDL文档由服务用来描述数据类型的一组元素、服务可以收到的“消息”以及关联每条消息的SOAP绑定组成。
清单A就是一份简单的WSDL文档,该文档同W3C网站公布的WSDL示范文本是一样的,它说明了一种股票行情服务(这也是相当标准的一种Web服务)。
再仔细阅读清单A,你可以看到,文档首先以标准的XML头开头,其中包含了一个版本标识,而文档的根元素则被称为definitions。
Definitions元素可以采用若干种可选属性,这些属性说明文档同时定义文档其余部分使用的名称空间(namespace)。在这种情况下,定义被分配了一个名字(StockQuote),某些名称空间定义是根祥判据以下常规前缀缩写制定的:
tns—“this namespace”的缩写,包含被定义服务的主名称空间
xsdl—XML Schema (XSD)名称空间,用于定义文档中的类型
soap—SOAP绑定采用的名称空间
接下来,为了定义服务的接口需要在type元素内定义所需要的任何复杂类型。这里你必须注意使用标准的XSD句法(属性),它是创造数据类型定义最为适合的方法。不过,如果你愿意,WSDL也能扩展使用不同的类型定义系统。
消息概述
按WSDL的用法,消息可以是传递给某一服务公布对象上的方法的任何参数或者方法被调用之后的任何返回结果。为了继续使用股票行情这个Web服务例子,单一定义方法多半如以下伪代码所示:
floatgetLastTradePrice(string tickerSymbol)
这样,就像你从清单A所看到的那样,文档中定义了两条消息,一条代表方法的输入参数tickerSymbol(GetLastTradePriceInput消息)另一条代表该方法的返回值(GetLastTradePriceResult消息)——最新的股票价格。
*** 作把消息组织到一起而且抽象地代表方法定义。在我们的例子中,这两条消息都在 GetLastTradePrice *** 作元素下的getLastTradePrice对象方法定义中组织起来。在一个 WSDL文件中的所有 *** 作又都挨个在portType元素内分组。
WSDL文档的余下部分采用服务器上的侦听端点(binding 元素)绑定消息同时把端口定义同单一服务实体(service元素)组合起来。清单A的例子就定义了通过SOAP采用服务所需要的绑定。
WSDL工具
你可以手工创建WSDL文件,不过,你还可以采用相当多的工具通过WSDL来为你自动处理和定义Web服务。推荐工具软件如下:
Omniopera—一图形用户界面的WSDL、XML和XSD编辑器肢历
Microsoft的SOAP Toolkit—一种工具包,其中包括根据WSDL定义创建COM接口的向导程序,还包括根据COM接口创建WSDL的向导程序
IBM的Web Services Toolkit—一种工具包,其中包括产生WSDL和SOAP部署说明的向导程序
wsdlreader:Xml parser fail at是WSDL解析过程中的错误报告。这个错误通常发生在SOAP客户端试图解析WSDL文档并创建SOAP消息时。要解决这个问题,我们可以尝试以下步骤:
检查WSDL文件的语法和结构是否正确。请确保WSDL文件的语法正确,并且符合WSDL规范和约定。特别是,请检查命名空间、服务、端点、 *** 作、消息等元素是否正确声明和定义。
检查网络连接和权限是否正常。请确保网络连接正常,并且您具有访问WSDL文件所在位置的权限。如果WSDL文件托管在远程服务器上,则需要检查网络连接是否正常,并且您是否具有足够的权限下载该文件。
使用其他工具进行歼衡陵WSDL解析和SOAP消息创建。如果上述步骤氏戚无法解决问题,则可能需要考虑使用其他工具进行WSDL解析和SOAP消息创建。例如,您可以尝试使用其他拦腊SOAP客户端库(如Apache CXF、Spring Web Services等)来处理WSDL文档和SOAP消息。
请注意,某些SOAP客户端库(例如.NET Framework自带的WCF客户端)可能存在与WSDL文件格式或内容不兼容的问题。在这种情况下,您可能需要手动编辑WSDL文件或调整SOAP客户端库的配置,以使其与WSDL文件兼容。
总之,要解决wsdlreader:Xml parser fail at的报错问题,我们需要仔细检查WSDL文件的语法和结构,确保网络连接和权限正常,并使用其他工具进行WSDL解析和SOAP消息创建。同时,我们还应该注意一些SOAP客户端库存在的与WSDL文件格式或内容不兼容的问题。
c+=中使用Axis实现webservice的基本过程:使用Axis C++开发Web服务的基本过程可以简单描述如下:
1、使用Java语言描述WEB服务
2、使用Java2WSDL工具生成WSDL文件
3、使用WSDL2Ws工具生成服务端代码框架
4、编码实现service,并部署服务
5、使用WSDL2Ws工具生成客户端代码框架
6、编码实现客户端
三、实例演示
这里以一个简单的加法Add服务来说明用Axis C++构建webService的过程。
1、使用Java语言描述WEB服务
Axis C++中我们必须先定义好WSDL后方可生成用来实现该服务的代码框架,这一点与Axis Java不同。生成WSDL方法很多,可以使用Java2WSDL工具,当然明誉也可以手工编写,这里使用Java2WSDL工具生成。下面我们对Add服务用Java语言描述:
public interface Add{
public int add(int x, int y)
}
只要方法的声明即可,不需要实现方法,因此我们使用接口来定义。将上面的代码保存为Add.java。
2、使用Java2WSDL工具生成WSDL文件
javac Add.java (生成.class文件)
java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava org.apache.axis.wsdl.Java2WSDL -o Add.wsdl -l"http://localhost/axis/Add" -n"http://localhost/axis/Add" Add
经过上面两步,我们就可以得到Add.wsdl文件。需要说明的是,生成的WSDL文件有时会有错(intf都成了impl),这可能是Java2WSDL工具的Bug。如果出现这种情况,可以和Axis C++自带的例子WSDL文件对比。(注销埋:我花了两天时间才找出这个问题)
3、使用WSDL2Ws工具生成服务端代码框架
有上面的WSDL文件,我们可以用WSDL2Ws工具生成服务端构架。
java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava -cp $AXISCPP_HOME/lib/axis/wsdl2ws.jar org.apache.axis.wsdl.wsdl2ws.WSDL2Ws Add.wsdl -lc++ -sserver
-s server 表示生成server代码框架
-l c++表示生成C++代码
4、编码实现service,并部署服务
上面生成的文件中,我们只需要实现Add.cpp中的add方法即可。
... ...
xsd__int Add::add(xsd__int Value0, xsd__int Value1)
{
return Value0+Value1
}
... ...
对代码编译并链接生成.so动态库:
g++ -shared -I$AXISCPP_HOME/include -o libadd.so *.cpp
对服务进行部署,步骤如下:
(1).将生成的libadd.so文件复制至$AXISCPP_DEPLOY/lib目录
(2).复制Add.wsdl文件至$AXISCPP_DEPLOY/wsdls目录
(3).编辑AXISCPP_DEPLOY/etc/server.wsdd文件并在相应位置添加如下内容:
<service name="Add" provider="CPP:RPC" description="Add Service ">
<parameter name="className" value="/apache/axiscpp/lib/libadd.so"/>
<parameter name="allowedMethods" value="add "/>
</service>
(4).重新启动HTTP服务
(5).检查http://localhost/axis是不激斗段否有新增的Add服务
为了测试我们发布的Web服务是否工作正常,我们下面利用Axis C++来生成调用该服务的客户端代码并进行测试。
5、使用WSDL2Ws工具生成客户端代码框架
java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava -cp $AXISCPP_HOME/lib/axis/wsdl2ws.jar org.apache.axis.wsdl.wsdl2ws.WSDL2Ws Add.wsdl -lc++ -sclient
-s client 表示生成client代码框架
-l c++表示生成C++代码
6、编码实现客户端
上述命令生成了Add.hpp, Add.cpp,我们再编写客户端入口程序 AddClient.cpp:
#include "Add.hpp"
#include <stdio.h>
int main(int argc, char** argv)
{
Add ws("http://localhost/axis/Add")
int sum
if(argc<2)
{
printf("Usage:%s num1 num2\n", argv[0])
return -1
}
sum = ws.add(atoi(argv[1]),atoi(argv[2]))
printf("%d\n",sum)
return 0
}
编译客户端,生成可执行文件:
g++ -I$AXISCPP_HOME/include -L$AXISCPP_DEPLOY/lib -laxis_client -ldl -o Add *.cpp
之后,可以用Add命令测试服务工作是否正常。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)