相關歷史文章(閱讀本文之前,您可能需要先看下之前的系列)
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 />
</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 />
</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:河北 唐山 河北移動全球通卡
我就是我,是顏色不一樣的煙火。
我就是我,是與眾不同的小蘋果。
à悟空學院:http://t.cn/Rg3fKJD
學院中有Spring Boot相關的課程!點擊「閱讀原文」進行查看!
SpringBoot視頻:http://t.cn/R3QepWG
Spring Cloud視頻:http://t.cn/R3QeRZc
SpringBoot Shiro視頻:http://t.cn/R3QDMbh
SpringBoot交流平台:http://t.cn/R3QDhU0
SpringData和JPA視頻:http://t.cn/R1pSojf
SpringSecurity5.0視頻:http://t.cn/EwlLjHh
Sharding-JDBC分庫分表實戰:http://t.cn/E4lpD6e
