`

Spring Boot SOAP系列之WSDL是什么“Lese”

阅读更多

相关历史文章(阅读本文之前,您可能需要先看下之前的系列

WebService SOAP概述 - 第275篇

WSDL是什么“Lese” - 第276篇

Spring boot webservice怎么玩? - 第277篇

Spring boot cxf构建webservice服务 - 第278篇

Spring boot cxf调用webservice服务 - 第279篇

 

一、前言

       在前面的小节中已经成功发布了web service服务,这一节看看怎么调用。

 

二、WebService调用方式

       对于WebService的调用,有如下几种方式:

(1)使用CXF.JaxWsDynamicClientFactory的client动态调用。

(2)利用axis2的RPC方式调用webservice。

(3)利用HttpClient调用webservice。

(4)通过javax.xml.ws.Service的方式调用WebService

       在这里我们使用方式一进行讲解说明。

 

二、调用Hello CXF服务

       这里可以在新建一个项目,也可以在原有的项目直接调用:

import java.lang.reflect.Method;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

public class CXFClientTest {
    //动态调用
    public static void main(String[] args) throws Exception {
        JaxWsDynamicClientFactory dcflient = JaxWsDynamicClientFactory.newInstance();

        Client client=dcflient.createClient("http://127.0.0.1:8080/cxf/helloService?wsdl");

        // 需要密码的情况需要加上用户名和密码
        Object[] objects=client.invoke("sayHello","悟纤");
        for(Object obj:objects) {
            System.out.println(obj);
        }

}
 

       调用成功,控制台打印:hello , 悟纤

BTW:调用的核心就是地址、方法、参数,调用本身是很简单的一个事情。

 

三、调用查询手机号归属地服务

       要调用服务,要知道WSDL文档的地址:

http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

       访问WSDL文档地址,可以得到如下的格式:

<wsdl:definitions
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
    xmlns:tns="http://WebXml.com.cn/"
    xmlns:s="http://www.w3.org/2001/XMLSchema"
    xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
    xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="http://WebXml.com.cn/">
    <wsdl:documentation
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        <a href="http://www.webxml.com.cn/" target="_blank">WebXml.com.cn</a>
        <strong>国内手机号码归属地查询WEB服务</strong>
        ,提供最新的国内手机号码段归属地数据,每月更新。
        <br />
        使用本站 WEB 服务请注明或链接本站:
        <a href="http://www.webxml.com.cn/" target="_blank">http://www.webxml.com.cn/</a>
        感谢大家的支持!
        <br />&nbsp;
    </wsdl:documentation>
    <wsdl:types>
        <s:schema elementFormDefault="qualified"
            targetNamespace="http://WebXml.com.cn/">
            <s:element name="getMobileCodeInfo">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="0" maxOccurs="1" name="mobileCode"
                            type="s:string" />
                        <s:element minOccurs="0" maxOccurs="1" name="userID"
                            type="s:string" />
                    </s:sequence>
                </s:complexType>
            </s:element>
            <s:element name="getMobileCodeInfoResponse">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="0" maxOccurs="1"
                            name="getMobileCodeInfoResult" type="s:string" />
                    </s:sequence>
                </s:complexType>
            </s:element>
            <s:element name="getDatabaseInfo">
                <s:complexType />
            </s:element>
            <s:element name="getDatabaseInfoResponse">
                <s:complexType>
                    <s:sequence>
                        <s:element minOccurs="0" maxOccurs="1"
                            name="getDatabaseInfoResult" type="tns:ArrayOfString" />
                    </s:sequence>
                </s:complexType>
            </s:element>
            <s:complexType name="ArrayOfString">
                <s:sequence>
                    <s:element minOccurs="0" maxOccurs="unbounded"
                        name="string" nillable="true" type="s:string" />
                </s:sequence>
            </s:complexType>
            <s:element name="string" nillable="true" type="s:string" />
            <s:element name="ArrayOfString" nillable="true"
                type="tns:ArrayOfString" />
        </s:schema>
    </wsdl:types>
    <wsdl:message name="getMobileCodeInfoSoapIn">
        <wsdl:part name="parameters" element="tns:getMobileCodeInfo" />
    </wsdl:message>
    <wsdl:message name="getMobileCodeInfoSoapOut">
        <wsdl:part name="parameters"
            element="tns:getMobileCodeInfoResponse" />
    </wsdl:message>
    <wsdl:message name="getDatabaseInfoSoapIn">
        <wsdl:part name="parameters" element="tns:getDatabaseInfo" />
    </wsdl:message>
    <wsdl:message name="getDatabaseInfoSoapOut">
        <wsdl:part name="parameters"
            element="tns:getDatabaseInfoResponse" />
    </wsdl:message>
    <wsdl:message name="getMobileCodeInfoHttpGetIn">
        <wsdl:part name="mobileCode" type="s:string" />
        <wsdl:part name="userID" type="s:string" />
    </wsdl:message>
    <wsdl:message name="getMobileCodeInfoHttpGetOut">
        <wsdl:part name="Body" element="tns:string" />
    </wsdl:message>
    <wsdl:message name="getDatabaseInfoHttpGetIn" />
    <wsdl:message name="getDatabaseInfoHttpGetOut">
        <wsdl:part name="Body" element="tns:ArrayOfString" />
    </wsdl:message>
    <wsdl:message name="getMobileCodeInfoHttpPostIn">
        <wsdl:part name="mobileCode" type="s:string" />
        <wsdl:part name="userID" type="s:string" />
    </wsdl:message>
    <wsdl:message name="getMobileCodeInfoHttpPostOut">
        <wsdl:part name="Body" element="tns:string" />
    </wsdl:message>
    <wsdl:message name="getDatabaseInfoHttpPostIn" />
    <wsdl:message name="getDatabaseInfoHttpPostOut">
        <wsdl:part name="Body" element="tns:ArrayOfString" />
    </wsdl:message>
    <wsdl:portType name="MobileCodeWSSoap">
        <wsdl:operation name="getMobileCodeInfo">
            <wsdl:documentation
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
                <br />
                <h3>获得国内手机号码归属地省份、地区和手机卡类型信息</h3>
                <p>输入参数:mobileCode = 字符串(手机号码,最少前7位数字),userID = 字符串(商业用户ID)
                    免费用户为空字符串;返回数据:字符串(手机号码:省份 城市 手机卡类型)。</p>
                <br />
            </wsdl:documentation>
            <wsdl:input message="tns:getMobileCodeInfoSoapIn" />
            <wsdl:output message="tns:getMobileCodeInfoSoapOut" />
        </wsdl:operation>
        <wsdl:operation name="getDatabaseInfo">
            <wsdl:documentation
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
                <br />
                <h3>获得国内手机号码归属地数据库信息</h3>
                <p>输入参数:无;返回数据:一维字符串数组(省份 城市 记录数量)。</p>
                <br />
            </wsdl:documentation>
            <wsdl:input message="tns:getDatabaseInfoSoapIn" />
            <wsdl:output message="tns:getDatabaseInfoSoapOut" />
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:portType name="MobileCodeWSHttpGet">
        <wsdl:operation name="getMobileCodeInfo">
            <wsdl:documentation
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
                <br />
                <h3>获得国内手机号码归属地省份、地区和手机卡类型信息</h3>
                <p>输入参数:mobileCode = 字符串(手机号码,最少前7位数字),userID = 字符串(商业用户ID)
                    免费用户为空字符串;返回数据:字符串(手机号码:省份 城市 手机卡类型)。</p>
                <br />
            </wsdl:documentation>
            <wsdl:input message="tns:getMobileCodeInfoHttpGetIn" />
            <wsdl:output message="tns:getMobileCodeInfoHttpGetOut" />
        </wsdl:operation>
        <wsdl:operation name="getDatabaseInfo">
            <wsdl:documentation
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
                <br />
                <h3>获得国内手机号码归属地数据库信息</h3>
                <p>输入参数:无;返回数据:一维字符串数组(省份 城市 记录数量)。</p>
                <br />
            </wsdl:documentation>
            <wsdl:input message="tns:getDatabaseInfoHttpGetIn" />
            <wsdl:output message="tns:getDatabaseInfoHttpGetOut" />
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:portType name="MobileCodeWSHttpPost">
        <wsdl:operation name="getMobileCodeInfo">
            <wsdl:documentation
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
                <br />
                <h3>获得国内手机号码归属地省份、地区和手机卡类型信息</h3>
                <p>输入参数:mobileCode = 字符串(手机号码,最少前7位数字),userID = 字符串(商业用户ID)
                    免费用户为空字符串;返回数据:字符串(手机号码:省份 城市 手机卡类型)。</p>
                <br />
            </wsdl:documentation>
            <wsdl:input message="tns:getMobileCodeInfoHttpPostIn" />
            <wsdl:output message="tns:getMobileCodeInfoHttpPostOut" />
        </wsdl:operation>
        <wsdl:operation name="getDatabaseInfo">
            <wsdl:documentation
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
                <br />
                <h3>获得国内手机号码归属地数据库信息</h3>
                <p>输入参数:无;返回数据:一维字符串数组(省份 城市 记录数量)。</p>
                <br />
            </wsdl:documentation>
            <wsdl:input message="tns:getDatabaseInfoHttpPostIn" />
            <wsdl:output message="tns:getDatabaseInfoHttpPostOut" />
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="MobileCodeWSSoap"
        type="tns:MobileCodeWSSoap">
        <soap:binding
            transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="getMobileCodeInfo">
            <soap:operation
                soapAction="http://WebXml.com.cn/getMobileCodeInfo" style="document" />
            <wsdl:input>
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="getDatabaseInfo">
            <soap:operation
                soapAction="http://WebXml.com.cn/getDatabaseInfo" style="document" />
            <wsdl:input>
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="MobileCodeWSSoap12"
        type="tns:MobileCodeWSSoap">
        <soap12:binding
            transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="getMobileCodeInfo">
            <soap12:operation
                soapAction="http://WebXml.com.cn/getMobileCodeInfo" style="document" />
            <wsdl:input>
                <soap12:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="getDatabaseInfo">
            <soap12:operation
                soapAction="http://WebXml.com.cn/getDatabaseInfo" style="document" />
            <wsdl:input>
                <soap12:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="MobileCodeWSHttpGet"
        type="tns:MobileCodeWSHttpGet">
        <http:binding verb="GET" />
        <wsdl:operation name="getMobileCodeInfo">
            <http:operation location="/getMobileCodeInfo" />
            <wsdl:input>
                <http:urlEncoded />
            </wsdl:input>
            <wsdl:output>
                <mime:mimeXml part="Body" />
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="getDatabaseInfo">
            <http:operation location="/getDatabaseInfo" />
            <wsdl:input>
                <http:urlEncoded />
            </wsdl:input>
            <wsdl:output>
                <mime:mimeXml part="Body" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="MobileCodeWSHttpPost"
        type="tns:MobileCodeWSHttpPost">
        <http:binding verb="POST" />
        <wsdl:operation name="getMobileCodeInfo">
            <http:operation location="/getMobileCodeInfo" />
            <wsdl:input>
                <mime:content type="application/x-www-form-urlencoded" />
            </wsdl:input>
            <wsdl:output>
                <mime:mimeXml part="Body" />
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="getDatabaseInfo">
            <http:operation location="/getDatabaseInfo" />
            <wsdl:input>
                <mime:content type="application/x-www-form-urlencoded" />
            </wsdl:input>
            <wsdl:output>
                <mime:mimeXml part="Body" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="MobileCodeWS">
        <wsdl:documentation
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
            <a href="http://www.webxml.com.cn/" target="_blank">WebXml.com.cn</a>
            <strong>国内手机号码归属地查询WEB服务</strong>
            ,提供最新的国内手机号码段归属地数据,每月更新。
            <br />
            使用本站 WEB 服务请注明或链接本站:
            <a href="http://www.webxml.com.cn/" target="_blank">http://www.webxml.com.cn/</a>
            感谢大家的支持!
            <br />&nbsp;
        </wsdl:documentation>
        <wsdl:port name="MobileCodeWSSoap"
            binding="tns:MobileCodeWSSoap">
            <soap:address
                location="http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx" />
        </wsdl:port>
        <wsdl:port name="MobileCodeWSSoap12"
            binding="tns:MobileCodeWSSoap12">
            <soap12:address
                location="http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx" />
        </wsdl:port>
        <wsdl:port name="MobileCodeWSHttpGet"
            binding="tns:MobileCodeWSHttpGet">
            <http:address
                location="http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx" />
        </wsdl:port>
        <wsdl:port name="MobileCodeWSHttpPost"
            binding="tns:MobileCodeWSHttpPost">
            <http:address
                location="http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>
 

       可以自己用浏览器打开访问一下;

       一眼望去,可能接口看起来很复杂,较为繁琐。  但是作为开发人员,使用的时候,  我们可以查看关注点信息,就能实现接口的调用了。

       那么我们需要了解哪些信息呢?

       从上面的文档里面,我们需要从头部(最上面一行)了解到:

targetNamespace="http://WebXml.com.cn/"

       通过wsdl:portType可以该文档提供了如下方法:

getMobileCodeInfo:获得国内手机号码归属地省份、地区和手机卡类型信息。

getDatabaseInfo:获得国内手机号码归属地数据库信息。

       通过types就能找到getMobileCodeInfo需要传递的参数:

<s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="mobileCode"
        type="s:string" />
    <s:element minOccurs="0" maxOccurs="1" name="userID"
        type="s:string" />
</s:sequence>
 

       需要两个参数:

mobileCode:手机号码,最少前7位数字

userID:商业用户ID) 免费用户为空字符串

       通过service找到请求地址:

http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx

       综上分析就可以得出,发起SOAP请求所需要的数据了:

WebService的URL:http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx
Namespace:http://WebXml.com.cn/
method:getMobileCodeInfo/getDatabaseInfo
params:mobileCode(必须)、userId(非必须)

 

       这时候得到这些信息之后,就可以编写代码进行调用了:

package com.kfit.demo;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

public class CXFClientForMobileCodeTest {
    //动态调用
    public static void main(String[] args) throws Exception {
        JaxWsDynamicClientFactory dcflient = JaxWsDynamicClientFactory.newInstance();

        Client client=dcflient.createClient("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");

        Object[] objects=client.invoke("getMobileCodeInfo","1593258xxxx","");
        for(Object obj:objects) {
            System.out.println(obj);
        }
    }

}
 

       调用成功之后,控制台返回:1593258xxxx:河北 唐山 河北移动全球通卡

 

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

 à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战http://t.cn/A6ZarrqS

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics