Web service是什么

1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)

2. 一个跨语言、跨平台的规范(抽象)

3. 多个跨平台、跨语言的应用间通信整合的方案(实际)



以各个网站显示天气预报功能为例:

气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server), 而各大站点的应用就去调用它们得到天气信息并以不同的样式去展示(WebService Client).

网站提供了天气预报的服务,但其实它们什么也没有做,只是简单了调用了一下气象中心服务器上的一段代码而已

使用JDK开发WebService_客户端


为什么要用Web service?

web service能解决:

跨平台调用 

跨语言调用

远程调用


什么时候使用web Service?

1. 同一家公司的新旧应用之间

2. 不同公司的应用之间

分析业务需求:天猫网与中通物流系统如何交互?

3. 一些提供数据的内容聚合应用:天气预报、股票行情

使用JDK开发WebService_客户端_02


Web Service中的几个重要术语

 WSDL:web service definition language

xml

uml


直译 : WebService定义语言


1. 对应一种类型的文件.wsdl

2. 定义了web service的服务器端与客户端应用交互传递请求和响应数据的格式和方式

3. 一个web service对应一个唯一的wsdl文档


SOAP:simple object  access protocal


直译: 简单对象访问协议


1. 是一种简单的、基于HTTP和​XML​​的协议, 用于在WEB上交换结构化的数据

2. soap消息:请求消息响应消息

3. http+xml片断



SEI:WebService EndPoint Interface(终端)


直译: web service的终端接口,

 

1. 就是WebService服务器端用来处理请求的接口

@Webservice

@WebMethod



CXF:Celtix + XFire


一个apache的用于开发webservice服务器端和客户端的框架



面试问题

1. webservice相当于HTTP+?+?

? : xml

? : schema

2. wsdl是什么?

webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程

3. 如何发布一个webservice?

定义SEI   @webservice @webMethod

定义SEI的实现

发布:  Endpoint.publish(url, SEIImplObject)

4. 如何请求一个webservice?

1. 根据wsdl文档生成客户端代码  jdk/cxf

2. 根据生成的代码调用webService







开发webservice

开发手段:

使用JDK开发(1.6及以上版本)


使用CXF框架开发(工作中)



组成:

服务器端


客户端


使用JDK开发WebService

1).开发服务器端

• Web Service编码:

– @WebService( SEI和SEI的实现类)

– @WebMethod(SEI中的所有方法)

• 发布Web Service:

– Endpoint(终端,发布webservice)

新建一个项目 

HelloWS接口


package com.me.ws;

import javax.jws.WebMethod;
import javax.jws.WebService;

/*
* SEI
*/
@WebService
public interface HelloWS {
@WebMethod
public String sayHello(String name);
}

HelloWSImpl实现类


package com.me.ws;

import javax.jws.WebService;

/*
* SEI的实现
*/
@WebService
public class HelloWSImpl implements HelloWS {

@Override
public String sayHello(String name) {
System.out.println("server sayHello()" + name);
return "Hello " + name;
}

}


发布Web Service


package com.me.ws.server;

import javax.xml.ws.Endpoint;

import com.me.ws.HelloWSImpl;

/*
* 发布Web Service
*/
public class ServerTest {
public static void main(String[] args) {
String address = "http://192.168.1.101:8989/hellows";
Endpoint.publish(address, new HelloWSImpl());
System.out.println("发布webservice成功!");
}
}


通过浏览器访问

http://192.168.1.101:8989/hellows?wsdl

使用JDK开发WebService_客户端_03

使用eclipse工具调用

使用JDK开发WebService_客户端_04


使用JDK开发WebService_客户端_05

2). 开发客户端

 创建客户端应用编码方式访问

– 借助jdk的wsimort.exe工具生成客户端代码:

wsimport -keep url   //url为wsdl文件的路径


新建客户端项目

借助jdk的wsimort.exe工具生成客户端代码

使用JDK开发WebService_客户端_06

刷新客户端项目会看到客户端代码

使用JDK开发WebService_客户端_07

借助生成的代码编写请求代码

package com.me.ws.client;

import com.me.ws.HelloWSImpl;
import com.me.ws.HelloWSImplService;

public class Client {
public static void main(String[] args) {
HelloWSImplService factory = new HelloWSImplService();
HelloWSImpl helloWS = factory.getHelloWSImplPort();

System.out.println(helloWS.getClass());

String result = helloWS.sayHello("marry");
System.out.println("client "+result);
}
}


请求结果

使用JDK开发WebService_xml_08

监听请求: 使用Eclipse的TCP/IP工具(端口转发)

1.将服务器端的WSDL文档保存到客户端本地

2.修改文档: 将端口号从8989改为8080

使用JDK开发WebService_服务器端_09

3.根据本地的wsdl文档生成客户端代码, 并编写客户端的调用代码

使用JDK开发WebService_xml_10

使用JDK开发WebService_xml_11

4.配置eclipse的TCP/IP,启动监听

使用JDK开发WebService_客户端_12

client

package com.me.ws.client;

import com.me.ws.HelloWSImpl;
import com.me.ws.HelloWSImplService;

public class Client {
public static void main(String[] args) {
HelloWSImplService factory = new HelloWSImplService();
HelloWSImpl helloWS = factory.getHelloWSImplPort();

System.out.println(helloWS.getClass());

String result = helloWS.sayHello("json");
System.out.println("client "+result);
}
}

5. 执行客户端代码发送WebService请求



结果

使用JDK开发WebService_服务器端_13

使用JDK开发WebService_服务器端_14