Webservice实验报告.docx
《Webservice实验报告.docx》由会员分享,可在线阅读,更多相关《Webservice实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
![Webservice实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/7/79cbfc78-9b49-43de-8e9c-0dbfad7bb44e/79cbfc78-9b49-43de-8e9c-0dbfad7bb44e1.gif)
Webservice实验报告
题目:
WebServices实验报告
所属学院:
专业班级:
姓名:
学号:
题目一:
调用第三方webService的接口实现便民信息的查询,例如天气预报或者火车信息。
一.实验要求
编写客户端,调用第三方WebService提供的接口,实现对基本信息的查询。
二.运行环境
Windows8+Eclipse(JDK8.0)
三.实验原理及过程
1.新建JavaProject,项目名称为“天气查询”,新建包com.soap(放置跟webservice服务调用相关的类)和包com.ui(放置跟UI界面编程相关的类)。
2.在com.soap包下新建类名为WeatherServices的Java文件。
该类的作用调用中国天气网提供的免费接口"
中间用到的方法主要有:
(1)getSoapRequest(Stringcity).这个方法的作用是得到一个Soap请求。
项目结构如图:
(2)getSoapInputStream(Stringcity)。
这个方法是通过调用上述免费接口获得
URLConnection连接对象,并对Soap
输入流进行相关的设置,包括编码格式等。
(3)getWeather(Stringcity)。
解析xml,获取相应的信息。
由于查询后返回的原始结果是一个xml文档,因此需要对该文档进行DOM解析,从而获得我们需要的信息。
3.在com.soap包下新建MobileService.java文件,用来实现对手机号码基本信息的查询。
使用的接口是:
x?
wsdl
4.在com.soap包下新建EmailService.java,实现对邮箱地址的验证。
采用的接口是:
5.在com.ui包下新建类名为MainFrame的Java文件。
实现客户端的可视化布局。
里面设计的主要函数包括:
(1)MainFrame(Stringstring)。
这是一个构造方法,对窗体进行简单的初始化,以及为相应的控件添加事件监听及响应。
四.运行效果
题目二
自定义webservice,并将其发布,然后编写客户端,调用该webservice。
一.实验要求
编写客户端,调用第三方WebService提供的接口,实现对基本信息的查询。
二.运行环境
Windows7旗舰版+Eclipse(JDK8.0)
三.实验原理及过程
该实验需要自己编写相应的服务器端和客户端。
而我要实现的功能是在客户端窗体输入学号,然后通过调用webservice来返回学号对应的学生的姓名。
实现服务的发布的方式有很多种,例如用Axis2来实现。
其实,JDK本身就提供了WebService服务发布的方法,就是jax-ws。
具体实现的过程如下:
1.服务器端
(1)新建JavaProject,项目名称为:
webServervices_student_server。
在该项下新建包com.webservice.server。
(2)在包中新建一个接口StudentInterface,在接口中声明一个查询的方法studentQuery(intnumber);
(3)新建StudentInterface接口的实现类StudentInterfaceImp,在类中实现StudentInterface接口中的查询方法studentQuery(intnumber)。
Main方法中的Endpoint.publish("http:
//127.0.0.1:
54321/student",newStudentInterfaceImp())方法是发布服务。
其中http:
//127.0.0.1:
54321/student是在本地自定义的RUL,54321是服务的端口号。
(4)运行该程序,会看到会打印以下提示信息,说明该服务已经启动:
(5)接下来要做的就是要生成WSDL文件。
在浏览器地址栏中输入http:
//127.0.0.1:
54321/student?
wsdl,回车,会看到以下所示界面,说明已经将服务发布成功。
2.客户端
(1)为了模拟远程调用,新建JavaProject,项目名称为:
webServervices_student_client。
在该项下新建包com.webservice.client。
由于采用的是jax-ws,所以在客户端还需要用到按照上述的wsdl规格约束编译的.java文件。
具体的实现如下:
1)新建一个java项目wsimport,该项目可以用来专门放置其他项目的编译文件。
找到该项目的src的绝对目录F:
\Eclipseforjavaee\wsipport\src.
2)在cmd命令窗口运行cdF:
\Eclipseforjavaee\wsipport\src,进入该目录下;
3)接着输入命令:
wsimport–s.http:
//127.0.0.1:
54321/student?
wsdl。
注意中间的空格,回车后,结果如:
(2)返回wsimport项目,右键刷新,会看到多出来一个包,这个包的名字和之前的服务器端的包名一致。
将该包原封不动复制到该客户端的src目录下。
(3)新建Client窗体类,实现客户端的编程。
整个客户端的项目结构如下:
四.运行效果
实验感想
第一次接触WebService这个概念,感觉还是挺陌生的。
之前有听说过便民查询服务,而且也亲身用过。
查阅了很多资料,才知道这些功能就是用WebService来实现的。
大概了解了相关的知识和调用第三方的服务接口的流程后,才知道,一个服务的发布和调用,也是很简单的。
当然在整个过程中,还遇到过多次的失败,虽然不是很难的程序,但是如果其中某一步没有按照正确的顺序来执行,会很容易出错的。
以下就来说说遇到的有一些问题:
1.在发布服务的时候,未能成功的生成wsdl文件。
分析原因主要有URL的端口没有设置好,或者服务端的程序编写有误。
当服务开启后,也就是服务端程序成功执行后,再在浏览器的地址栏里输入url+?
wsdl,会成功生成。
2.在解析命令窗口解析wsdl的时候,不会生成.java文件,或者生成的.java文件所在的包名和原先的服务程序的包名不一致,说明解析有误,需要重新解析。
在输入命令的时候,wsimport–s.http:
//127.0.0.1:
54321?
wsdl中间的空格不能少。
虽然这次的实验实现的功能比较简单,但是它却涵盖了一个完整的webservice的发布和调用的全过程,有了这次的实践。
那么以后再做比较复杂的服务的时候也就不用担心没有头绪了。
附录:
源代码(天气查询+自定义服务)
1.天气查询:
(1)WeatherService.java
packagecom.soap;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.io.OutputStreamWriter;
import.URL;
import.URLConnection;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importorg.w3c.dom.Document;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
publicclassWeatherServices{
privatestaticStringgetSoapRequest(Stringcity){
StringBuilderbuilder=newStringBuilder();
builder.append("
xmlversion=\"1.0\"encoding=\"utf-8\"?
>"
+"Envelopexmlns:
xsi=\"http:
//www.w3.org/2001/XMLSchema-instance\""
+"xmlns:
xsd=\"http:
//www.w3.org/2001/XMLSchema\""
+"xmlns:
soap=\"http:
//schemas.xmlsoap.org/soap/envelope/\">"
+"Body>//WebX
+""+city+""
+"
Body>
Envelope>");
returnbuilder.toString();
}
privatestaticInputStreamgetSoapInputStream(Stringcity)throwsException{
try{
Stringsoap=getSoapRequest(city);
if(soap==null){
returnnull;
}
URLurl=newURL(
"
URLConnectionconnection=url.openConnection();
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Length",Integer.toString(soap.length()));
connection.setRequestProperty("Content-Type","text/xml;charset=utf-8");
connection.setRequestProperty("SoapAction",
"http:
//WebX
OutputStreamout=connection.getOutputStream();
OutputStreamWriterwriter=newOutputStreamWriter(out,"utf-8");
writer.write(soap);
writer.flush();
writer.close();
out.close();
InputStreamin=connection.getInputStream();
returnin;
}catch(Exceptione){
e.printStackTrace();
returnnull;
}
}
publicstaticStringgetWeather(Stringcity){
try{
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilderbuilder=factory.newDocumentBuilder();
InputStreamis=getSoapInputStream(city);
Documentdoc=builder.parse(is);
//因为webservices调用后返回的xml的每个元素都是string
NodeListlist=doc.getElementsByTagName("string");
StringBufferbuffer=newStringBuffer();
for(inti=0;iNodenode=list.item(i);
if(node.getLastChild().getNodeValue().equals("查询结果为空!
")){
buffer=newStringBuffer();
}
buffer.append(node.getFirstChild().getNodeValue());
}
is.close();
returnbuffer.toString();
}catch(Exceptione){
e.printStackTrace();
returnnull;
}
}
}
(2)MobileService.java
packagecom.soap;
import.webxml.MobileCodeWS;
import.webxml.MobileCodeWSSoap;
publicclassMobileService{
publicstaticStringgetMobileCodeInfo(Stringtele,StringuserID){
MobileCodeWScodeWS=newMobileCodeWS();
MobileCodeWSSoapcodeWSSoap=codeWS.getMobileCodeWSSoap();
StringcodeInfo=codeWSSoap.getMobileCodeInfo(tele,null);
System.out.println(codeInfo);
returncodeInfo;
}
}
(3)EmailService.java
packagecom.soap;
import.webxml.ValidateEmailWebService;
import.webxml.ValidateEmailWebServiceSoap;
publicclassEmailService{
publicstaticStringchekEmailAddress(Stringemail){
ValidateEmailWebServiceemailWebService=newValidateEmailWebService();
ValidateEmailWebServiceSoapserviceSoap=emailWebService.getValidateEmailWebServiceSoap();
shortresult=serviceSoap.validateEmailAddress(email);
Stringinfo="";
switch(result){
case0:
info="请重新验证";break;
case1:
info="邮件地址合法";break;
case2:
info="只是域名正确";break;
case3:
info="一个未知错误";break;
case4:
info="邮件服务器没有找到";break;
case5:
info="电子邮件地址错误";break;
case6:
info="免费用户验证超过数量(50次/24小时";break;
case7:
info="商业用户不能通过验证";break;
}
returninfo;
}
}
(4)MainFrame.java
packagecom.ui;
importjava.awt.BorderLayout;
importjava.awt.Button;
importjava.awt.FlowLayout;
importjava.awt.Label;
importjava.awt.TextArea;
importjava.awt.TextField;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowEvent;
importjavax.swing.Box;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.JScrollPane;
importjavax.swing.border.EmptyBorder;
importcom.soap.WeatherServices;
publicclassMainFrameextendsJFrameimplementsActionListener
{
staticStringinfo="";
TextFieldtf1;
Buttonbt1,bt2;
Labellabel;
JPanelcontentPane;
JScrollPanescrollPane;
TextAreatextArea;
Boxbox1,box2;
publicMainFrame(Stringstring){
super(string);
setLayout(newFlowLayout());
label=newLabel("输入城市名:
");
label.setVisible(true);
tf1=newTextField(5);tf1.setVisible(true);tf1.setEditable(true);
bt1=newButton("查询");
bt1.addActionListener(this);bt1.setVisible(true);
contentPane=newJPanel();
contentPane.setBorder(newEmptyBorder(5,5,5,5));
contentPane.setLayout(newBorderLayout(120,120));
this.setContentPane(contentPane);
box1=Box.createHorizontalBox();
box1.add(label);
box1.add(tf1);
box1.add(bt1);
contentPane.add(box1,BorderLayout.NORTH);
scrollPane=newJScrollPane();
scrollPane.setEnabled(true);
contentPane.add(scrollPane,BorderLayout.CENTER);
textArea=newTextArea();
scrollPane.setViewportView(textArea);
setBounds(500,200,400,450);
setVisible(true);
validate();//确保组件具有有效的布局
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==bt1){
Stringcity=tf1.getText().toString();
info=WeatherServices.getWeather(city);
textArea.setText(info);
}
if(e.getID()==WindowEvent.WINDOW_CLOSING){
System.exit(0);
}
}
publicstaticvoidmain(String[]args){
newMainFrame("天气查询");
}
}
2.自定义服务(学生查询)
(1)服务端
1)StudentInterfaceImp
packagecom.webservice.server;
importjavax.jws.WebService;
importjavax.xml.ws.Endpoint;
/**
*@author张波
*StudentInterfaceImp.java
*2015年5月28日
*/
@WebService
publicclassStudentInterfaceImpimplementsStudentInterface{
Stringname[]={
"姜倩云","张丽梅","吴美庆","张忠敏","王雅蓉","葛红敏","赵斌灿","王严鑫",
"莫可宏","王猛","侯勇军","马铸辉","易鹏","罗路辉","闫治鹏","孙磊","李佳玲",
"王勃博","康尧","张波","邓雷","陈佳鑫","唐炜宁","葛龙","倪赛杰","陈成",
"刘浩浩","周子轩","宫蕊","文云丽","沈雪","刘冬媛","褚蓉","钱苑","董樟裕",
"马凌杰","王京源","陈辉云","罗建兴","陈晨","赵文宇","宗玮雯","赵贝贝",
"黄豪琛","娄宽","任上海","王康","沈楠","蒋宇","吕阳","王刚","王扬","吕中剑",
"张军","卢惺鑫","姚礼宗"
};
@Override
publicStringstudentQuery(intnumber){
System.out.println("fromclient..."+"学号:
"+number);
Stringresult=name[number];
System.out.println("toclient..."+"姓名:
"+result);
ret