WebService的wsdl详解

webservice服务的wsdl内容详解,以及如何根据其内容编写调用代码

wsdl示例

展示一个webservice的wsdl,及调用这个接口的Axis客户端

wsdl

This XML file does not appear to have any style information associated with it. The document tree is shown below.

<wsdl:definitions
    xmlns:apachesoap="http://xml.apache.org/xml-soap"
    xmlns:impl="http://10.10.1.190:6889/ormrpc/services/EASLogin"
    xmlns:intf="http://10.10.1.190:6889/ormrpc/services/EASLogin"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:tns1="urn:client"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://10.10.1.190:6889/ormrpc/services/EASLogin">
    <!-- WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT) -->
	
	
    <wsdl:types>
        <schema
            xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:client">
            <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
            <complexType name="WSContext">
                <sequence>
                    <element name="dbType" type="xsd:int"/>
                    <element name="dcName" nillable="true" type="xsd:string"/>
                    <element name="password" nillable="true" type="xsd:string"/>
                    <element name="sessionId" nillable="true" type="xsd:string"/>
                    <element name="slnName" nillable="true" type="xsd:string"/>
                    <element name="userName" nillable="true" type="xsd:string"/>
                </sequence>
            </complexType>
        </schema>
    </wsdl:types>
	
	
    <wsdl:message name="loginByLtpaTokenResponse">
        <wsdl:part name="loginByLtpaTokenReturn" type="tns1:WSContext"></wsdl:part>
    </wsdl:message>
	
	
    <wsdl:message name="loginByLtpaTokenRequest">
        <wsdl:part name="userName" type="xsd:string"></wsdl:part>
        <wsdl:part name="ltpaToken" type="xsd:string"></wsdl:part>
        <wsdl:part name="slnName" type="xsd:string"></wsdl:part>
        <wsdl:part name="dcName" type="xsd:string"></wsdl:part>
        <wsdl:part name="language" type="xsd:string"></wsdl:part>
        <wsdl:part name="dbType" type="xsd:int"></wsdl:part>
    </wsdl:message>
	
	
    <wsdl:message name="loginResponse2">
        <wsdl:part name="loginReturn" type="tns1:WSContext"></wsdl:part>
    </wsdl:message>
	
    <wsdl:message name="logoutResponse">
        <wsdl:part name="logoutReturn" type="xsd:boolean"></wsdl:part>
    </wsdl:message>
	
    <wsdl:message name="logoutRequest">
        <wsdl:part name="userName" type="xsd:string"></wsdl:part>
        <wsdl:part name="slnName" type="xsd:string"></wsdl:part>
        <wsdl:part name="dcName" type="xsd:string"></wsdl:part>
        <wsdl:part name="language" type="xsd:string"></wsdl:part>
    </wsdl:message>
	
    <wsdl:message name="loginResponse1">
        <wsdl:part name="loginReturn" type="tns1:WSContext"></wsdl:part>
    </wsdl:message>
	
    <wsdl:message name="loginRequest2">
        <wsdl:part name="userName" type="xsd:string"></wsdl:part>
        <wsdl:part name="password" type="xsd:string"></wsdl:part>
        <wsdl:part name="slnName" type="xsd:string"></wsdl:part>
        <wsdl:part name="dcName" type="xsd:string"></wsdl:part>
        <wsdl:part name="language" type="xsd:string"></wsdl:part>
        <wsdl:part name="dbType" type="xsd:int"></wsdl:part>
        <wsdl:part name="authPattern" type="xsd:string"></wsdl:part>
        <wsdl:part name="isEncodePwd" type="xsd:int"></wsdl:part>
    </wsdl:message>
	
    <wsdl:message name="loginRequest1">
        <wsdl:part name="userName" type="xsd:string"></wsdl:part>
        <wsdl:part name="password" type="xsd:string"></wsdl:part>
        <wsdl:part name="slnName" type="xsd:string"></wsdl:part>
        <wsdl:part name="dcName" type="xsd:string"></wsdl:part>
        <wsdl:part name="language" type="xsd:string"></wsdl:part>
        <wsdl:part name="dbType" type="xsd:int"></wsdl:part>
        <wsdl:part name="authPattern" type="xsd:string"></wsdl:part>
    </wsdl:message>
	
    <wsdl:message name="loginResponse">
        <wsdl:part name="loginReturn" type="tns1:WSContext"></wsdl:part>
    </wsdl:message>
	
    <wsdl:message name="loginRequest">
        <wsdl:part name="userName" type="xsd:string"></wsdl:part>
        <wsdl:part name="password" type="xsd:string"></wsdl:part>
        <wsdl:part name="slnName" type="xsd:string"></wsdl:part>
        <wsdl:part name="dcName" type="xsd:string"></wsdl:part>
        <wsdl:part name="language" type="xsd:string"></wsdl:part>
        <wsdl:part name="dbType" type="xsd:int"></wsdl:part>
    </wsdl:message>
	
	
    <wsdl:portType name="EASLoginProxy">
        <wsdl:operation name="login" parameterOrder="userName password slnName dcName language dbType">
            <wsdl:input message="impl:loginRequest" name="loginRequest"></wsdl:input>
            <wsdl:output message="impl:loginResponse" name="loginResponse"></wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="login" parameterOrder="userName password slnName dcName language dbType authPattern">
            <wsdl:input message="impl:loginRequest1" name="loginRequest1"></wsdl:input>
            <wsdl:output message="impl:loginResponse1" name="loginResponse1"></wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="login" parameterOrder="userName password slnName dcName language dbType authPattern isEncodePwd">
            <wsdl:input message="impl:loginRequest2" name="loginRequest2"></wsdl:input>
            <wsdl:output message="impl:loginResponse2" name="loginResponse2"></wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="logout" parameterOrder="userName slnName dcName language">
            <wsdl:input message="impl:logoutRequest" name="logoutRequest"></wsdl:input>
            <wsdl:output message="impl:logoutResponse" name="logoutResponse"></wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="loginByLtpaToken" parameterOrder="userName ltpaToken slnName dcName language dbType">
            <wsdl:input message="impl:loginByLtpaTokenRequest" name="loginByLtpaTokenRequest"></wsdl:input>
            <wsdl:output message="impl:loginByLtpaTokenResponse" name="loginByLtpaTokenResponse"></wsdl:output>
        </wsdl:operation>
    </wsdl:portType>
	
	
    <wsdl:binding name="EASLoginSoapBinding" type="impl:EASLoginProxy">
        <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
		
        <wsdl:operation name="login">
            <wsdlsoap:operation soapAction=""/>
            <wsdl:input name="loginRequest">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://login.webservice.bos.kingdee.com" use="encoded"/>
            </wsdl:input>
            <wsdl:output name="loginResponse">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://10.10.1.190:6889/ormrpc/services/EASLogin" use="encoded"/>
            </wsdl:output>
        </wsdl:operation>
		
        <wsdl:operation name="login">
            <wsdlsoap:operation soapAction=""/>
            <wsdl:input name="loginRequest1">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://login.webservice.bos.kingdee.com" use="encoded"/>
            </wsdl:input>
            <wsdl:output name="loginResponse1">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://10.10.1.190:6889/ormrpc/services/EASLogin" use="encoded"/>
            </wsdl:output>
        </wsdl:operation>
		
        <wsdl:operation name="login">
            <wsdlsoap:operation soapAction=""/>
            <wsdl:input name="loginRequest2">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://login.webservice.bos.kingdee.com" use="encoded"/>
            </wsdl:input>
            <wsdl:output name="loginResponse2">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://10.10.1.190:6889/ormrpc/services/EASLogin" use="encoded"/>
            </wsdl:output>
        </wsdl:operation>
		
        <wsdl:operation name="logout">
            <wsdlsoap:operation soapAction=""/>
            <wsdl:input name="logoutRequest">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://login.webservice.bos.kingdee.com" use="encoded"/>
            </wsdl:input>
            <wsdl:output name="logoutResponse">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://10.10.1.190:6889/ormrpc/services/EASLogin" use="encoded"/>
            </wsdl:output>
        </wsdl:operation>
		
        <wsdl:operation name="loginByLtpaToken">
            <wsdlsoap:operation soapAction=""/>
            <wsdl:input name="loginByLtpaTokenRequest">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://login.webservice.bos.kingdee.com" use="encoded"/>
            </wsdl:input>
            <wsdl:output name="loginByLtpaTokenResponse">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://10.10.1.190:6889/ormrpc/services/EASLogin" use="encoded"/>
            </wsdl:output>
        </wsdl:operation>
		
    </wsdl:binding>
	
	
	
    <wsdl:service name="EASLoginProxyService">
        <wsdl:port binding="impl:EASLoginSoapBinding" name="EASLogin">
            <wsdlsoap:address location="http://10.10.1.190:6889/ormrpc/services/EASLogin"/>
        </wsdl:port>
    </wsdl:service>
	
	
