相关历史文章(阅读本文之前,您可能需要先看下之前的系列)
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:河北 唐山 河北移动全球通卡
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。
à悟空学院: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
相关推荐
创建soap消息的多种方式以及WSDL举例代码
php实现soap服务快速生成wsdl的完整代码,包括客户端测试。前提是php支持soap扩展,soap的配置在此不涉及。 特别注意的一点是:soap服务端源码在 <?php ... ?> 之外不允许有任何空格或空行。
最大的变化是将其分为一个WSDL(仅作为SOAP接口)和一堆相互导入的XSD。 那应该代表一个更复杂的领域,尽管它们没有包含太多定义,但我可以更好地展示许多相关技术,这些技术通常出现在现实世界中。 因此,该示例...
SOAP协议简介 WSDL简介 对WSDL文件的每个节点的含意与功能都做了说明并带有一个客户与服务器的开发说明 该文档还讲到wsgen与wsimport命令说明与使用
soapui测试工具调用wsdl生成方式
SOAP协议请求与分析 主要为封装SOAP消息包请求服务器接受发回的数据包来分析的一个简单的程序
对wsdl的格式进行分析,主要讲解soap服务中rpc和doucumnet的不同之处。
springboot调用webservice接口的两种方式,不使用axis
webservice soap wsdl详解
以前做java的初步理解了下android,为配合android实现所以实现了几个接口,此包是打包demo,包括3个项目,1个是安卓客户端,实现登录和手机归属地查询。实现了3个接口服务,1个接口服务端提供登录是用的传统...
基于契约优先的soap+wsdl开发小功能
由Spring Boot和Apache CXF支持的企业和生产就绪的SOAP Web服务 功能包括: 使用WSDL / XSD中的JAX-B生成所有必要的Java类(使用补充的Maven插件 使用100%纯Java配置在Spring Context中启动Apache CXF 端点初始...
通过示例说明document/literal、document/literal(wrapped)、rpc/encoded、rpc/literal样式的web服务对应的soap消息格式,对于理解webservice有很大好处,尤其是根据wsdl构造soap消息,非常有价值。
wsdl2java源码Apache CXF 是一个开源服务框架,可帮助使用前端编程 API(如 JAX-WS)构建和开发服务。 在本教程中,我们将了解如何将 CXF 与 Spring Boot 集成以构建和运行 Hello World SOAP 服务。 在整个示例中,...
详细描述WebService中SOAP协议的规范,以及WSDL文件所需要包含的要素
内有axis1.4jar包以及使用eclipse和axis1.4 将WSDL和服务端代码互转方法 亲测可用
SOAP and WSDL,介绍SOAP和WSDL的技术以及区别
Web Service,SOAP,XML,WSDL,WCF综合介绍
对于WebServers的通信协议,根据客户提供的WSDL文件生成接口文件,免去到客户现场连内网下载的时间。亲测可用。C# VB.NET可用