采用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文件格式是否正确。

原文地址:https://www.cnblogs.com/hanxiangduo/p/2647447.html