</wsdl:definitions>

Axis客户端

用于调用上面的webservice服务

<dependency>
	<groupId>org.apache.axis</groupId>
	<artifactId>axis</artifactId>
	<version>1.4</version>
</dependency>
import client.WSContext;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.w3c.dom.Document;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import javax.xml.soap.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;


public static void other(){

        QName returnType = new javax.xml.namespace.QName("urn:client", "WSContext");

        Object result = null;
        try {
            // 创建一个新的Service对象
            Service service = new Service();
            Call call = (Call) service.createCall();

            // 设置目标webservice地址,注意去掉 问号与wsdl
            call.setTargetEndpointAddress(new URL("http://10.10.1.190:6889/ormrpc/services/EASLogin"));

            //设置方法名
            call.setOperationName(new QName( "login"));

            // 设置传入参数的xml及类型,可以不写
            //call.addParameter("userName", XMLType.XSD_STRING, ParameterMode.IN);
            //call.addParameter("password", XMLType.XSD_STRING, ParameterMode.IN);
            //call.addParameter("slnName", XMLType.XSD_STRING, ParameterMode.IN);
            //call.addParameter("dcName", XMLType.XSD_STRING, ParameterMode.IN);
            //call.addParameter("language", XMLType.XSD_STRING, ParameterMode.IN);
            //call.addParameter("dbType", XMLType.XSD_INT, ParameterMode.IN);

            // 设置返回参数的xml及类型,设置请求参数时要写参数名,而返回值不用
            call.setReturnType(returnType);
            call.setReturnClass(WSContext.class);

            //设置返回值名字,可以不写
            //call.setReturnQName(new QName("", "loginReturn"));

            //设置axis的序列化,否则无法接受自定义类型WSContext
            Class sf = org.apache.axis.encoding.ser.BeanSerializerFactory.class;
            Class df = org.apache.axis.encoding.ser.BeanDeserializerFactory.class;
            call.registerTypeMapping(WSContext.class, returnType, sf, df, false);

            // 构造请求的参数
            String userName = "xdgt";
            String password = "123456";
            String slnName = "eas";
            String dcName = "gg01";
            String language = "L2";
            Integer dbType = 2;

            // 调用WebService方法
            WSContext ws = (WSContext) call.invoke(new Object[] {userName, password, slnName, dcName, language, dbType});

            // 处理返回的结果
            System.out.println("Response: " + ws.getSessionId());
        } catch (Exception e) {
            result = "{\"status\": \"error\",\"msg\":\"" + e.getMessage() + "\"}";
        }

        System.out.println(result);

}

