WebService (一)简单调用发布
1、WebService相关介绍
WebService概念介绍:
Web Service, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据
通俗的讲,Web Service就是一个部署在Web服务器上的一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web Service 的应用程序叫做客户端,发布这个web服务的机器称为Web Service服务器
WebService技术规则:
1. 基于web的系统级接口规范
- 一个普通适用标准
- 任何网络通信的操作系统
- 自包含、自描述、模块化
- 发布、定位、通过web调用
2. web service 技术和规则
- xml(可拓展标记语言)
- soap(简易对象访问协议) http+xml
- wsdl(web services 描述语言)
- uddi(通用描述、发现及整合)
3. 跨平台的可互操作性
- 基于xml
- 基于xsd(xml schema )
- 基于http
4. webservice 适用场景
- 跨防火墙的通信
- 异构系统间应用程序集成(jee:(EJB RMI)、php、c++、.net (com+))
WebService的优势介绍:
a) 异构平台的互通性
理论上, Web Service 最大的优势是提供了异构平台的无缝街接技术手段。由于不同的用户使用不同的硬件平台,不同的操作平台,不同的操作系统,不同的软件,不同的协议通信,这就产生了互相通信的需求。 Web Service 使任何两个应用程序,只要能读写XML,那么就能互相通信。
b) 更广泛的软件复用
软件的复用技术通过组合已有模块来搭建应用程序,能大幅度提高软件的生产效率和质量。用户只要获得了描述 Web Service 的 WSDL 文件,就可以方便地生成客户端代理,并通过代理访问 Web Service 。
c) 成本低、可读性强、应用范围广
Web Service 可用基于 XML 的 SOAP 来表示数据和调用请求。并且通过 HTTP 协议传输 XML 格式的数据
d) 迅捷的软件发行方式
Web Service 将彻底地改变软件的发行方式。软件供应商可以把软件分解成若Web Service 模块构成的系统,直接在 Web 上发布
WebService专业名称介绍:
a) XML: Extensible Markup Language -扩展性标记语言
XML,用于传输格式化的数据,是Web服务的基础。
• namespace-命名空间。
• xmlns=“http://itcast.cn” 使用默认命名空间。
• xmlns:itcast=“http://itcast.cn”使用指定名称的命名空间。
b) WSDL: WebService Description Language – Web服务描述语言。调用该webservice api 的接口描述
• 通过XML形式说明服务在什么地方-地址。
• 通过XML形式说明服务提供什么样的方法 – 如何调用。
c) SOAP: Simple Object Access Protocol(简单对象访问协议)
• SOAP作为一个基于XML语言的协议用于有网上传输数据。
• SOAP = 在HTTP的基础上+XML数据。
• SOAP是基于HTTP的。
• SOAP的组成如下
1. Envelope – 必须的部分。以XML的根元素出现。
2. Headers – 可选的。
3. Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。
WebService工作原理:
2、调用已发布的WebService
WebService服务演示
b) 单击手机查询服务
c) 选择要调用的方法 例如: getMobileCodeInfo
d) 输入要查询的手机号单击”调用” 截图如下, 免费用户 UserID为null
e) 可以看到返回如下结果:
<?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://WebXml.com.cn/">18323455678:重庆 重庆 重庆移动全球通卡</string> |
HttpClient工具使用
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
为什么要使用HttpClient工具:
原生态的Socket基于传输层,现在我们要访问的WebService是基于HTTP的属于应用层,所以我们的Socket通信要借助HttpClient发HTTP请求,这样格式才能匹配
HttpClient使用步骤如下:
1. 创建 HttpClient 的实例
2. 创建某种连接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址
3. 配置要传输的参数,和消息头信息
4. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例
5. 通过response读取字符串
6. 释放连接。无论执行方法是否成功,都必须释放连接
Socket + HttpClient 访问WS
Get方式:
public static void getMethod() throws Exception { // 创建get对象,类似get请求 GetMethod getMethod = new GetMethod( "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=18373551982&userID="); // 发送get请求 int code = http.executeMethod(getMethod); System.out.println("返回的消息码为:" + code); System.out.println("返回的消息为:" + getMethod.getResponseBodyAsString()); getMethod.releaseConnection(); } |
POST方式:
public static void postMethod() throws Exception { // 创建post请求,类似Post请求 PostMethod postMethod = new PostMethod( "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo"); // 设置请求的正文内容 postMethod.setRequestBody("mobileCode=18373551982&userID="); // 设置传送信息的格式 postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // 发送post请求 int code = http.executeMethod(postMethod); System.out.println("返回消息码为:" + code); System.out.println("返回的消息为:" + postMethod.getResponseBodyAsString()); postMethod.releaseConnection(); } |
SOAP1.1方式:
public static void postSoap1() throws Exception { // 创建一个post请求,类似Post请求 PostMethod postMethod = new PostMethod("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx"); // 设置传送信息的格式 postMethod.setRequestHeader("Content-Type","text/xml; charset=utf-8"); postMethod.setRequestBody(new FileInputStream("C:/a.txt")); int code = http.executeMethod(postMethod); System.out.println("消息码为:" + code); System.out.println("返回的消息为:" + postMethod.getResponseBodyAsString()); postMethod.releaseConnection(); } |
Java方式访问WebService
1. 选中要调用的服务单击”服务说明”
a) 例如选中:
b) http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL
2. 获取wsdl文件.使用JDK1.6以上的版本的wsimport命令
3. 切换到c:\ws文件夹 在dos输入:wsimport wsdl目标地址
a) C:\ws>wsimport http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL
4. 可以把class文件打成jar包 jar cvf test.jar 打包目录
5. 拷贝的项目中调参考WSDL用即可调用源码如下:
public static void main(String[] args) { MobileCodeWS mobileCodeWs=new MobileCodeWS(); MobileCodeWSSoap mobileCodeWSSoap=mobileCodeWs.getMobileCodeWSSoap(); String tel=mobileCodeWSSoap.getMobileCodeInfo("18373551982",null); System.out.println(tel); } |
WSDL协议简单介绍
WSDL – WebService Description Language – Web服务描述语言
通过XML形式说明服务在什么地方-地址。
通过XML形式说明服务提供什么样的方法 – 如何调用。
<wsdl:service name="MobileCodeWS"> <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"><a href="http://www.webxml.com.cn/" target="_blank">WebXml.com.cn</a> <strong>国内手机号码归属地查询WEB服务</strong>,提供最新的国内手机号码段归属地数据,每月更新。<br />使用本站 WEB 服务请注明或链接本站:<a href="http://www.webxml.com.cn/" target="_blank">http://www.webxml.com.cn/</a> 感谢大家的支持!<br /> </wsdl:documentation> - <wsdl:port name="MobileCodeWSSoap" binding="tns:MobileCodeWSSoap"> <soap:address location="http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx" /> </wsdl:port> |
<wsdl:binding name="MobileCodeWSSoap" type="tns:MobileCodeWSSoap"> |
3、JDK6的WebService发布
注意MyEclipse8.5自带的JDK版本太低, 如果要发布自己的WebService则要升级到jdk1.6.0.013及以后版本
创建第一个Web服务:
WebService服务类代码如下:
@WebService // 添加了此注解,代表是一个WebService public class HelloWorld { // 非 static final private 方法默认会发布 public String sayHi(String name) { return "hello" + name; } } |
发布web服务:
public static void main(String[] args) { String address="http://127.0.0.1:9999/helloworld"; // 注册并且发布一个服务,arg0: 服务地址 , arg1:要发布的服务对象 Endpoint endPoint=Endpoint.publish(address,new HelloWorld()); // 可以停止服务,或者手动停止 //endPoint.stop(); } |
获取发布web服务的信息
访问wsdl网址为: http://127.0.0.1:9999/helloworld?wsdl 通过wsimport生成Java代码: Wsimport http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL // 只能生成 class格式 wsimport –s . http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL // 能生成 class格式和Java源文件 Wsimport –s . –p a.b.c http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL // 能生成 class格式和Java源文件 并且可以自定义包名 jar -cvf mobile.jar . // 把当前路径打包成jar文件, 包名为mobile.jar |
调用第一个WebService服务
public static void main(String[] args) { HelloWorldService helloWorldService=new HelloWorldService(); HelloWorld helloWorld=helloWorldService.getHelloWorldPort(); System.out.println(helloWorld.sayHi("china")); } |
代码注意事项:
1. 在类上添加@WebService注解,代表发布一个WebService服务
2. 通过EndPoint(端点服务)发布一个webService。Endpoint也是jdk提供的一个专门用于发布服务的类,它的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。
3. Endpoint.publish(String address, Object implementor) 静态方法在给定地址处针对指定的实现者对象创建并发布端点
4. 给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布
5. 如果希望某个方法不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。
6. 如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。
7. protected、private、final、static方法不能对外公开 代码如下:
@WebService// 添加了此注解,代表是一个WebService public class HelloWorld { // 非 static final private 方法默认会发布 public String sayHi(String name) { return "hello" + name; } @WebMethod(exclude=true) public void exclude(){ // 被注解排除的方法 } protected void protected1(){ //受保护的方法默认不发布 } private void private1(){ // 私有方法默认不发布 } public static void static1(){ // static 方法默认不发布 } public final void final1(){ // final 方法默认不发布 } } |