zoukankan      html  css  js  c++  java
  • webservice系统学习笔记9-使用契约优先的方式的一个服务端demo(隐式传Header信息)

    服务器端:

    1、编写wsdl文件

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
        xmlns:tns="http://www.example.org/mywsdl/" 
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        name="MyServiceImplService" 
        targetNamespace="http://www.example.org/mywsdl/">
        
        <!-- 定义类型 -->
      <wsdl:types>
        <xsd:schema targetNamespace="http://www.example.org/mywsdl/">
            <xsd:element name="add" type="tns:add"/>
            <xsd:element name="addResponse" type="tns:addResponse"/>
            <xsd:element name="divide" type="tns:divide"/>
            <xsd:element name="divideResponse" type="tns:divideResponse"/>
            <xsd:element name="licenseInfo" type="xsd:string"/>
            
            <xsd:complexType name="add">
                <xsd:sequence>
                    <xsd:element name="a" type="xsd:int"/>
                    <xsd:element name="b" type="xsd:int"/>
                </xsd:sequence>
            </xsd:complexType>
            <xsd:complexType name="addResponse">
                <xsd:sequence>
                    <xsd:element name="addResult" type="xsd:int"/>
                </xsd:sequence>
            </xsd:complexType>
            
            <xsd:complexType name="divide">
                <xsd:sequence>
                    <xsd:element name="num1" type="xsd:int"/>
                    <xsd:element name="num2" type="xsd:int"/>
                </xsd:sequence>
            </xsd:complexType>
            <xsd:complexType name="divideResponse">
                <xsd:sequence>
                    <xsd:element name="divideResult" type="xsd:int"/>
                </xsd:sequence>
            </xsd:complexType>
            
        </xsd:schema>
      </wsdl:types>
      
      <!-- 定义消息 -->
      <wsdl:message name="add">
          <wsdl:part name="add" element="tns:add"/>
      </wsdl:message>
      <wsdl:message name="addResponse">
          <wsdl:part name="addResponse" element="tns:addResponse"></wsdl:part>
      </wsdl:message>
      <wsdl:message name="divide">
          <wsdl:part name="divide" element="tns:divide"/>
      </wsdl:message>
      <wsdl:message name="divideResponse">
          <wsdl:part name="divideResponse" element="tns:divideResponse"/>
      </wsdl:message>
      
      <!-- 头消息 -->
      <wsdl:message name="licenseInfo">
          <wsdl:part name="licenseInfo" element="tns:licenseInfo"></wsdl:part>
      </wsdl:message>
      
      <!-- 定义port -->
      <wsdl:portType name="IMyService">
          <wsdl:operation name="add">
              <wsdl:input message="tns:add"/>
              <wsdl:output message="tns:addResponse"/>
          </wsdl:operation>
          
          <wsdl:operation name="divide">
              <wsdl:input message="tns:divide"/>
              <wsdl:output message="tns:divideResponse"/>
          </wsdl:operation>
      </wsdl:portType>
      
      <!-- 绑定服务 -->
      <wsdl:binding name="myServiceSOAP" type="tns:IMyService">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="add">
          <wsdl:input>
            <soap:body use="literal"/>
            <!-- 为add添加隐式的头信息 -->
            <soap:header use="literal" part="licenseInfo" message="tns:licenseInfo"/>
          </wsdl:input>
          <wsdl:output>
            <soap:body use="literal"/>
          </wsdl:output>
        </wsdl:operation>
        
        <wsdl:operation name="divide">
          <wsdl:input>
            <soap:body use="literal"/>
          </wsdl:input>
          <wsdl:output>
            <soap:body use="literal"/>
          </wsdl:output>
        </wsdl:operation>
      </wsdl:binding>
      
      <!-- 发布服务 -->
      <wsdl:service name="MyServiceImplService"><!-- 这里的名字必须和<wsdl:definitions里的name一致 -->
        <wsdl:port binding="tns:myServiceSOAP" name="MyServiceImplPort">
          <soap:address location="http://localhost:8989/ms"/>
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>

    2、使用wsimport命令生成服务端接口类(IMyService.java)
    备注:生成的其他文件都可以删除

    在add方法的参数定义上加上

    @WebParam(name="licenseInfo")String licenseInfo

    3、编写服务接口的实现类MyServiceImpl.java

    package org.example.mywsdl;
    
    import javax.jws.WebService;
    
    //这里必须制定wsdlLocation来约定参数等名称等
    //endpointInterface可写也可不写,写它主要是用到自动生成的一些注解信息
    @WebService(endpointInterface="org.example.mywsdl.IMyService",
            targetNamespace="http://www.example.org/mywsdl/",
            wsdlLocation="META-INF/wsdl/mywsdl.wsdl",
            name="MyServiceImpl"
            )
    public class MyServiceImpl implements IMyService {
    
        @Override
        public int add(int a, int b, String licenseInfo) {
            return a+b;
        }
    
        @Override
        public int divide(int num1, int num2) {
            return num1/num2;
        }
    
    }

    4、服务启动类

    package org.example.mywsdl;
    
    import javax.xml.ws.Endpoint;
    
    public class RunService {
    
        public static void main(String[] args) {
            //这里的发布地址必须和wsdl中定义的一样
            Endpoint.publish("http://localhost:8989/ms", new MyServiceImpl());
        }
    }

    访问服务:http://localhost:8989/ms?wsdl

    客户端直接用上面的地址生成即可,生成的wsdl文件即是我们编写的那个wsdl文件

    <?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --><wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/mywsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="MyServiceImplService" targetNamespace="http://www.example.org/mywsdl/">
        
        <!-- 定义类型 -->
      <wsdl:types>
        <xsd:schema targetNamespace="http://www.example.org/mywsdl/">
            <xsd:element name="add" type="tns:add"></xsd:element>
            <xsd:element name="addResponse" type="tns:addResponse"></xsd:element>
            <xsd:element name="divide" type="tns:divide"></xsd:element>
            <xsd:element name="divideResponse" type="tns:divideResponse"></xsd:element>
            <xsd:element name="licenseInfo" type="xsd:string"></xsd:element>
            
            <xsd:complexType name="add">
                <xsd:sequence>
                    <xsd:element name="a" type="xsd:int"></xsd:element>
                    <xsd:element name="b" type="xsd:int"></xsd:element>
                </xsd:sequence>
            </xsd:complexType>
            <xsd:complexType name="addResponse">
                <xsd:sequence>
                    <xsd:element name="addResult" type="xsd:int"></xsd:element>
                </xsd:sequence>
            </xsd:complexType>
            
            <xsd:complexType name="divide">
                <xsd:sequence>
                    <xsd:element name="num1" type="xsd:int"></xsd:element>
                    <xsd:element name="num2" type="xsd:int"></xsd:element>
                </xsd:sequence>
            </xsd:complexType>
            <xsd:complexType name="divideResponse">
                <xsd:sequence>
                    <xsd:element name="divideResult" type="xsd:int"></xsd:element>
                </xsd:sequence>
            </xsd:complexType>
            
        </xsd:schema>
      </wsdl:types>
      
      <!-- 定义消息 -->
      <wsdl:message name="add">
          <wsdl:part name="add" element="tns:add"></wsdl:part>
      </wsdl:message>
      <wsdl:message name="addResponse">
          <wsdl:part name="addResponse" element="tns:addResponse"></wsdl:part>
      </wsdl:message>
      <wsdl:message name="divide">
          <wsdl:part name="divide" element="tns:divide"></wsdl:part>
      </wsdl:message>
      <wsdl:message name="divideResponse">
          <wsdl:part name="divideResponse" element="tns:divideResponse"></wsdl:part>
      </wsdl:message>
      
      <!-- 头消息 -->
      <wsdl:message name="licenseInfo">
          <wsdl:part name="licenseInfo" element="tns:licenseInfo"></wsdl:part>
      </wsdl:message>
      
      <!-- 定义port -->
      <wsdl:portType name="IMyService">
          <wsdl:operation name="add">
              <wsdl:input message="tns:add"></wsdl:input>
              <wsdl:output message="tns:addResponse"></wsdl:output>
          </wsdl:operation>
          
          <wsdl:operation name="divide">
              <wsdl:input message="tns:divide"></wsdl:input>
              <wsdl:output message="tns:divideResponse"></wsdl:output>
          </wsdl:operation>
      </wsdl:portType>
      
      <!-- 绑定服务 -->
      <wsdl:binding name="myServiceSOAP" type="tns:IMyService">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"></soap:binding>
        <wsdl:operation name="add">
          <wsdl:input>
            <soap:body use="literal"></soap:body>
            <!-- 为add添加隐式的头信息 -->
            <soap:header use="literal" part="licenseInfo" message="tns:licenseInfo"></soap:header>
          </wsdl:input>
          <wsdl:output>
            <soap:body use="literal"></soap:body>
          </wsdl:output>
        </wsdl:operation>
        
        <wsdl:operation name="divide">
          <wsdl:input>
            <soap:body use="literal"></soap:body>
          </wsdl:input>
          <wsdl:output>
            <soap:body use="literal"></soap:body>
          </wsdl:output>
        </wsdl:operation>
      </wsdl:binding>
      
      <!-- 发布服务 -->
      <wsdl:service name="MyServiceImplService"><!-- 这里的名字必须和<wsdl:definitions里的name一致 -->
        <wsdl:port binding="tns:myServiceSOAP" name="MyServiceImplPort">
          <soap:address location="http://localhost:8989/ms"></soap:address>
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>

    使用该wsdl生成客户端java代码后的add方法如下:

    @WebMethod
        @WebResult(name = "addResult", targetNamespace = "")
        @RequestWrapper(localName = "add", targetNamespace = "http://www.example.org/mywsdl/", className = "com.ws04.Add")
        @ResponseWrapper(localName = "addResponse", targetNamespace = "http://www.example.org/mywsdl/", className = "com.ws04.AddResponse")
        public int add(@WebParam(name = "a", targetNamespace = "") int a,
                @WebParam(name = "b", targetNamespace = "") int b);

    此时方法的参数里没有看到有头信息参数的定义,调用该方法可以使用handler或者soap来编码传递头信息

  • 相关阅读:
    【漏洞分析】5次shift漏洞破解win7密码
    skyler实战渗透笔记(五)—Tr0ll
    skyler实战渗透笔记(四)—Raven2
    skyler实战渗透笔记(三)—Raven
    python读写excel文件
    python_列表
    mysql安装教程
    centos7安装RabbitMQ教程
    centos7安装mongodb4.2.15教程
    tomcat9安装教程
  • 原文地址:https://www.cnblogs.com/yangzhilong/p/3365786.html
Copyright © 2011-2022 走看看