返回类型WSContext代码,这个建议用axis命令生成,因为内部涉及wsdl的拼接,比较麻烦,而且实际开发中,有可能你并不了解对方的代码结构

axis命令生成参考:

https://blog.csdn.net/onePlus5T/article/details/139122866
/**
 * WSContext.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.
 */

package client;

public class WSContext  implements java.io.Serializable {
    private int dbType;

    private String dcName;

    private String password;

    private String sessionId;

    private String slnName;

    private String userName;

    public WSContext() {
    }

    public WSContext(
            int dbType,
            String dcName,
            String password,
            String sessionId,
            String slnName,
            String userName) {
        this.dbType = dbType;
        this.dcName = dcName;
        this.password = password;
        this.sessionId = sessionId;
        this.slnName = slnName;
        this.userName = userName;
    }


    /**
     * Gets the dbType value for this WSContext.
     *
     * @return dbType
     */
    public int getDbType() {
        return dbType;
    }


    /**
     * Sets the dbType value for this WSContext.
     *
     * @param dbType
     */
    public void setDbType(int dbType) {
        this.dbType = dbType;
    }


    /**
     * Gets the dcName value for this WSContext.
     *
     * @return dcName
     */
    public String getDcName() {
        return dcName;
    }


    /**
     * Sets the dcName value for this WSContext.
     *
     * @param dcName
     */
    public void setDcName(String dcName) {
        this.dcName = dcName;
    }


