采用axis2c进行webservice发布的流程6-测试发布的服务
测试方法有两种,一种是生成采用axis2c生成对应的客户端代码,采用客户端代码进行测试,另一种是采用curl进行提交xml请求文件进行测试,不过自己书写请求xml可能会比较麻烦。
5.1采用axis2c的客户端代码进行测试
这一部分介绍采用axis2c的工具生成客户端代码,在此基础上构造c的客户端请求例子。
首先设定好环境变量:
export AXIS2C_HOME="/opt/axis2c-1.6.0/" export AXIS2_HOME="/opt/axis2-1.4.1/"
客户端代码的生成与服务端的操作类似,对axis2的调用命令略有不同:
采用wsdl生成对应的客户端代码:
sh ${AXIS2C_HOME}/bin/tools/wsdl2c/WSDL2C.sh -uri dmsserver.wsdl -g -d adb -u -uw -f -o client | grep -v 'the classpath'
下边的代码就是WSDL2C.sh的内容,简单说来就是调用了axis2的java包进行生成。因而axis2的home是必须要指明白的。
#!/bin/sh #export AXIS2_HOME=/home/axis2java for f in $AXIS2_HOME/lib/*.jar do AXIS2_CLASSPATH=$AXIS2_CLASSPATH:$f done export AXIS2_CLASSPATH echo the classpath $AXIS2_CLASSPATH java -classpath $AXIS2_CLASSPATH org.apache.axis2.wsdl.WSDL2C $*
下面就需要对客户端代码做封装实现对服务的具体调用了。
采用axis2c自动生成的客户端代码列表如下:
"ProductCompleteType" |
adb_ProductCompleteType.c |
|
adb_ProductCompleteType.h |
"ProductCompleteResponseType" |
adb_ProductCompleteResponseType.c |
|
adb_ProductCompleteResponseType.h |
"ProductComplete" |
adb_ProductComplete.c |
|
adb_ProductComplete.h |
"ProductCompleteResponse" |
adb_ProductCompleteResponse.c |
|
adb_ProductCompleteResponse.h |
axis2_stub_DmsServer.c和axis2_stub_DmsServer.h中定义了具体的服务调用,这个可以通过查看头文件知悉。
对于服务的调用,调用方法在axis2_stub_DmsServer.c文件中定义,axis2c生成了两种调用类型模式,一种是异步类型的方法调用,以axis2_stub_start_op这种方式开头的函数,一种是同步方式调用的,以axis2_stub_op开头的函数。当然了由于调用方式的不同,其对应的返回值也有所差别。
客户端测试需要做的就是构造出服务env,创建出stub,然后进行服务调用。简单起见,就暂且采用同步这种比较简单的方式进行调用了。
1、构造env
axutil_env_create_all可以创建出axis的上下文运行环境,
axutil_env_t * env=axutil_env_create_all (NULL, 0);
2、创建stub
axis2_stub_create_DmsServer可以创建stub,需要三个参数上一步创建的env、axis2c的环境目录、服务的地址。这里是针对这个服务测试例子生成的,具体的函数名字是不同的。
3、进行服务调用
构造对应服务的请求,并调用相应的函数。构造服务请求的过程同服务端的过程类似。
通过以上步骤,经过简单封装,成了本例子的测试方案,编译完成后,具体的测试调用如下:
./DMSClient_full 127.0.0.1:9090 productComplete food tutou
如果出现ERROR: cannot get AXIS2C_HOME的错误,export AXIS2C_HOME="/opt/axis2c-1.6.0/"再测。
5.2采用curl进行测试
这一部分介绍如何采用curl进行webservices的测试,包括测试过程中的注意事项。
curl -v -H "Content-Type:text/xml; charset=utf-8" \ -H "SOAPAction:urn:ProductComplete" -d @request.xml \ "http://127.0.0.1:8777/axis2/services/DmsServer/"
服务的路径有所不同,切记。
下面将解释下命令的意思,-v表示verbose,将curl与服务器之间交互处理的细节内容打印出来,-H表示此次http请求header头信息,此处的header含义是指这次传输的内容是xml,编码方式是utf8,同时也是一个soap类型的请求,而不是普通的http页面请求。在-H设定中的SoapAction与wsdl中的相对应。比如我的这个测试例子在wsdl中的定义如下所示,其中红字标红的部分。-d表示提交的内容,@符号表示此处提交的是一个文件,后边跟的就是文件名字,用于soap请求。-d后边也可以直接跟上xml的字符串,效果类似,如果挂起一长串字符不大好处理。
<wsdl:binding name="DmsServerSoapBinding" type="tns:DmsServerPortType"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <wsdl:operation name="ProductComplete"> <soap:operation soapAction="urn:ProductComplete" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding>
下面附上请求的xml文档,格式比较简单,也很好书写。如果感觉手写麻烦,可以在采用axis2c客户端测试时,采用抓取下其中发送的xml数据包,比如采用tcpdump -i lo –A这个只是用于本地测试的。
Xml的请求格式数据如下:
<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> </soapenv:Header> <soapenv:Body> <n:ProductComplete xmlns:n="http://server.ips.com"> <n:productCategory>han</n:productCategory> <n:productName>xiangduo</n:productName> </n:ProductComplete> </soapenv:Body> </soapenv:Envelope>
此处采用的curl进行测试的是最简单的,请求的xml里边主要需要对body进行构造,构造出这些必要的请求参数。
所有一切搞定后,就可以查看具体与webservices之间的交互过程了。注意观察服务器的响应状态。我在测试的时候,刚开始总出现500的服务器内部错误,返回又错误的消息是index out of bound,刚开始还以为服务没有写好呢,检查的时候,才发现将header头中的的text写成test了,xml的文件格式写的也有问题。
因此在测试的时候,务必检查好curl的命令没有输入错误,xml文件格式是否正确。
posted on 2012-08-20 13:40 hanxiangduo 阅读(525) 评论(0) 编辑 收藏 举报