系列博文:
分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客
分布式.RPC-WebService三要素,三个规范, Soap协议_闲猫的博客-CSDN博客
分布式.RPC-WebService入门案例(java实现,注解实现,xsd文件解析,wsdl文件解析)_闲猫的博客-CSDN博客
分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客
分布式.RPC-WebService CXF框架_闲猫的博客-CSDN博客
分布式.RPC-WebService Restful风格实现_闲猫的博客-CSDN博客
目录
WebService三要素
WebService三规范
SOAP协议
SOAP协议简介
TCP/IP Monitor
HttpClient操作SOAP
SOAP 1.2
WebService三要素
JAX-WS 规范 对service高度封装 ,最普遍,基于soap协议
JAXM & SAAJ 让你实现更多的底层实现 ,使用起来比较繁琐 基于soap协议 ,实现每个细节。
JAX-RS 规范 rest风格的webservice
WebService三规范
SOAP协议 :简单对象访问协议 基于http
WSDL:webservice使用说明书 网络服务描述语言 W3C
UDDI
SOAP协议
SOAP协议简介
SOAP(Simple Object Access Protocol)简单对象访问协议。 是基于HTTP协议,使用XML作为数据传输的格式,SOAP规定了XML的格式。XML格式的数据屏蔽了不同语言和平台对对象要求的不同,这个也是WebService(基于SOAP协议)有跨语言、跨平台特点的基础。
特点:
跨语言、跨平台
穿透防火墙:该协议基于HTTP,防火墙对80端口是开的,所以SOAP也就搭了顺风车,直接穿透
W3C( 万维网联盟 )制定的标准
TCP/IP Monitor
功能:
该工具是Tcp/Ip监视器,可以抓某一次请求和响应数据,是Eclipse中插件。
原理:
客户端请求 Tcp/Ip Monitor设定的端口,然后Tcp/Ip Monitor再请求服务器,返回的时候,服务器将数据返回给Tcp/Ip Monitor,Tcp/Ip Monitor再将数据返回给客户端。
图示如下:
操作:
打开监听工具
制定转发规则
点击“Add..”,出现如下界面:
启动监听
点击start按钮启动
·
运行过程
补充:以下是获取的请求和响应的报文:
[ww1]请求数据
[ww2]响应数据
HttpClient操作SOAP
环境搭建
创建一个java工程,然后导入所需要的jar包,包括:
commons-codec-1.6.jar
commons-logging-1.1.3.jar
httpclient-4.3.5.jar
httpcore-4.3.2.jar
步骤:
创建客户端对象构造请求对象(HttpGet/HttpPost,构建:创建对象、添加参数)使用够HTTP客户端对象执行请求对象,并返回响应对象使用工具类获取响应对象的数据
HttpClient发送get请求
逻辑:
创建一个Get请求对象,然后使用HTTP客户端类来执行该Get请求,返回一个HttpResponse对象,从response对象中获取结果实体,然后使用EntityUtils工具类进行解析。
Get请求只有一个地址,所以Get请求对象构造就需要一个URL地址即可。
代码:
try{
// HTTPClient 发送get请求,值设定一个url地址即可
HttpClient client [ww1]= HttpClients.createDefault();
HttpGet get [ww2]=newHttpGet("http://localhost:12345/member?wsdl");
HttpResponse response = client.execute(get)[ww3];
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.toString(entity, "utf-8"));
[ww4]}catch(Exception e) {
e.printStackTrace();
}
[ww1]构建客户端
[ww2]构建请求对象
[ww3]使用客户端对象执行请求
[ww4]获取并解析响应数据
HttpClient发送post请求
逻辑:
跟get请求不同的是构造的请求参数对象发生变化了,POST请求是将参数放在请求体中,所以在构造post请求对象是比较麻烦的,手动拼接一个soap协议的请求报文然后发送给服务器。
代码:
try{
HttpClient client [ww1]= HttpClients.createDefault();
HttpPostpostRequest[ww2]=newHttpPost(
"http://localhost:12345/member?wsdl");
//设置头信息,方式参数中中文乱码
postRequest.setHeader[ww3]("Content-type", "text/xml;charset=utf-8");
String soap = "<?xml version=\"1.0\" ?>"
+ "<S:Envelope xmlns:S=\"/soap/envelope/\">"
+ "<S:Body>"
+ "<ns2:getMember xmlns:ns2=\"/\">"
+ "<arg0>"+ "</arg0>" + "</ns2:getMember>" + "</S:Body>"
+ "</S:Envelope>";
//设置post请求的请求体
postRequest.setEntity(newStringEntity(soap))[ww4];
HttpResponse response = client.execute(postRequest)[ww5];
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.toString(entity, "utf-8"));
[ww6]
}catch(Exception e) {
e.printStackTrace();
}
[ww1]1.构建HTTP客户端对象
[ww2]2.1创建post请求对象
[ww3]设置头信息,方式参数中中文乱码
[ww4]设置post请求的请求体
[ww5]3. 使用够HTTP客户端对象执行请求对象,并返回响应对象
[ww6]获取并解析响应数据
发送的字符串:(上述工程中拼接的字符串)
<?xml version="1.0"?>
<S:Envelope xmlns:S="/soap/envelope/">
<S:Body>
<ns2:getMember xmlns:ns2="/">
<arg0>
</arg0>
</ns2:getMember>
</S:Body>
</S:Envelope>
响应报文:
<?xml version="1.0"?>
<S:Envelope xmlns:S="/soap/envelope/">
<S:Body>
<ns2:getMemberResponse xmlns:ns2="/">
<return>
<name>赵芸</name>
<uuid>11</uuid>
</return>
</ns2:getMemberResponse>
</S:Body>
</S:Envelope>
SOAP 1.2
开发SOAP1.2
逻辑:
需要导入soup1.2版本的扩展包,服务类开发是需要新增注解:
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
发布服务也同SOAP1.1。区别就是一个注解和几个jar包。
1. 创建java工程 ,引入扩展包
2.开发服务类:
import javax.jws.WebService;
import javax.xml.ws.BindingType;
import javax.xml.ws.soap.SOAPBinding;
@WebService
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)[ww1]
public class Weather {
public String info(String city){
}
}
[ww1]新增的注解,表示使用的是soap1.2报文格式
3. 发布web服务 ,同1.1
SOAP1.1和SOAP1.2对比:
END
如果觉得《分布式.RPC-WebService三要素 三个规范 Soap协议(理解原理 才是事半功倍)》对你有帮助,请点赞、收藏,并留下你的观点哦!