    /**
     * Gets the password value for this WSContext.
     *
     * @return password
     */
    public String getPassword() {
        return password;
    }


    /**
     * Sets the password value for this WSContext.
     *
     * @param password
     */
    public void setPassword(String password) {
        this.password = password;
    }


    /**
     * Gets the sessionId value for this WSContext.
     *
     * @return sessionId
     */
    public String getSessionId() {
        return sessionId;
    }


    /**
     * Sets the sessionId value for this WSContext.
     *
     * @param sessionId
     */
    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }


    /**
     * Gets the slnName value for this WSContext.
     *
     * @return slnName
     */
    public String getSlnName() {
        return slnName;
    }


    /**
     * Sets the slnName value for this WSContext.
     *
     * @param slnName
     */
    public void setSlnName(String slnName) {
        this.slnName = slnName;
    }


    /**
     * Gets the userName value for this WSContext.
     *
     * @return userName
     */
    public String getUserName() {
        return userName;
    }


    /**
     * Sets the userName value for this WSContext.
     *
     * @param userName
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }

    private Object __equalsCalc = null;
    public synchronized boolean equals(Object obj) {
        if (!(obj instanceof WSContext)) return false;
        WSContext other = (WSContext) obj;
        if (obj == null) return false;
        if (this == obj) return true;
        if (__equalsCalc != null) {
            return (__equalsCalc == obj);
        }
        __equalsCalc = obj;
        boolean _equals;
        _equals = true &&
                this.dbType == other.getDbType() &&
                ((this.dcName==null && other.getDcName()==null) ||
                        (this.dcName!=null &&
                                this.dcName.equals(other.getDcName()))) &&
                ((this.password==null && other.getPassword()==null) ||
                        (this.password!=null &&
                                this.password.equals(other.getPassword()))) &&
                ((this.sessionId==null && other.getSessionId()==null) ||
                        (this.sessionId!=null &&
                                this.sessionId.equals(other.getSessionId()))) &&
                ((this.slnName==null && other.getSlnName()==null) ||
                        (this.slnName!=null &&
                                this.slnName.equals(other.getSlnName()))) &&
                ((this.userName==null && other.getUserName()==null) ||
                        (this.userName!=null &&
                                this.userName.equals(other.getUserName())));
        __equalsCalc = null;
        return _equals;
    }

    private boolean __hashCodeCalc = false;
    public synchronized int hashCode() {
        if (__hashCodeCalc) {
            return 0;
        }
        __hashCodeCalc = true;
        int _hashCode = 1;
        _hashCode += getDbType();
        if (getDcName() != null) {
            _hashCode += getDcName().hashCode();
        }
        if (getPassword() != null) {
            _hashCode += getPassword().hashCode();
        }
        if (getSessionId() != null) {
            _hashCode += getSessionId().hashCode();
        }
        if (getSlnName() != null) {
            _hashCode += getSlnName().hashCode();
        }
        if (getUserName() != null) {
            _hashCode += getUserName().hashCode();
        }
        __hashCodeCalc = false;
        return _hashCode;
    }

    // Type metadata
    private static org.apache.axis.description.TypeDesc typeDesc =
            new org.apache.axis.description.TypeDesc(WSContext.class, true);

    static {
        typeDesc.setXmlType(new javax.xml.namespace.QName("urn:client", "WSContext"));
        org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("dbType");
        elemField.setXmlName(new javax.xml.namespace.QName("", "dbType"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"));
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("dcName");
        elemField.setXmlName(new javax.xml.namespace.QName("", "dcName"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
        elemField.setNillable(true);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("password");
        elemField.setXmlName(new javax.xml.namespace.QName("", "password"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
        elemField.setNillable(true);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("sessionId");
        elemField.setXmlName(new javax.xml.namespace.QName("", "sessionId"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
        elemField.setNillable(true);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("slnName");
        elemField.setXmlName(new javax.xml.namespace.QName("", "slnName"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
        elemField.setNillable(true);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("userName");
        elemField.setXmlName(new javax.xml.namespace.QName("", "userName"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
        elemField.setNillable(true);
        typeDesc.addFieldDesc(elemField);
    }


}

wsdl标签大意

types元素

使用XML模式语言,声明在WSDL文档中的其他位置使用的复杂数据类型与元素,可理解为就是**定义webservice方法请求与响应参数的**

import元素

类似于XML模式文档中的import元素,用于从其他WSDL文档中导入WSDL定义;

message元素

使用在WSDL文档的type元素中定义或在import元素引用的外部WSDL文档中定义的XML模式的内置类型、复杂类型或元素描述了消息的有效负载;

portType元素operation元素

描述了Web服务的接口并定义了他的方法。portType元素和operation元素类似于java接口和接口中定义的方法声明。operation元素使用一个或者多个message类型来定义他的输入和输出的有效负载;

Binding元素

将portType元素和operation元素赋给一个特殊的协议和编码样式;

service元素

负责将Internet地址赋给一个具体的绑定;

具体解释

wsdl:definitions标签

xmlns:xxxx

做此wsdl的定义,里面有很多 xmlns:xxxx,其中后半部分的xxxx会在其他标签中被引用

比如,在上面wsdl文件中的 wsdl:messageResponse标签 中,返回类型定义为:type=“tns1:WSContext”,则对应Axis客户端代码就要这样写:

//因为tns1在 <wsdl:definitions>标签 中定义值为 urn:client,所以要向下面这样拼
call.setReturnType(new javax.xml.namespace.QName("urn:client", "WSContext"));

//一般如果不是java中自带的类型,比如string、int等,大概率都是自定义类型,
//此处的WSContext肯定是自定义类型,所以必须在这里赋值class类型,因为Axis不知道WSContext是什么类型
call.setReturnClass(WSContext.class);

假如是 type=“xsd:string,则对应Axis客户端代码就是:

//xsd属于xml自带标签,进入org.apache.axis.Constants.XSD_STRING的源码可以看见其值就是xsd:string
call.setReturnType(org.apache.axis.Constants.XSD_STRING);

targetNamespace

webserivce的名称空间,一般与方法名拼接一起使用,axis代码使用如下:

call.setOperationName(new QName("名称空间", "方法名"));

注意:targetNamespace不是必须与方法名拼接在一起进行axis客户端调用,要看 wsdl:message 标签的方法中是否有前缀

比如下面:方法ResponseRequest 中都有前缀ns0,而ns0的值恰好与targetNamespace一致,所以上面的:

new QName("名称空间", "方法名")

就没问题了

image-20231130142402388

但是本wsdl示例文档的 wsdl:message 标签方法无前缀,比如下图的logout方法:

image-20231130142727160

则axis代码就可以直接写一个方法名:

call.setOperationName(new QName( "logout"));

wsdl:message标签

详解

方法标签,对应发布webservice的接口方法,其中

  • xxxResponse代表接口方法的返回
  • xxxRequest或者直接xxx方法名代表接口方法的接收

比如本文的wsdl示例文档中的:

image-20231130145939604

正对应其5个方法:

image-20231130150011335

wsdl:message标签的内容,正对应请求参数返回值参数

image-20231130150134589

  • 请求参数对应上图request中的5个
  • 返回参数对应上图的tns1:WSContext,也就是下面wsdl:types标签中的类型定义,是5个小类型的合体

image-20231130150331758

axis调用

1.这里对应本文wsdl示例axis代码调用如下,因为对应方法名的loginRequest、loginResponse没有前缀修饰:

call.setOperationName(new QName( "login"));

2.但如果是下面这种,就必须有前缀对应的QName拼接:

image-20231130151008337

call.setOperationName(new QName("tns在<wsdl:definitions>内定义的值","方法名emeService"));

wsdl:definitions中的tns展示,大部分tns与名称空间targetNamespace相同

image-20231130151218903


wsdl:types标签

详解1

声明在其他标签中要使用的元素类型,比如接口方法参数类型、返回值类型

比如本文档示例的wsdl中,wsdl:types标签内容如下,其实就是定义了接口方法的参数类型:

<wsdl:types>
        <schema
            xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:client">
            <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
            <complexType name="WSContext">
                <sequence>
                    <element name="dbType" type="xsd:int"/>
                    <element name="dcName" nillable="true" type="xsd:string"/>
                    <element name="password" nillable="true" type="xsd:string"/>
                    <element name="sessionId" nillable="true" type="xsd:string"/>
                    <element name="slnName" nillable="true" type="xsd:string"/>
                    <element name="userName" nillable="true" type="xsd:string"/>
                </sequence>
            </complexType>
        </schema>
</wsdl:types>

其中,complexType为一个复合类型,它包含的具体小类型在sequence标签的element中,当我们调用

<wsdl:message name="loginRequest">

的方法时,返回的结果格式如下,其实就是返回了WSContext类,这个类包含了其他5个字符串和整数的属性

image-20231130144135318

axis调用1

结合最上面wsdl示例的message

请求:

<wsdl:message name="loginRequest">
	<wsdl:part name="userName" type="xsd:string"> </wsdl:part>
	<wsdl:part name="password" type="xsd:string"> </wsdl:part>
	<wsdl:part name="slnName" type="xsd:string"> </wsdl:part>
	<wsdl:part name="dcName" type="xsd:string"> </wsdl:part>
	<wsdl:part name="language" type="xsd:string"> </wsdl:part>
	<wsdl:part name="dbType" type="xsd:int"> </wsdl:part>
</wsdl:message>

响应:

<wsdl:message name="loginByLtpaTokenResponse">
	<wsdl:part name="loginByLtpaTokenReturn" type="tns1:WSContext"> </wsdl:part>
</wsdl:message>

wsdl:types标签对应的调用代码如下

注意:请求参数需要写参数名,设置返回值时不用写返回值名

请求

call.addParameter("userName", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("password", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("slnName", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("dcName", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("language", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("dbType", XMLType.XSD_INT, ParameterMode.IN);

响应:

//设置wsdl中返回值类型及其修饰标签
call.setReturnType(new QName("urn:client", "WSContext"));
//因为返回值类型为WSContext,不是基本类型,所以必须设置其calss类,否则报错
call.setReturnClass(WSContext.class);

这个响应的返回值类型,推荐由Axis的命令直接生成,内部构成比较复杂

image-20231130161340243


详解2

在举一个不同格式的例子

下面这种格式的wsdl:types标签,与上面大同小异,意思就是:

wsdl:types中,定义了**emeService方法 ** 的

  • 请求参数类型String名称arg0
  • 返回值类型String名称return

image-20231130145235021

结果证明:

image-20231130145546259

axis调用2

上面的返回值名字为return,类型为xs:string

注意:axis设置请求参数时需要写参数名,而设置返回值时不用写返回值名

xs:stringaxis中可以用代码XMLType.XSD_STRING标识,java基本类型都可以用XMLType表示

call.setReturnType(XMLType.XSD_STRING);

wsdl:portType标签

表达了发布webservice接口的代码结构

以本文wsdl文档示例为例:

  • wsdl:portTypename的值:一般对应发布webservice的接口名。
  • wsdl:operationname的值:对应webservice接口的方法名,parameterOrder为方法参数名。
  • wsdl:inputwsdl:output:对应了输入输出,即接口方法请求与返回message定义,可以根据其name名字去wsdl:message标签找对应的方法定义。

image-20231130152757638


wsdl:binding与wsdl:service标签

好像不涉及Axis代码调用需要编写的部分,暂时没有仔细分析

  • Binding - 特定端口类型的具体协议和数据格式规范的绑定。
  • Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
  • Service- 相关服务访问点的集合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/642936.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DSVPN综合实验

DSVPN综合实验 一.实验拓扑 二.实验要求 1&#xff0c;R5为ISP&#xff0c;&#xff0c;只能进行IP地址配置;其所有地址均配为公有IP地址 2&#xff0c;R1和R5间使用ppp的PAP认证&#xff0c;R5为主认证方; R2于R5之间使用ppp的chap认证&#xff0c;R5为主认证方&#xff0c;…

python web自动化(Allure报告)

Allure详细安装请看之前的博客 1.Allure配置与⼊⻔ 运⾏⽤例&#xff0c;⽣成allure报告 pip install allure-pytest -i https://mirrors.aliyun.com/pypi/simple/ 运⾏⽤例&#xff0c;⽣成allure报告 # main.py import os import pytest if __name__ __m…

Softing工业推出新品edgeGate:一款用于工业边缘和云应用的硬件网关

2024年4月17日&#xff08;哈尔&#xff09;&#xff0c;Softing工业自动化在2024年汉诺威工业博览会上首次展示了新品edgeGate。该产品是一个无需维护的硬件物联网网关解决方案&#xff0c;可将生产数据从PLC和数控机床控制器传输至工业边缘及物联网云平台。 &#xff08;edge…

plt多子图设置

import matplotlib.pyplot as plt# 使用 subplots 函数创建一个 2x3 的子图网格 fig, axs plt.subplots(nrows2, ncols3, figsize(16, 10)) # 调整 figsize 来改变图像大小# 遍历每个子图&#xff0c;并绘制一些内容&#xff08;这里只是简单的示例&#xff09; for ax in ax…

【Python搞定车载自动化测试】——Python实现CAN总线Bootloader刷写(含Python源码)

系列文章目录 【Python搞定车载自动化测试】系列文章目录汇总 文章目录 系列文章目录&#x1f4af;&#x1f4af;&#x1f4af; 前言&#x1f4af;&#x1f4af;&#x1f4af;一、环境搭建1.软件环境2.硬件环境 二、目录结构三、源码展示1.诊断基础函数方法2.诊断业务函数方法…

探索Python技巧:零基础学习缩进与逻辑关系

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、理解Python的缩进语法 缩进规则详解 二、缩进在逻辑关系中的应用 逻辑块示例 三、实…

【LSTM】LSTM cell的门结构学习笔记

文章目录 1. LSTM cell2. 门结构3. 门的公式4. 门的参数5. 重点关系厘清 1. LSTM cell 如文章 LSTM网络与参数学习笔记 中介绍, LSTM cell指的是一个包含隐藏层所有神经元的结构.但是LSTM门控单元的公式如何理解、门和LSTM cell神经元如何对应、门函数的参数维度、不同时间步不…

工作中的相关问题

最近属于各方面繁杂事务较多&#xff0c;所以相关问题也较为分散&#xff0c;没有细致联系&#xff0c;仅为一个自我小总结&#xff0c;序号并无相关学习顺序&#xff0c;未全的点后续补充 参考链接&#xff1a;5分钟带你深入浅出搞懂 Nginx | 二哥的Java进阶之路 (javabetter…

【NumPy】NumPy实战入门:线性代数(dot、linalg)与随机数(numpy.random)详解

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

MySQL库/表/数据的操作

文章目录 1.数据库操作1.1 创建、删除、查看和修改1.2 编码格式1.3 备份和恢复 2.表的操作2.1 创建表2.2 存储引擎2.3 查看表、修改表、删除表 3.数据类型3.1整数类型3.2字节类型(bit)3.3浮点类型(bit)3.4 decimal3.5 字符串类型3.6 日期和时间类型3.7 enum和set关于如何查找想…

多线程事务

一、业务场景 我们在工作中经常会到往数据库里插入大量数据的工作&#xff0c;但是既需要保证数据的一致性&#xff0c;又要保证程序执行的效率。因此需要在多线程中使用事务&#xff0c;这样既可以保证数据的一致性&#xff0c;又能保证程序的执行效率。但是spring自带的Trans…

【一个糟糕的词:省流】

今日思考&#xff0c;博主分享&#x1f4dd;&#xff0c;原文如下&#xff0c; 我最近听到了一个特别糟糕的词叫省流。我甚至认为这个词可以用来衡量一个人的智商啊&#xff0c;我们可以把一个知识简单的分成三部分问题&#xff0c;答案思维方式就是这个答案是怎么推导出来的啊…

【FPGA】VGA显示文字、彩条、图片——基于DE2-115

文章目录 前言一、VGA概述1.1 简述1.2 管脚定义1.3 VGA显示原理1.4 VGA时序标准1.5 VGA 显示模式及相关参数 二、VGA显示自定义的汉字字符2.1 点阵汉字生成2.2 生成BMP文件2.3 生成txt文件2.4 实现效果 三、VGA显示条纹3.1 实现流程3.2 实现效果 四、VGA输出一幅彩色图像4.1 bm…

代码随想录——找树左下角的值(Leetcode513)

题目链接 层序遍历 思路&#xff1a;使用层序遍历&#xff0c;记录每一行 i 0 的元素&#xff0c;就可以找到树左下角的值 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}*…

基于SSH的母婴用品销售管理系统带万字文档

文章目录 母婴商城系统一、项目演示二、项目介绍三、系统部分功能截图四、万字论文参考五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 母婴商城系统 一、项目演示 母婴商城系统 二、项目介绍 基于SSH的母婴商城系统 系统…

了解K8s集群kubectl命令进行陈述式资源管理

前言 在 Kubernetes 集群中&#xff0c;通过陈述式和声明式资源管理是确保应用程序高效运行的关键。认识这两种管理方法&#xff0c;能够更好地掌握 Kubernetes 集群的运维和管理。 目录 一、K8s 资源管理操作分类 1. 陈述式 2. 声明式 3. K8s 集群管理常用命令概览 二…

lenovo联想小新Pro 16 APH8 2023款(83AR)笔记本电脑原装出厂Windows11系统镜像安装包下载

恢复出厂开箱状态OEM预装win11系统&#xff0c;自带恢复重置初始化还原功能 下载链接&#xff1a;https://pan.baidu.com/s/1n_mPM4ZrLPrmXpCTukuyCQ?pwdmnwj 提取码&#xff1a;mnwj 联想原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、Office办公软件、联想…

C++成员函数 - 析构函数

析构函数 析构函数 是特殊的成员函数&#xff0c;其 特征 如下&#xff1a; 1. 析构函数名是在类名前加上字符 ~ 。 2. 无参数无返回值类型。 3. 一个类只能有一个析构函数。若未显式定义&#xff0c;系统会自动生成默认的析构函数。注意&#xff1a;析构函数不能重 载 …

OpenHarmony 实战开发——一文总结ACE代码框架

一、前言 ACE_Engine框架是OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;的UI开发框架&#xff0c;为开发者提供在进行应用UI开发时所必需的各种组件&#xff0c;以及定义这些组件的属性、样式、事件及方法&#xff0c;通过这些组件可以方便进行OpenHarmo…

AI大模型探索之路-基础篇5:GLM-4解锁国产大模型的全能智慧与创新应用

目录 前言一、GLM4大模型总体概述二、GLM4和GPT4功能对比三、GLM4和GPT4性能对比1、基础能力&#xff08;英文&#xff09;2、指令跟随能力3、对齐能力4、长文本能力5、多模态-文生图 四、GLM-4 ALL Tools1、文生图2、代码解释器3、网页浏览4、Function Call5、多工具自动调用 …