• 分布式.RPC-WebService三要素,三个规范, Soap协议


     系列博文:

     

    分布式.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按钮启动

         ·

     运行过程

            

    补充:以下是获取的请求和响应的报文:

    请求报文

    响应报文

    POST /member HTTP/1.1

    Accept: text/xml, multipart/related

    Content-Type: text/xml; charset=utf-8

    SOAPAction: "http://Service.itcast.cn/MemberService/getMemberRequest"

    User-Agent: JAX-WS RI 2.2.4-b01

    Host: localhost:54321

    Connection: keep-alive

    Content-Length: 198

    [ww1] 

    HTTP/1.1 200 OK

    Transfer-encoding: chunked

    Content-type: text/xml; charset=utf-8

    Date: Mon, 29 Jun 2015 12:12:03 GMT

    赵芸

    11

    [ww2] 


     [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

      步骤:

    1. 创建客户端对象
    2. 构造请求对象(HttpGet/HttpPost,构建:创建对象、添加参数)
    3. 使用够HTTP客户端对象执行请求对象,并返回响应对象
    4. 使用工具类获取响应对象的数据

      HttpClient发送get请求

    逻辑:

           创建一个Get请求对象,然后使用HTTP客户端类来执行该Get请求,返回一个HttpResponse对象,从response对象中获取结果实体,然后使用EntityUtils工具类进行解析。

           Get请求只有一个地址,所以Get请求对象构造就需要一个URL地址即可。

    代码:

    try {

        // HTTPClient 发送get请求,值设定一个url地址即可

        HttpClient client [ww1] = HttpClients.createDefault();

        HttpGet get [ww2] = new HttpGet("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();

        HttpPost postRequest [ww2] = new HttpPost(

               "http://localhost:12345/member?wsdl");

        //设置头信息,方式参数中中文乱码

        postRequest.setHeader[ww3] ("Content-type", "text/xml;charset=utf-8");

        String soap = ""

               + ""

               + ""

               + ""

               + ""+ "" + "" + ""

               + "";

        //设置post请求的请求体

        postRequest.setEntity(new StringEntity(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="http://schemas.xmlsoap.org/soap/envelope/">

        <S:Body>

           <ns2:getMember xmlns:ns2="http://Service.itcast.cn/">

               <arg0>

               arg0>

           ns2:getMember>

        S:Body>

    S:Envelope>

    响应报文:

    xml version="1.0" ?>

    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">

        <S:Body>

            <ns2:getMemberResponse xmlns:ns2="http://Service.itcast.cn/">

                <return>

                    <name>赵芸name>

                    <uuid>11uuid>

                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对比:

    SOAP1.1

    SOAP1.2

    请求

    请求

    POST /weather HTTP/1.1

    Accept: text/xml, multipart/related

    Content-Type: text/xml; charset=utf-8

    SOAPAction: "http://service.itcast.cn/Weather/infoRequest"

    User-Agent: JAX-WS RI 2.2.4-b01

    Host: localhost:54321

    Connection: keep-alive

    Content-Length: 194

    http://schemas.xmlsoap.org/soap/envelope/">

    北京

    POST /weather HTTP/1.1

    Accept: application/soap+xml, multipart/related

    Content-Type: application/soap+xml; charset=utf-8;action="http://service.itcast.cn/Weather/infoRequest"

    User-Agent: JAX-WS RI 2.2.4-b01

    Host: localhost:54321

    Connection: keep-alive

    Content-Length: 192

    响应

    响应

    HTTP/1.1 200 OK

    Transfer-encoding: chunked

    Content-type: text/xml; charset=utf-8

    Date: Sat, 27 Jun 2015 03:07:55 GMT

    http://schemas.xmlsoap.org/soap/envelope/">

    雷阵雨

    HTTP/1.1 200 OK

    Transfer-encoding: chunked

    Content-type: application/soap+xml; charset=utf-8

    Date: Sat, 27 Jun 2015 06:45:54 GMT

    http://www.w3.org/2003/05/soap-envelope">

    雷阵雨


    END

  • 相关阅读:
    安装nvm
    出口美国操作要点汇总│走美国海运拼箱的注意事项│箱讯科技
    特征向量简介
    c语言open函数追加模式的疑问
    最小栈(C++解法)
    信息化疫情防控很有必要,老厂商出手了
    嵌入式Real-time Linux开发
    log4j.properties支持不同包日志分文件打印
    Java实现Excel导入和导出,看这一篇就够了(珍藏版2.0)
    maven与nexus
  • 原文地址:https://blog.csdn.net/weixin_42754896/article/details/126448062