java webservice
1. webservice介绍
1.1 webservice是使用http协议发送soap协议数据的一种远程调用技术。
1.2 soap:简单对象访问协议
1.2.1 soap协议格式:
必需有 Envelope 元素,此元素将整个 XML 文档标识为一条 SOAP 消息
可选的 Header 元素,包含头部信息
必需有Body 元素,包含所有的调用和响应信息
可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
1.2.2 请求
1.2.3 响应
1.2.4 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.2.5 Jaxws不支持SOAP1.2服务端发布,直接发布会报如下异常
如果想发布SOAP1.2服务端,需要在服务端引入第三方JAR(jaxws-ri-2.2.8),在实现类上加入如下注解
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
1.2.6 wsimport介绍
Wsimport就是jdk提供的的一个工具,他作用就是根据WSDL地址生成客户端代码
Wsimport位置java_HOME/bin
Wsimport常用的参数:
-s,生成java文件的
-d,生成class文件的,默认的参数
-p,指定包名的,如果不加该参数,默认包名就是wsdl文档中的命名空间的倒序
Wsimport仅支持SOAP1.1客户端的生成,不支持发布,肯定不支持客户端生成,这是显而易见的
2. jaxws开发webservice
2.1 服务端
2.1.1 创建SEI(Service Endpoint Interface)接口,本质上就是java接口
package com.ghl;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
/**
* @Author : ganhonglaing
* @Date : 2018/10/23 19:35
* @Description: 创建SEI(Service Endpoint Interface)接口,本质上是Java接口,在接口上用注解改变返回值和参数名称
*/
@WebService
public interface IHello {
/**
* @param name
* @return
*/
@WebMethod @WebResult(name = "result") String sayHello(@WebParam(name = "name") String name);
}
2.1.2 创建SEI实现类,在实现类上加入@WebService
package com.ghl;
import javax.jws.WebService;
/**
* @Author : ganhonglaing
* @Date : 2018/10/23 19:39
* @Description: 要发布接口,@WebService(endpointInterface = "com.ghl.IHello"),必须在接口上用webservice注解
* 否则,com.sun.xml.internal.ws.model.runtimeModelerException: 端点接口com.ghl.IHello没有 Web 服务注释
* 发布接口,则在wsdl文档中portType为接口,如果不发布接口,则为类
*/
@WebService(endpointInterface = "com.ghl.IHello")
public class Hello implements IHello {
@Override
public String sayHello(String name) {
return "hello,"+name;
}
}
2.1.3 发布服务,Endpoint发布服务,publish方法,两个参数:1.服务地址;2.服务实现类
package com.ghl;
import javax.xml.ws.Endpoint;
/**
* @Author : ganhonglaing
* @Date : 2018/10/23 19:47
* @Description:发布服务
*/
public class Main {
public static void main(String[] args) {
Endpoint.publish("http://127.0.0.1:12345/hello",new Hello());
}
}
2.1.4 测试服务是否发布成功,通过阅读使用说明书,确定客户端调用的接口、方法、参数和返回值存在,证明服务发布成功。
在浏览器中访问http://127.0.0.1:12345/hello?wsdl,结果如下图所示:
wsdl解析:
(1)service标签:服务视图,通过get+子标签port的name属性,得到服务实现类,通过子标签port的binding属性可以定位到binding标签;
(2) binding标签:为每个服务端点定义消息格式和协议细节,通过binding的type属性定位到portType标签
(3)portType标签:服务端点,描述 web service可被执行的操作方法,以及相关的消息
(4)message标签:定义一个操作(方法)的数据参数(可有多个参数)
(5)types标签:定义 webservice 使用的全部数据类型,通过上图箭头所指的地址可以看到如下图所示:
箭头指向的name属性值可以通过@WebResult(设置返回值名称),@WebParam(设置参数名称)来自定义, 如果不定义,则为默认值,arg0,arg1....
2.2 客户端开发
2.2.1 wsimport命令生成客户端代码 wsimport -p com.ghl http://127.0.0.1:12345/hello?wsdl
-p 指定包名
2.2.2 根据使用说明书,使用客户端代码调用服务端
(1)创建服务视图,视图是从service标签的name属性获取
(2)获取服务实现类,实现类从service的子标签port标签的get+name属性获取
(3)获取查询方法,从portType的operation标签的name属性值获取
package com.ghl;
/**
* @Author : ganhonglaing
* @Date : 2018/10/23 21:30
* @Description:
*/
public class Main {
public static void main(String[] args) {
//新建服务类
HelloService service = new HelloService();
//获取服务实现类
Ihello hello = service.getHelloPort();
//调用方法
String result = hello.sayHello("tom");
System.out.println(result);
}
}
3. cxf发布webservice服务(服务端客户端)
4. cxf发布集成Spring发布webservice 服务(服务端客户端)
5. cxf发布rest风格的webservice服务(服务端客户端)
6. cxf集成spring发布rest风格的webservice服务(服务端客户端)
7. webservice通用客户端实现(不需要用工具生成客户端代码)
3-7的代码见我github: https://github.com/honglianggan/webservice
相关阅读
Android近期任务列表Recent List(Recents Screen)的实现
一、明确android的近期任务是什么:我们的手机下方一般有三个键,一个是返回键,中间的是home键,另一个是RecentList键,也就是最近浏览记
我 是用idea写的。 需求分析: 用户进入首页,选择登陆,跳转到登陆 / 注册页面的登陆模块,如有账户,登陆成功跳转首页,并显示用户名;如没
作为曾经因手机而风光无限的小米,近期发展形势却不容乐观。小米手机国内销量下滑、股价一直徘徊在10港元以下,面对如今的局势小米正
笔记本外接显示器合上盖子之后,外接显示器会跟随笔记本屏幕进入休眠状态,怎么实现合上盖子也能使用外接显示器呢?下面我们就来看看详
大家好,我是梅宫主。今天与大家分享下如何搞流量。搞流量难不难?前几天,我与大家分享了赚钱万能公式:赚钱=产品的利润×流量&t