51Testing软件测试论坛
标题:
第一次开发经历-webservice
[打印本页]
作者:
老白的释然
时间:
2018-6-20 15:24
标题:
第一次开发经历-webservice
2018年5月24日接到人生第一个开发任务:利用webservice将本地客户端数据定时上传给服务端。
一、首先补充webservice的基础知识,弄清楚流程如下:
1.客户端把调用方法参数转换成符合WSDL格式定义的XML文档片段(包含SOAP消息,input消息);
2.通过网络将XML文档片段发送给服务器;
3.服务器接收XML文档;
4.服务器解析XML文档,提取其中的数据,并把数据转换成webservice所需的参数值;
5.服务器执行方法,把执行方法得到的返回值再次转换为XML文档片段(包含SOAP消息,output消息);
6.通过网络将XML文档片段发送给客户端;
7.客户端接收XML文档片段,解析并提取其中的数据,数据转换成webservice的返回值。
即唯一的要求就是编写webservice的语言要能够支持XML文档生成和解析、网络传输。
二、接下来解析WSDL文档:
[attach]116607[/attach]
三、接下来说明理论开发过程(使用CXF开发框架):
1.使用CXF开发webservice服务器端(包括接口和实现类):开发业务接口(该接口用@webservice
修饰);开发实现类(也需要用@webservice修饰);发布webservice(使用endpoint类的静态pub
lish方法暴露webservice即可)
2.使用CXF开发webservice客户端:调用cxf提供的wsdl2java工具,根据wsdl文档生成java代码;找
到生成的类中,继承了service的类(该类的实例可以当工厂来使用);调用service子类的实例的g
etXXXPort方法,返回远程webservice的代理。
四、接下来说明我的操作步骤,源码附在最后。
1.服务端已将wsdl文件暴露,因此根据服务端提供的wsdl地址生成客户端类(dos下,打开到相应
目录下,执行wsimport -keep XXXX.wsdl,即可在目录中生成客户端类),再编写一个类进行调用。
[attach]116608[/attach]
[attach]116609[/attach]
以上将三个测试定值以xml文本格式上送服务端,执行得到如下反馈说明正确:
[attach]116610[/attach]
2.现在加入15分钟定时器代码
[attach]116611[/attach]
执行得到如下反馈说明正确:
[attach]116612[/attach]
3.现在要去数据库取相应的值替代第一步中的固定测试值即可,首先在数据库中建立一个视图,将
所需的数据放在一起(一个虚拟表里),java程序直接访问视图,取出对应时间的数值即可。CRE
ATE or replace VIEW senddata AS
SELECT c.OCCUR_TIME,a.cur_083,b.cur_035 ,c.plus
FROM YC_HS_000011 a,YC_HS_640002 b ,
(select ych.cur_035-nvl(lead(cur_035) over(ORDER BY OCCUR_TIME desc),0)plus ,cur_035 , OC
CUR_TIME from YC_HS_640002 ych order by OCCUR_TIME desc) c
WHERE a.OCCUR_TIME = b.OCCUR_TIME and a.OCCUR_TIME = c.OCCUR_TIME ORDERBY c.O
CCUR_TIME
检查生成的视图,无误即可。这一部中要学会怎么在数据库客户端测试sql语法。
4.java代码中访问视图,按照对应的时间取出三个字段的值作为一个结果集,首先需要一个提供jd
bc服务的标准类,这里从老员工处拷贝SqlBean.java文件(注意修改其中数据库的地址、端口、用
户名、密码等数据)。结果集中的数据依次赋值给变量,将变量替换xml文本中的固定测试数值。
5.附上源代码
<p>
</p><p>package ttt;</p><p>
</p><p>import ToSqlBean.SqlBean;</p><p>
</p><p>import org.apache.axis.client.Call;</p><p>
</p><p>import org.apache.axis.client.Service;</p><p>
</p><p>import javax.servlet.ServletContext;</p><p>
</p><p>import javax.xml.namespace.QName;</p><p>
</p><p>import java.sql.ResultSet;</p><p>
</p><p>import java.sql.SQLException;</p><p>
</p><p>import java.text.ParseException;</p><p>
</p><p>import java.text.SimpleDateFormat;</p><p>
</p><p>import java.util.Calendar;</p><p>
</p><p>import java.util.Date;</p><p>
</p><p>import java.util.Timer;</p><p>
</p><p>import java.util.TimerTask;</p><p>
</p><p>/**</p><p>
</p><p>* Created by hht on 2018/6/5.</p><p>
</p><p>*/</p><p>
</p><p>public class ToTimer {</p><p>
</p><p>public static void main(String[] args){</p><p>
</p><p>final SimpleDateFormat dateFormatter =new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");</p><p>
</p><p>final Calendar calendar = Calendar.getInstance();</p><p>
</p><p>Date startDate =null;</p><p>
</p><p>try {</p><p>
</p><p>startDate = dateFormatter.parse("2018/06/07 15:40:00");</p><p>
</p><p>}catch (ParseException e) {</p><p>
</p><p>e.printStackTrace();</p><p>
</p><p>}</p><p>
</p><p>Timer timer =new Timer();</p><p>
</p><p>//以下每15分钟定时执行</p><p>
</p><p> timer.scheduleAtFixedRate(new TimerTask(){</p><p>
</p><p>@Override</p><p>
</p><p> public void run() {</p><p>
</p><p>//System.out.println("execute task!" + this.scheduledExecutionTime());</p><p>
</p><p>// System.out.println("execute task!" +dateFormatter.format(calendar.getTime()));</p><p>
</p><p>//确认目前的时间</p><p>
</p><p> System.out.println("execute task!" +dateFormatter.format(new Date()));</p><p>
</p><p>//连接数据库,去读数据</p><p>
</p><p> ServletContext application=null;</p><p>
</p><p>SqlBeansqlbean=new SqlBean(application);</p><p>
</p><p>sqlbean.GetConn();</p><p>
</p><p>ResultSet rs=sqlbean.executeSqlQuery("select CUR_083,CUR_035,PLUS from SENDDATA where OCCU</p><p>R_TIME=(select * from (SELECT OCCUR_TIME FROM SENDDATA order by OCCUR_TIME DESC ) wher</p><p>e ROWNUM = 1)");</p><p>
</p><p>try {</p><p>
</p><p>while(rs!=null && rs.next()) {</p><p>
</p><p>int id1=rs.getInt(1);</p><p>
</p><p>int id2=rs.getInt(2);</p><p>
</p><p>int id3=rs.getInt(3);</p><p>
</p><p>// int id4=rs.getInt("4");</p><p>
</p><p>// int id5=rs.getInt("5");</p><p>
</p><p>// int id6=rs.getInt("6");</p><p>
</p><p>System.out.println(id1);</p><p>
</p><p>System.out.println(id2);</p><p>
</p><p>System.out.println(id3);</p><p>
</p><p>}</p><p>
</p><p>}catch (SQLException e) {</p><p>
</p><p>// TODO Auto-generated catch block</p><p>
</p><p> e.printStackTrace();</p><p>
</p><p>}</p><p>
</p><p>sqlbean.CloseDataBase();</p><p>
</p><p>//开始将读到的数据上传</p><p>
</p><p> try {</p><p>
</p><p>String wsdlUrl ="http://114.215.157.224:8086/mds/services/DataService";//提交数据服务地址</p><p>
</p><p>String nameSpaceUri ="http://ws.outnet.metl.suypower.com.cn/";//接口方法所在地址</p><p>
</p><p>//创建service实例,通过service实例创建call实例,提供发出soap请求。</p><p>
</p><p> Service service =new Service();</p><p>
</p><p>Call call = (Call) service.createCall();//实例化调用对象</p><p>
</p><p> call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));//调用对象中添加webservice地址</p><p>
</p><p>//在调用对象中添加webservice对应的命名空间,以及将要调用的函数名</p><p>
</p><p> call.setOperationName(new QName(nameSpaceUri,"uploadAllData"));</p><p>
</p><p>//设置入参:参数名,参数类型,参数模式</p><p>
</p><p>call.addParameter(new QName(nameSpaceUri,"value"), org.apache.axis.encoding.XMLType.XSD_STRING,</p><p> javax.xml.rpc.ParameterMode.IN);</p><p>
</p><p>call.setUseSOAPAction(true);//说明这是soapaction格式</p><p>
</p><p> call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_STRING);//设置返回格式</p><p>
</p><p> call.setSOAPActionURI(nameSpaceUri +"uploadAllData");</p><p>
</p><p>//call.setUsername("sapuser");</p><p>
</p><p>//call.setPassword("sappass");</p>
复制代码
[attach]116613[/attach]
<p>//调用call实例的invoke方法,invoke方法负责向soap服务器发出客户端指定的soap请求,</p><p>
</p><p>// 服务器在接收到soap请求后,会在服务端执行相应的服务方法,然后把返回值传给客户。</p><p>
</p><p>String ret = (String) call.invoke(new Object[]{postdata});</p><p>
</p><p>System.out.println("Successful = " + ret);</p><p>
</p><p>}catch (Exception e) {</p><p>
</p><p>// TODO Auto-generated catch block</p><p>
</p><p> e.printStackTrace();</p><p>
</p><p>}</p><p>
</p><p>}</p><p>
</p><p>},startDate,15*60*1000);//15分钟定时</p><p>
</p><p> }</p><p>
</p><p>}</p><p></p>
复制代码
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2