admin 管理员组文章数量: 887053
2023年12月22日发(作者:vaginitis)
J I A N G S U U N I V E R S I T Y
题目:Web Services 实验报告
所属学院: 计算机学院
专业班级: 软件1201
* 名: **
学 号: **********
1
题目一:
调用第三方web Service的接口实现便民信息的查询,例如天气预报或者火车信息。
一. 实验要求
编写客户端,调用第三方Web Service提供的接口,实现对基本信息的查询。
二. 运行环境
Windows8 + Eclipse( JDK 8.0)
三.实验原理及过程
1.新建Java Project,项目名称为“天气查询”,新建包 (放置跟web service服务调用相关的类)和包(放置跟UI界面编程相关的类)。
2.在包下新建类名为WeatherServices的Java文件。该类的作用调用中国天气网提供的免费接口"/WebServices/",实现对城市的天气的实时查询。
项目结构如图:
中间用到的方法主要有:
(1)getSoapRequest(String
city).这个方法的作用是得到一个
Soap请求。
(2)getSoapInputStream(String city )。
这个方法是通过调用上述免费接口获得
URLConnection连接对象,并对Soap
输入流进行相关的设置,包括编码格式等。
(3)getWeather(String city)。解析xml,获取相应的信息。由于查询后返回的原始结果是一个xml文档,因此需要对该文档进行DOM解析,从而获得我们需要的信息。
3.在包下新建文件,用来实现对手机号码基本信息的查询。使用的接口是:/WebServices/
x?wsdl
2
4.在包下新建,实现对邮箱地址的验证。采用的接口是:
/WebServices/?wsdl");
5.在包下新建类名为MainFrame的Java文件。实现客户端的可视化布局。
里面设计的主要函数包括:
(1)MainFrame(String string)。这是一个构造方法,对窗体进行简单的初始化,以及为相应的控件添加事件监听及响应。
四.运行效果
3
4
题目二
自定义web service,并将其发布,然后编写客户端,调用该web service。
一. 实验要求
编写客户端,调用第三方Web Service提供的接口,实现对基本信息的查询。
二. 运行环境
Windows 7旗舰版 + Eclipse( JDK 8.0)
三.实验原理及过程
该实验需要自己编写相应的服务器端和客户端。而我要实现的功能是在客户端窗体输入学号,然后通过调用web service来返回学号对应的学生的姓名。实现服务的发布的方式有很多种,例如用Axis2来实现。其实,JDK本身就提供了Web Service服务发布的方法,就是jax-ws。具体实现的过程如下:
1.服务器端
(1)新建Java Project,项目名称为:webServervices_student_server。在该项下新建包。
(2) 在包中新建一个接口StudentInterface,在接口中声明一个查询的方法studentQuery(int number);
(3)新建StudentInterface接口的实现类StudentInterfaceImp,在类中实现StudentInterface接口中的查询方法studentQuery(int number)。Main方法中的h("127.0.0.1:54321/student", new StudentInterfaceImp())方法是发布服务。其中127.0.0.1:54321/student是在本地自定义的RUL,54321是服务的端口号。
(4)运行该程序,会看到会打印以下提示信息,说明该服务已经启动:
(5)接下来要做的就是要生成WSDL文件。在浏览器地址栏中输入127.0.0.1:54321/student?wsdl,回车,会看到以下所示界面,说明已经将服务发布成功。
5
2.客户端
(1)为了模拟远程调用,新建Java Project,项目名称为:webServervices_student_client。在该项下新建包。由于采用的是jax-ws,所以在客户端还需要用到按照上述的wsdl规格约束编译的 .java文件。具体的实现如下:
1)新建一个java 项目wsimport,该项目可以用来专门放置其他项目的编译文件。找到该项目的src的绝对目录F:Eclipse for javaeewsipportsrc.
2)在cmd命令窗口运行cd F:Eclipse for javaeewsipportsrc,进入该目录下;
3)接着输入命令:wsimport –s . 127.0.0.1:54321/student?wsdl。注意中间的空格,回车后,结果如:
6
(2)返回wsimport项目,右键刷新,会看到多出来一个包,这个包的名字和之前的服务器端的包名一致。将该包原封不动复制到该客户端的src目录下。
(3)新建Client窗体类,实现客户端的编程。整个客户端的项目结构如下:
7
四.运行效果
8
实验感想
第一次接触Web Service这个概念,感觉还是挺陌生的。之前有听说过便民查询服务,而且也亲身用过。查阅了很多资料,才知道这些功能就是用Web Service来实现的。大概了解了相关的知识和调用第三方的服务接口的流程后,才知道,一个服务的发布和调用,也是很简单的。当然在整个过程中,还遇到过多次的失败, 虽然不是很难的程序,但是如果其中某一步没有按照正确的顺序来执行,会很容易出错的。以下就来说说遇到的有一些问题:
1.在发布服务的时候,未能成功的生成wsdl文件。分析原因主要有URL的端口没有设置好,或者服务端的程序编写有误。当服务开启后,也就是服务端程序成功执行后,再在浏览器的地址栏里输入url+?wsdl,会成功生成。
2.在解析命令窗口解析wsdl的时候,不会生成.java文件,或者生成的.java文件所在的包名和原先的服务程序的包名不一致,说明解析有误,需要重新解析。在输入命令的时候,wsimport –s . 127.0.0.1:54321?wsdl中间的空格不能少。
虽然这次的实验实现的功能比较简单,但是它却涵盖了一个完整的webservice的发布和调用的全过程,有了这次的实践。那么以后再做比较复杂的服务的时候也就不用担心没有头绪了。
附录:源代码(天气查询 + 自定义服务)
1.天气查询:
(1)
package ;
import tream;
import Stream;
import StreamWriter;
import ;
import nection;
import ntBuilder;
import ntBuilderFactory;
import nt;
import ;
import st;
public class WeatherServices {
private static String getSoapRequest(String city) {
9
StringBuilder builder = new StringBuilder();
(""
+" + "xmlns:xsd="/2001/XMLSchema" " + "xmlns:soap="/soap/envelope/">" + " + " + "
return ng();
}
private static InputStream getSoapInputStream(String city) throws Exception {
try {
String soap = getSoapRequest(city);
if (soap == null) {
return null;
}
URL url = new URL(
"/WebServices/");
URLConnection connection = nnection();
Caches(false);
nput(true);
utput(true);
uestProperty("Content-Length",ng(()));
uestProperty("Content-Type","text/xml; charset=utf-8");
uestProperty("SoapAction",
"/getWeather");
OutputStream out = putStream();
OutputStreamWriter writer = new OutputStreamWriter(out, "utf-8");
(soap);
();
();
();
InputStream in = utStream();
return in;
} catch (Exception e) {
tackTrace();
return null;
}
}
public static String getWeather(String city) {
try {
DocumentBuilderFactory factory = tance();
espaceAware(true);
DocumentBuilder builder = umentBuilder();
10
}
}
InputStream is = getSoapInputStream(city);
Document doc = (is);
//因为web services调用后返回的xml的每个元素都是string
NodeList list = mentsByTagName("string");
StringBuffer buffer = new StringBuffer();
for(int i=0;i Node node = (i); if(tChild().getNodeValue().equals("查询结果为空!")){ buffer = new StringBuffer(); } (stChild().getNodeValue()); } (); return ng(); } catch (Exception e) { tackTrace(); return null; } (2) package ; import CodeWS; import CodeWSSoap; public class MobileService{ public static String getMobileCodeInfo(String tele,String userID) { MobileCodeWS codeWS = new MobileCodeWS(); MobileCodeWSSoap codeWSSoap = ileCodeWSSoap(); String codeInfo = ileCodeInfo(tele, null); n(codeInfo); return codeInfo; } } (3) package ; import teEmailWebService; import teEmailWebServiceSoap; public class EmailService{ public static String chekEmailAddress(String email){ 11 ValidateEmailWebService emailWebService = new ValidateEmailWebService(); ValidateEmailWebServiceSoap serviceSoap idateEmailWebServiceSoap(); short result = teEmailAddress(email); String info=""; switch (result) { case 0: info = "请重新验证";break; case 1: } } info = "邮件地址合法";break; case 2: info = "只是域名正确";break; case 3: info = "一个未知错误";break; case 4: info = "邮件服务器没有找到";break; case 5: info = "电子邮件地址错误";break; case 6: info = " 免费用户验证超过数量(50次/24小时";break; case 7: info = " 商业用户不能通过验证";break; } return info; = (4) package ; import Layout; import ; import yout; import ; import ea; import eld; import Event; import Listener; import Event; import ; import ; import ; import lPane; import order; 12 import rServices; public class MainFrame extends JFrame implements ActionListener { static String info=""; TextField tf1; Button bt1,bt2; Label label; JPanel contentPane; JScrollPane scrollPane; TextArea textArea; Box box1,box2; public MainFrame(String string){ super(string); setLayout(new FlowLayout()); label = new Label("输入城市名:"); ible(true); tf1 = new TextField(5); ible(true); table(true); bt1=new Button("查询"); ionListener(this); ible(true); contentPane = new JPanel(); der(new EmptyBorder(5,5,5,5)); out(new BorderLayout(120,120)); tentPane(contentPane); box1 = HorizontalBox(); (label); (tf1); (bt1); (box1,); scrollPane=new JScrollPane(); bled(true); (scrollPane,); textArea=new TextArea(); wportView(textArea); setBounds(500, 200, 400, 450); setVisible(true); validate();//确保组件具有有效的布局 } public void actionPerformed(ActionEvent e){ if(rce()==bt1) { String city = t().toString(); info=ther(city); t(info); } if (() == _CLOSING) { 13 } (0); } } public static void main(String[] args) { } new MainFrame("天气查询"); 2.自定义服务(学生查询) (1)服务端 1)StudentInterfaceImp package ; import vice; import nt; /** * @author 张波 * * 2015年5月28日 */ @WebService public class StudentInterfaceImp implements StudentInterface{ String name[]={ "姜倩云","张丽梅","吴美庆","张忠敏","王雅蓉","葛红敏","赵斌灿","王严鑫", "莫可宏","王猛", "侯勇军","马铸辉","易鹏","罗路辉","闫治鹏","孙磊","李佳玲", "王勃博","康尧","张波", "邓雷","陈佳鑫","唐炜宁","葛龙","倪赛杰","陈成", "刘浩浩","周子轩","宫蕊","文云丽","沈雪","刘冬媛","褚蓉","钱苑","董樟裕", "马凌杰","王京源","陈辉云","罗建兴","陈晨","赵文宇","宗玮雯","赵贝贝", "黄豪琛","娄宽","任上海","王康","沈楠","蒋宇","吕阳","王刚","王扬","吕中剑", "张军","卢惺鑫","姚礼宗" }; @Override public String studentQuery(int number) { n("" +"学号:" +number); String result = name[number]; n("" + "姓名:"+result); return result; } public static void main(String[] args) { h("127.0.0.1:54321/student", new StudentInterfaceImp()); n("发布成功..."); } 14 } 2)StudentInterfaceImp package ; public interface StudentInterface { public String studentQuery(int number); } (2)客户端() package ; import ; import ; import order; import ; import ield; import n; import rea; import ; import Listener; import Event; import ent; import ; import tInterfaceImp; import tInterfaceImpService; public class Client extends JFrame { private JPanel contentPane; private JTextField textField; private JButton search; private JButton cancel; private JTextArea textArea; private StudentInterfaceImpService impService; private StudentInterfaceImp imp; private static int number=0; public Client(String string) { setDefaultCloseOperation(_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); eground(); der(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); out(null); JLabel label = new JLabel("请输入学号进行查询"); eground(); nds(155, 10, 129, 50); 15 (label); textField = new JTextField("20"); nds(155, 58, 110, 22); (textField); umns(10); // 通过webservice的服务视图 impService = new StudentInterfaceImpService(); // 获得服务端点 imp = dentInterfaceImpPort(); search = new JButton("查询"); ionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(rce()==search) { number = nt(t().toString()); if(number>56||number<1){ result = "非法输入!"; t(result); }else{ t("你输入的学号是:"+number+"n"+"查询结果为: "+result); n(result); } } }); nds(139, 104, 73, 23); (search); cancel = new JButton("取消"); ionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { t(""); t(""); } }); nds(222, 104, 73, 23); (cancel); textArea = new JTextArea(); nds(105, 153, 223, 70); (textArea); Component glue = Glue(); nds(61, 196, 1, 1); (glue); } public static void main(String[] args) { Client frame = new Client("自定义web service调用"); ible(true); 16 } } 17
版权声明:本文标题:Webservice实验报告 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1703234010h443366.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论