WebService简介
Webservice也叫XML Web Service,Web服务。可使用开放的xml标准来描述、发布、发现、协调和配置这些应用程序。用于开发分布式的互操作的应用程序。是一种跨编程语言、跨操作系统、跨网络的远程服务器调用技术。
WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用. 我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S
程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单了调用了一下别人服务器上的一段代码而已。
学习WebSerice可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别
人机器上发布的WebService,就像使用自己的代码一样.。
webservice可以实现跨平台远程调用,从而实现异构程序之间的通信,特定需求下可以实现远程数据共享、软件重用、分布式程序集成。
webservice 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。
它采用标准SOAP协议(Simple Object Access Protocol) ,协议传输webservice数据,是w3c标准。
xml和XSD(XML Schema Datatypes)是webservice的基础,是w3c标准,采用wsdl作为描述语言即webservice使用说明书。
(webservice的生活中的例子:http://www.51240.com/(便民查询网站))
以各个网站显示天气预报功能为例:
气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server), 而各大站点的应用就去调用它们得到天气信息并以不同的样式去展示(WebService Client).
网站提供了天气预报的服务,但其实它们什么也没有做,只是简单了调用了一下气象中心服务器上的一段代码而已。
web Service原理
Webservice是使用Http发送SOAP协议的数据的一种远程调用技术
Webservice要开发服务端
Webservice要开发客户端
Webservice客户端开发需要阅读服务端的使用说明书(WSDL)
服务端
public class WeatherServer {
public static void main(String[] args) throws Exception {
Map<String, String> map=new HashMap<String, String>();
map.put("北京", "天气晴");
map.put("成都", "小雨");
map.put("深圳", "阴天");
//创建Socket
ServerSocket serverSocket=new ServerSocket(8888);
System.out.println("服务器端开始启动...监听端口:8888");
while(true){
//接收客户端的请求,accept为阻塞方法
Socket socket=serverSocket.accept();
//接收客户端数据
DataInputStream inputStream=new DataInputStream(socket.getInputStream());
//响应客户端数据
DataOutputStream outputStream=new DataOutputStream(socket.getOutputStream());
String city = inputStream.readUTF();
System.out.println("正在查询城市数据:"+city);
String result=map.get(city);
outputStream.writeUTF(result);
}
}
}
客户端
public class WeatherClient {
public static void main(String[] args) throws Exception {
Scanner input=new Scanner(System.in);
System.out.print("请输入要查询的城市:");
String city = input.next();
Socket socket=new Socket("127.0.0.1",8888);
//发送数据到服务器
DataOutputStream outputStream=new DataOutputStream(socket.getOutputStream());
//接收服务器发送的数据
DataInputStream inputStream=new DataInputStream(socket.getInputStream());
outputStream.writeUTF(city);
//readUTF也是一个阻塞的方法,输出查询结果
String result = inputStream.readUTF();
System.out.println("查询结果:"+result);
}
}
总结:webservice的底层原理,就是socket
1. Web Service中的几个重要术语
1.1. WSDL:web service definition language
直译 : WebService定义语言
- 对应一种类型的文件.wsdl (告诉客户端如何调用接口)
- 定义了web service的服务器端与客户端应用交互传递请求和响应数据的格式和方式
- 一个web service对应一个唯一的wsdl文档
1.2. SOAP:simple object access protocal
直译: 简单对象访问协议
- 是一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据
- soap消息:请求消息和响应消息
- http协议+xml片断=SOAP协议
SOAP协议 = HTTP协议 + XML数据格式
SOAP1.1和SOAP1.2区别
相同点:
请求发送方式相同:都是使用POST
协议内容相同:都有Envelope和Body标签
不同点:
数据格式不同:content-type不同
SOAP1.1:text/xml;charset=utf-8
SOAP1.2:application/soap+xml;charset=utf-8
命名空间不同:
SOAP1.1:http://schemas.xmlsoap.org/soap/envelope/
SOAP1.2:http://www.w3.org/2003/05/soap-envelope
1.3. UDDI
UUDI:目录服务 (租客 和 房东 之间的 中介!)
UDDI:Universal Description, Discovery and Integration.可译为"通用描述,发现与集成服务"。 服务目录检索
企业可以使用它对 Web services 进行注册和搜索.
企业将自己提供的Web Service注册在UDDI,也可以使用别的企业在UDDI注册的web service服务,从而达到资源共享。UDDI旨在将全球的webservcie资源进行共享,促进全球经济合作。
UDDI现状:
目前大部分企业使用webservice并不是必须使用UDDI,因为用户通过WSDL知道了web service的地址,可以直接通过WSDL调用webservice。
- jdk发布webservice服务
使用JAX-WS开发webservice
JAX-WS 的全称为 Java API for XML-Based Webservices ,从java5开始支持JAX-WS2.0版本,Jdk1.6.0_13以后的版本支持2.1版本,jdk1.7支持2.2版本
那么如何才可以发布一个WebService呢?
1:用Jdk1.6.0_13以后的版本发布一个WebService服务,并通过地址栏查看它的wsdl文档.
2:通过wsimport生成客户端代码,调用并查看运行的结果.(学会如何调用是我们的重点).
3:从互联网上获取一个WebService网络公开的服务,并使用工具生成客户端,调用并查看结果。
测试代码包括服务端和客户端的开发
3.1 服务端开发
@WebService
public class JdkWeatherbServer {
public String queryWeather(String cityName){
System.out.println("客户端查询参数:"+cityName);
String result="晴转多云";
return result;
}
public static void main(String[] args) {
Endpoint.publish("http://127.0.0.1:8888/weather", new JdkWeatherbServer());
System.out.println("服务器端启动....");
}
}
其中:
1、编写SEI(Service Endpoint Interface),为了开发方便我们用java类代替接口加实现类的方式。
2、java类中至少要有一个非静态的公开方法需要作为webservice服务方法。
3、public class WeatherServer上边要加上@WebService,表示webservice的发布类。
4、使用Endpoint.publish()方法发布服务。
3.2 查看使用说明书(wsdl)
1、在地址栏输入(注意后面的参数?wsdl)
http://127.0.0.1:8888/weather?wsdl 发布完WebService就会得到Wsdl说明书!
2、 这里注意目前不是访问webService,只是获取一个用于描述WebService的说明文件,即:wsdl文件,我们需要看懂wsdl的文件,这样就知道服务端究竟发布什么样的服务,提供什么样的方法,需要传递什么类型的参数,方法的返回值类型是什么等。.
3、 wsdl- 即WebServiceDescriptionLanguage,是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务。
这里从下向上看:
其中:
1:JdkWeatherServerService为视图服务
2:WeatherServerPort为调用的端口,即getJdkWeatherServerPort()方法
3:JdkWeatherServer为接口,接口中提供一个queryWeather()的方法
3.3 客户端开发
wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.当然,无论服务器端的WebService是用什么语言写的,都将在客户端生成Java代码.服务器端用什么语言编写的并不重要.
wsimport.exe位于JAVA_HOME\bin目录下.
例如:在cmd的窗口下执行wsimport可以看到
Wsimport 程序可以根据wsdl webservice说明书 生成客户端调用代码!
常用参数为:
• -d<目录> - 将生成.class文件。默认参数。
• -s<目录> - 将生成.java文件。
• -p<生成的新包名> -将生成的类,放于指定的包下。
• (wsdlurl) - http://server:port/service?wsdl,必须的参数。
wsimport其他参数说明,我们经常使用的参数为-d,-s,-p
-d<目录>将会生成.class文件.
示例:wsimport –d . http://127.0.0.1:8888/weather?wsdl
-s<目录>将会生成.java文件.
示例:wsimport –s . http://127.0.0.1:8888/weather?wsdl
-p<包名>将生成的文件(.java或是.class修改成指定的包名)
示例:wsimport -s . -p com.bruceliu.client1 http://127.0.0.1:8888/weather?wsdl
示例:
C:/> wsimport -s . -p com.bruceliu.client1 http://127.0.0.1:8888/weather?wsdl
注意:-s不能分开,-s后面有个小点
在cmd的窗口执行:
在C盘看到客户端生成的java文件:
将.java的文件整个包拷贝到客户端的工程下,然后使用WeatherClient的客户端测试,测试代码如下
public class JdkWeaterClient {
public static void main(String[] args) {
//定义服务视图
JdkWeatherbServerService jdkWeatherbServerService=new JdkWeatherbServerService();
//通过服务视图找到对应的端口类型,即(portType)
JdkWeatherbServer jdkWeatherbServer=jdkWeatherbServerService.getJdkWeatherbServerPort();
//通过端口类型调用webService方法
String result = jdkWeatherbServer.queryWeather("北京");
System.out.println("天气:"+result);
}
}
其中JdkWeatherServiceService