Web Service 技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。依据Web Service规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。

调用归属地查询服务

  1. 利用命令行执行wsimport生成代码。
    wsimport -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

如图所示,代码生成在D:\Temp\Code。会生成class 和java 文件。删除class 文件。

2 .开始编写查询手机号归属地客户端
eclipse创建工程,将生成的代码copy到你自己想要的包下。修改java 文件对应package包
然后编写第一个WebService客户端接口

package com.webservice.client;

import com.webservice.server.MobileCodeWS;
import com.webservice.server.MobileCodeWSSoap;

public class PhoneAddressClient {
	public static void main(String[] args) {
	System.out.println(getPhoneAddress("18888888888"));
 	}

	public static String getPhoneAddress(String phone){
	//1.实例化生成的服务类
 	MobileCodeWS ws = new MobileCodeWS();
 	//2.调用服务类的方法获取接口实例
 	MobileCodeWSSoap soap = ws.getMobileCodeWSSoap();
 	//3.通过接口直接获取数据
 	return soap.getMobileCodeInfo(phone,"");
 	}
}

创建自己的Web Service 服务

服务端

  1. 编写服务接口
package com.webservice.server;

public interface FisrtWebService {
	String getAddressByPhoneNo(String phoneNo);
}
  1. 编写接口实现类
package com.webservice.server.impl;

import javax.jws.WebService;

import com.webservice.server.FisrtWebService;

@WebService//加上这个注解,表示此实现类就是WebService服务
public class FisrtWebServiceImpl implements FisrtWebService {
	public String getAddressByPhoneNo(String phoneNo) {
 	return phoneNo + ": 归属地是上海";
	}
}
  1. 发布服务,并运行
package com.webservice.server;

import javax.xml.ws.Endpoint;
import com.webservice.server.impl.FisrtWebServiceImpl;

public class PublishServerTest {
	public static void main(String[] args) {
	//参数1:服务被访问的url:ip+端口号+服务名 参数2:实现类
	Endpoint.publish("http://localhost:9999/getAddress", new FisrtWebServiceImpl());
	System.out.println("服务发布成功");
	}
}

客户端

  1. 验证服务是否发布成功
    访问发布服务的ip+端口+服务名+?wsdl 是否能显示
    例: http://localhost:9999/getAddress?wsdl
  1. 生成代码
    照第一个例子那样通过命令生成代码,这里可以利用命令生成代码自定义包名将class 文件和java 文件分开 (实现在文件夹下建好classes 文件夹)
    wsimport -s . -d ./classes -p com.webservice.client http://localhost:9999/getAddress?wsdl
    特别注意,客户端的FisrtWebServiceImpl是接口,不是服务端编写的实现类

  2. 编写客户端代码

package com.webservice.client;

import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class FisrtClinet {
	public static void main(String[] args) throws MalformedURLException {
	//也可以按照入门案例PhoneAddressClient那样调用,这种方法更具灵活性
	//FisrtWebServiceImplService是自动生成的接口,不是服务端的实现类
	Service service = Service.create(new URL("http://localhost:9999/getAddress?wsdl"), new QName("http://impl.server.webservice.acn.com/","FisrtWebServiceImplService"));
	FisrtWebServiceImpl impl = service.getPort(FisrtWebServiceImpl.class);
	System.out.println(impl.getAddressByPhoneNo("18888888888"));
	}
}

便捷测试

为了测试自己的Web Service 是否能够使用,其实可以不必重复上述复杂的生成客户端的过程,
这里推荐使用SOAP UI 进行Web Service 的测试。

意义

简单的说,Web Service就是一种跨编程语言跨操作系统平台远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用,就是一台计算机的应用可以调用其他计算机上的应用。例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。
Web Service 将服务封装起来,暴露给用户的只有方法、入参和出参类型等基本信息,大大减少了服务器端和客户端之间的耦合度,这在企业开发服务的过程中意义重大。

深入学习

WSDL

WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。
Web Service 服务器端首先要通过一个WSDL 文件来说明自己有什么服务可以对外调用。简单的说,WSDL就像是一个说明书,用于描述Web Service 及其方法、参数和返回值。 WSDL文件保存在Web 服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService 服务之前,要知道该服务的WSDL 文件的地址。Web Service 服务提供商可以通过两种方式来暴露它的WSDL 文件地址:1.注册到UDDI 服务器,以便被人查找;2.直接告诉给客户端调用者。
WSDL 是随服务发布成功,自动生成,无需编写。

SOAP = HTTP + XML

SOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息。
WebService采用Http协议来在客户端和服务端之间传输数据。WebService使用XML来封装数据,XML主要的优点在于它是跨平台的。
WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议规定的。

推荐

关于自学,可以到W3school 了解各多!

参考文献

WebService技术详解
WebService深入浅出
W3school