WebService 之 WSDL文件 讲解
- 格式:docx
- 大小:73.81 KB
- 文档页数:15
wsdl文件用法WSDL(Web Services Description Language)是一种用于描述Web 服务的XML语言。
WSDL文件用于定义如何访问和使用特定的Web服务。
它包含了Web服务的详细信息,包括服务地址、可用的操作、操作所需的参数、操作返回的数据类型等。
WSDL文件是从服务端生成的,客户端可以通过解析WSDL文件来了解和使用该Web服务。
以下是WSDL文件的用法和功能的一些详细解释。
1. 描述服务:WSDL文件描述了一个Web服务的所有相关信息。
它指定了服务的名称、命名空间、服务的端口、地址和可用的操作。
2. 定义操作:WSDL文件定义了Web服务可用的操作,并指定了每个操作的名称、输入参数和输出结果。
操作的输入和输出可以是简单的数据类型,也可以是复杂的结构体或对象。
3.指定数据类型:WSDL文件可以定义自定义的数据类型,包括简单类型(如整数、字符串等)和复杂类型(如结构体、数组等)。
4.生成客户端代码:通过解析WSDL文件,客户端可以自动生成与服务进行通信所需的代码。
客户端可以根据WSDL文件中定义的操作和数据类型生成对应的函数调用和相关数据结构。
5.交互规范:WSDL文件规定了客户端与服务端之间的通信协议和消息格式。
它指定了使用哪种协议(如SOAP、HTTP等)来发送请求和接收响应,并定义了请求和响应的消息结构和格式。
6. 发现服务:WSDL文件可以作为服务目录的一部分,提供给其他开发人员用于发现和了解可用的Web服务。
其他人员可以通过查看WSDL文件来了解服务的功能和使用方式。
7. 服务的版本控制:WSDL文件可以将一个Web服务的不同版本进行区分。
通过在WSDL文件中指定版本号,客户端可以选择使用特定版本的服务。
8. 修改服务:当Web服务的接口发生变化时,需要更新对应的WSDL文件。
客户端可以根据新的WSDL文件生成新的代码,以便与更新后的服务进行交互。
10.跨平台和跨语言支持:WSDL文件是基于XML的,具有良好的可扩展性和互操作性。
wsdl文件结构分析WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似远程过程调用)。
WSDL首先对访问的操作和访问时使用的请求/响应消息进行抽象描述,然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署的服务访问点。
相关的具体部署的服务访问点通过组合就成为抽象的Web服务。
本文将详细讲解WSDL文档的结构,并分析每个元素的作用。
一:WSDL定义WSDL是一个用于精确描述Web服务的文档,WSDL文档是一个遵循WSDL XML模式的XML文档。
WSDL 文档将Web服务定义为服务访问点或端口的集合。
在 WSDL 中,由于服务访问点和消息的抽象定义已从具体的服务部署或数据格式绑定中分离出来,因此可以对抽象定义进行再次使用:消息,指对交换数据的抽象描述;而端口类型,指操作的抽象集合。
用于特定端口类型的具体协议和数据格式规范构成了可以再次使用的绑定。
将Web访问地址与可再次使用的绑定相关联,可以定义一个端口,而端口的集合则定义为服务。
一个WSDL文档通常包含7个重要的元素,即types、import、message、portType、operation、binding、 service元素。
这些元素嵌套在definitions 元素中,definitions是WSDL文档的根元素。
文章的下一部分将会详细介绍WSDL 的基本结构。
二:WSDL的基本结构--概述如第一部分最后描述的那样,一个基本的WSDL文档包含7个重要的元素。
下面将分别介绍这几个元素以及他们的作用。
WSDL 文档在Web服务的定义中使用下列元素:· Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。
webservice接⼝通过wsdl获取请求报⽂格式,xmlhttprequest调⽤wsdl接⼝若对⽅提供了⼀个wsdl路径,如何根据该wsdl获取请求报⽂格式,并通过xmlhttprequest调⽤接⼝呢,操作分为两步具体如下:1、通过soapUI⼯具关联对⽅提供的wsdl⽣成请求报⽂格式2、xmlhttprequest 请求wsdl接⼝</head><body>流程id:<input id="procInstId"><button onclick="getOne();"> 获取单个信息</button><button onclick="selectAll();"> 获取所有信息</button></body><script type="text/javascript" src="dispose_apply.json"></script> <script type="text/javascript">var request;function getOne(){request = getRequest();request = getRequest();if(request!=null){// 封裝数据var data = getDisposeData();// 调⽤接⼝doWebservice('http://127.0.0.1/demo/service/flowService','getOne','/','<arg0>'+data+'</arg0>');}}function selectAll(){request = getRequest();if(request!=null){// 封裝数据var data = getDisposeData();// 调⽤接⼝doWebservice('http://127.0.0.1/demo/service/ProcessService','selectAll','/','<json>'+data+'</json>'); }}function doWebservice(url,method,namespace,data){var xmldata = '<?xml version="1.0" encoding="utf-8"?>';xmldata += '<soap:Envelope xmlns:soap="/soap/envelope/">';xmldata += " <soap:Body>";xmldata += ' <ns2:'+method+' xmlns:ns2="'+namespace+'">';xmldata += data;xmldata += " </ns2:"+method+">";xmldata += " </soap:Body>";xmldata += "</soap:Envelope>";request.onreadystatechange = function(){if(request.readyState == 4 && request.status == 200){var domXML = request.responseXML;var result = domXML.getElementsByTagName("return")[0].innerHTML;alert('响应结果'+result);}}request.open('POST',url);request.send(xmldata);}// 共公⽤接⼝===参数封装function getDisposeData(){baseData.data = JSON.stringify(disposeData);var data = JSON.stringify(baseData);('请求参数获取'+data);return data;}// 共公⽤接⼝===创建XMLHttpRequestfunction getRequest(){var xmlHttp = null;if (window.XMLHttpRequest){// code for IE7, Firefox, Opera, etc.xmlHttp=new XMLHttpRequest();}else if (window.ActiveXObject){// code for IE6, IE5xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");}return xmlHttp;}</script>注意因为webservice 接⼝提供和html调⽤webservice是我两次分开写的demo 所以你看到的内容会有些不⼀致但调⽤过程的逻辑都是⼀样的。
java webservice调用方式及解析摘要:一、Java WebService简介二、Java WebService调用方式1.基于HTTP的调用2.基于SOAP的调用3.基于REST的调用三、Java WebService解析1.WSDL文件解析2.SOAP消息解析3.XML消息解析正文:一、Java WebService简介Java WebService是一种基于Java技术的Web服务,它允许不同平台、不同编程语言的应用程序相互通信。
Java WebService遵循JAX-WS(Java API for XML Web Services)规范,利用XML、SOAP、WSDL等技术来实现服务的发布、发现和调用。
二、Java WebService调用方式1.基于HTTP的调用基于HTTP的调用是指使用HTTP协议传输XML数据来进行WebService调用。
这种方式简单、易实现,但不够灵活。
优点是兼容性较好,可以跨平台、跨语言。
2.基于SOAP的调用基于SOAP(Simple Object Access Protocol)的调用是一种更复杂的WebService调用方式。
它使用XML文档来表示消息,并通过HTTP传输。
SOAP消息包含三个部分:Header、Body和Footer。
Header用于传递消息的元数据,如消息版本、编码方式等;Body是消息的主体,包含具体的方法调用和参数;Footer用于传递消息的额外信息。
3.基于REST的调用基于REST(Representational State Transfer)的调用是一种基于HTTP 协议的调用方式。
它将WebService暴露为一系列资源(Resource),并通过HTTP动词(GET、POST、PUT、DELETE)进行操作。
RESTful WebService 具有较好的可读性和实用性,易于理解和开发。
三、Java WebService解析1.WSDL文件解析WSDL(Web Services Description Language)文件是描述WebService接口和消息格式的一种XML文档。
wsdl调用方法WSDL是Web Services Description Language的缩写,它是一种XML格式的文件,用于描述web服务。
通过WSDL文件,我们可以了解web服务的功能、参数、返回值等基本信息,并且可以使用它来调用web服务中的方法。
本篇文章主要介绍如何通过WSDL 调用方法。
一、了解SOAP协议在了解WSDL调用方法之前,我们需要先了解SOAP协议。
SOAP 协议是一种基于XML的协议,用于在web服务之间进行通信。
SOAP消息通常是XML格式的,其中包含了请求方法、参数和返回值等信息。
在进行WSDL调用方法时,我们需要了解SOAP协议的基本知识,以便能够正确地构造SOAP消息。
二、获取WSDL文件在进行WSDL调用方法之前,我们需要获取目标web服务的WSDL文件。
一般情况下,我们可以通过在浏览器中输入web服务的地址来获取该服务的WSDL文件。
例如,如果我们要调用一个名为“HelloWorld”的web服务,我们可以在浏览器中输入“http://localhost:8080/HelloWorld?wsdl”来获取该服务的WSDL文件。
三、使用SOAPUI构造SOAP消息SOAPUI是一种开源的工具,用于测试和调试web服务。
在进行WSDL调用方法时,我们可以使用SOAPUI来构造SOAP消息。
下面是使用SOAPUI调用web服务的基本步骤:1.打开SOAPUI并创建一个新的SOAP项目;2.在SOAP项目中添加一个新的SOAP请求;3.在SOAP请求中输入目标web服务的地址,并指定要调用的方法;4.在SOAP请求中添加方法的参数;5.点击“发送”按钮,向web服务发送SOAP请求,并获取返回值。
四、使用Java代码调用web服务除了使用SOAPUI之外,我们还可以使用Java代码来调用web服务。
在进行WSDL调用方法时,我们可以使用Java中的JAX-WS API来调用web服务。
WEBSERVICE简介Web ServiceWeb Service是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行;它是一种新的we b 应用程序分支,是自包含、自描述、模块化的应用,可以发布、定位、通过web调用。
Web Service是一个应用组件,它逻辑性的为其他应用程序提供数据与服务.各应用程序通过网络协议和规定的一些标准数据格式(Http,XML,So ap)来访问Web Service,通过Web Service内部执行得到所需结果.Web Service可以执行从简单的请求到复杂商务处理的任何功能。
一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务。
技术和规则在构建和使用Web Service时,主要用到以下几个关键的技术和规则:1.XML:描述数据的标准方法.2.SOAP:表示信息交换的协议.3.WSDL:Web服务描述语言.4.UDDI(Universal Description, Discovery and Integration):通用描述、发现与集成,它是一种独立于平台的,基于XML语言的用于在互联网上描述商务的协议。
实际上,WebService的主要目标是跨平台的可互操作性。
为了达到这一目标,WebService完全基于XML(可扩展标记语言)、XSD(XMLSchema)等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。
由此可以看出,在以下三种情况下,使用WebService会带来极大的好处。
XML可扩展标记语言(Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
XML是标准通用标记语言(SG ML) 的子集,非常适合Web 传输。
XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
WebService接⼝的⼏种调⽤⽅式--wsdl⽂件类型⾸先⽐如查询到的⼀个wsdl⽂件内容如下:<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions targetNamespace="http://198.168.0.88:6888/ormrpc/services/EASLogin" xmlns:apachesoap="/xml-soap" xmlns:impl="http://198.168.0.88:6888/ormrpc/services/EASLogin" xmlns:intf="http://198.168.0.88:68 <!--WSDL created by Apache Axis version: 1.4Built on Apr 22, 2006 (06:55:48 PDT)--><wsdl:types><schema targetNamespace="urn:client" xmlns="/2001/XMLSchema"><import namespace="/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="logoutResponse"><wsdl:part name="logoutReturn" type="xsd:boolean"></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:part name="authPattern" 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="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="loginResponse2"><wsdl:part name="loginReturn" type="tns1:WSContext"></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: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="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="loginByLtpaTokenResponse"><wsdl:part name="loginByLtpaTokenReturn" type="tns1:WSContext"></wsdl:part></wsdl:message><wsdl:portType name="EASLoginProxy"><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="login" parameterOrder="userName password slnName dcName language dbType authPattern"> <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"><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="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="/soap/http"/><wsdl:operation name="logout"><wsdlsoap:operation soapAction=""/><wsdl:input name="logoutRequest"><wsdlsoap:body encodingStyle="/soap/encoding/" namespace="" use="encoded"/> </wsdl:input><wsdl:output name="logoutResponse"><wsdlsoap:body encodingStyle="/soap/encoding/" namespace="http://198.168.0.88:6888/ormrpc/services/EASLogin" use="encoded"/> </wsdl:output></wsdl:operation><wsdl:operation name="login"><wsdlsoap:operation soapAction=""/><wsdl:input name="loginRequest"><wsdlsoap:body encodingStyle="/soap/encoding/" namespace="" use="encoded"/> </wsdl:input><wsdl:output name="loginResponse"><wsdlsoap:body encodingStyle="/soap/encoding/" namespace="http://198.168.0.88:6888/ormrpc/services/EASLogin" use="encoded"/> </wsdl:output></wsdl:operation><wsdl:operation name="login"><wsdlsoap:operation soapAction=""/><wsdl:input name="loginRequest1"><wsdlsoap:body encodingStyle="/soap/encoding/" namespace="" use="encoded"/> </wsdl:input><wsdl:output name="loginResponse1"><wsdlsoap:body encodingStyle="/soap/encoding/" namespace="http://198.168.0.88:6888/ormrpc/services/EASLogin" use="encoded"/> </wsdl:output></wsdl:operation><wsdl:operation name="login"><wsdlsoap:operation soapAction=""/><wsdl:input name="loginRequest2"><wsdlsoap:body encodingStyle="/soap/encoding/" namespace="" use="encoded"/> </wsdl:input><wsdl:output name="loginResponse2"><wsdlsoap:body encodingStyle="/soap/encoding/" namespace="http://198.168.0.88:6888/ormrpc/services/EASLogin" use="encoded"/> </wsdl:output></wsdl:operation><wsdl:operation name="loginByLtpaToken"><wsdlsoap:operation soapAction=""/><wsdl:input name="loginByLtpaTokenRequest"><wsdlsoap:body encodingStyle="/soap/encoding/" namespace="" use="encoded"/> </wsdl:input><wsdl:output name="loginByLtpaTokenResponse"><wsdlsoap:body encodingStyle="/soap/encoding/" namespace="http://198.168.0.88:6888/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://198.168.0.88:6888/ormrpc/services/EASLogin"/></wsdl:port></wsdl:service></wsdl:definitions>⼀般有⼏种⽅式调⽤此接⼝:⽅式⼀:通过wsdl⽂件或者链接使⽤相关IDE软件⽣成Java⽂件这种⽅式⽐较累赘,不做推荐,使⽤IDE软甲即可完成⽅式⼆:使⽤apache的动态代理⽅式实现话不多说,直接上代码:import .URL;import space.QName;import org.apache.axis.client.Call;import org.apache.axis.client.Service;public class UsingDII {public static void main(String[] args) {try {int a = 100, b=60; // 对应的targetNamespaceString endPoint = "http://198.168.0.88:6888/ormrpc/services/EASLogin";Service service = new Service();Call call = (Call)service.createCall();call.setOperationName(new QName(endPoint,"EASLogin"));call.setTargetEndpointAddress(new URL(endPoint)); // a,b 调⽤此⽅法的参数String result = (String)call.invoke(new Object[]{new Integer(a),new Integer(b)});System.out.println("result is :"+result);} catch (Exception e) {e.printStackTrace();}}}⽅式三:使⽤Dynamic Proxy动态代理import .URL;import javax.xml.*;public class UsingDP {public static void main(String[] args) {try {int a = 100, b=60;String wsdlUrl = "http://198.168.0.88:6888/ormrpc/services/EASLogin?wsdl";String nameSpaceUri = "http://198.168.0.88:6888/ormrpc/services/EASLogin";String serviceName = "EASLoginProxyService";String portName = "EASLogin";ServiceFactory serviceFactory = ServiceFactory.newInstance();Service service = serviceFactory.createService(new URL(wsdlUrl),new QName(nameSpaceUri,serviceName)); // 返回值是⾃⼰封装的类AddFunctionServiceIntf adsIntf = (AddFunctionServiceIntf)service.getPort(new QName(nameSpaceUri,portName),AddFunctionServiceIntf.class); System.out.println("result is :"+adsIntf.addInt(a, b));} catch (Exception e) {e.printStackTrace();}}}⽅式四:使⽤httpclient⽅式参考:直接上代码:import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.util.List;import mons.httpclient.HttpClient;import mons.httpclient.methods.InputStreamRequestEntity;import mons.httpclient.methods.PostMethod;import mons.httpclient.methods.RequestEntity;import org.apache.log4j.Logger;import org.dom4j.Document;import org.dom4j.io.SAXReader;// 这⾥引得依赖包的话需要⾃⼰找了下⾯地址可以找到//https:///public static InputStream postXmlRequestInputStream(String requestUrl, String xmlData) throws IOException{PostMethod postMethod = new PostMethod(requestUrl);byte[] b = xmlData.getBytes("utf-8");InputStream is = new ByteArrayInputStream(b, 0, b.length);RequestEntity re = new InputStreamRequestEntity(is, b.length, "text/xml;charset=utf-8");postMethod.setRequestEntity(re);HttpClient httpClient = new HttpClient();httpClient.getParams().setAuthenticationPreemptive(true);httpClient.getHostConfiguration().setProxy(CommonPptsUtil.get("PROXY_HOST"), Integer.valueOf(CommonPptsUtil.get("PROXY_PORT")));int statusCode = httpClient.executeMethod(postMethod);logger.debug("responseCode:"+statusCode);if (statusCode != 200) {return null;}return postMethod.getResponseBodyAsStream();}public static void main(String[] args) {String reqJsonStr = "{\"workId\":\"20171018161622\",\"status\":\"201\",\"startTime\":\"2017-10-18 16:16:22\"}";String xmlData = "<soapenv:Envelope xmlns:soapenv=\"/soap/envelope/\" xmlns:ser=\"/\"><soapenv:Header/><soapenv:Body><ser:statusWriteBack><jsonString>" + "{\"workId\":\"314\",\"orderId\":\"5207675\",\"longitude\":\"104.068310\",\"latitude\":\"30.539503\",\"sendTime\":\"2019-08-13 08:38:45\",\"servicePerName\":\"于xx\",\"servicePerPhone\":\"184xxxx7680\"}"+ "</jsonString></ser:statusWriteBack></soapenv:Body></soapenv:Envelope>";String url = "http://xx.xxx.246.88:7103/avs/services/CCService?wsdl";SAXReader reader = new SAXReader();String result = "";try {InputStream in = postXmlRequestInputStream(url,xmlData);if(in!=null){Document doc = reader.read(in);result = doc.getRootElement().element("Body").element("statusWriteBackResponse").element("return").getText();logger.debug("result:"+result);}} catch (Exception e) {logger.error("error:",e);e.printStackTrace();}}}CommonPptsUtil://就是获取配置⽂件⾥的代理信息import mons.configuration.ConfigurationException;import mons.configuration.PropertiesConfiguration;import mons.configuration.reloading.FileChangedReloadingStrategy;import org.apache.log4j.Logger;/*** 通⽤属性⽂件⼯具类** @author y.c**/public class CommonPptsUtil {private static final Logger logger = Logger.getLogger(CommonPptsUtil.class);private static final String CONFIG_FILE = "common.properties";private static PropertiesConfiguration ppts;static {try {ppts = new PropertiesConfiguration(CONFIG_FILE);ppts.setReloadingStrategy(new FileChangedReloadingStrategy());} catch (ConfigurationException e) {logger.error("⽂件【common.properties】加载失败!");ppts = null;}}/*** 获取属性值** @param key* @return属性值*/public static String get(String key) {if (ppts == null) {return null;}return ppts.getString(key);}}⽅式五:使⽤CXF动态调⽤webservice接⼝代码如下:参考:package cxfClient;import org.apache.cxf.endpoint.Endpoint;import space.QName;import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;import org.apache.cxf.service.model.BindingInfo;import org.apache.cxf.service.model.BindingOperationInfo;public class CxfClient {public static void main(String[] args) throws Exception {String url = "http://localhost:9091/Service/SayHello?wsdl";String method = "say";Object[] parameters = new Object[]{"我是参数"};System.out.println(invokeRemoteMethod(url, method, parameters)[0]);}public static Object[] invokeRemoteMethod(String url, String operation, Object[] parameters){JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();if (!url.endsWith("wsdl")) {url += "?wsdl";}org.apache.cxf.endpoint.Client client = dcf.createClient(url);//处理webService接⼝和实现类namespace不同的情况,CXF动态客户端在处理此问题时,会报No operation was found with the name的异常Endpoint endpoint = client.getEndpoint();QName opName = new QName(endpoint.getService().getName().getNamespaceURI(),operation);BindingInfo bindingInfo= endpoint.getEndpointInfo().getBinding();if(bindingInfo.getOperation(opName) == null){for(BindingOperationInfo operationInfo : bindingInfo.getOperations()){if(operation.equals(operationInfo.getName().getLocalPart())){opName = operationInfo.getName();break;}}}Object[] res = null;try {res = client.invoke(opName, parameters); } catch (Exception e) {e.printStackTrace();}return res;}}。
浅淡Webservice、WSDL三种服务访问的⽅式(附案例)WebserviceWebservice是使应⽤程序以与平台和编程语⾔⽆关的⽅式进⾏相互通信技术。
eg:站点提供访问的数据接⼝:新浪微博、淘宝。
官⽅解释:它是⼀种构建应⽤程序的普遍模型,可以在任何⽀持⽹络通信的操作系统中实施运⾏;它是⼀种新的web应⽤程序分⽀,是⾃包含、⾃描述、模块化的应⽤,可以发布、定位、通过web调⽤。
WebService是⼀个应⽤组件,它逻辑性的为其他应⽤程序提供数据与服务.各应⽤程序通过⽹络协议和规定的⼀些标准数据格式(Http,XML,Soap)来访问WebService,通过WebService内部执⾏得到所需结果.Web Service可以执⾏从简单的请求到复杂商务处理的任何功能。
⼀旦部署以后,其他WebService应⽤程序可以发现并调⽤它部署的服务。
SOAP(Simple Object Access Protocol):简单对象访问协议是在分散或分布式的环境中交换信息并执⾏远程过程调⽤的轻量级协议,是⼀个基于XML的协议。
使⽤SOAP,不⽤考虑任何特定的传输协议(最常⽤的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何⼀种语⾔相互通信。
WSDL:Web Services Description Language的缩写,是⼀个⽤来描述Web服务和说明如何与Web服务通信的XML语⾔。
为⽤户提供详细的接⼝说明书。
Axis:Axis本质上就是⼀个SOAP引擎(Apache Axis is an implementation of the SAOP),提供创建服务名、客户端和⽹关SOAP操作的基本框架。
但是Axis并不完全是⼀个SOAP引擎,它还包括:是⼀个独⽴的SOAP服务器。
是⼀个嵌⼊Servlet引擎(eg:Tomcat)的服务器。
⽀持WSDL。
提供转化WSDL为Java类的⼯具。
wsdl文件用法(一)WSDL文件简介WSDL(Web Services Description Language)是一种用于描述WebService的XML格式文件。
它定义了WebService的接口、参数、操作和数据格式等信息,可以帮助开发者了解和使用特定的WebService。
WSDL文件的用途•WebService接口定义:WSDL文件提供了详细的WebService接口定义,包括可用操作、输入参数和输出结果等信息。
开发者可以通过查看WSDL文件来理解和调用特定WebService。
•自动生成客户端代码:WSDL文件可以用于生成客户端代码,使开发者可以更方便地调用WebService。
许多开发框架和工具(如SOAPUI、Apache CXF)都支持根据WSDL生成客户端代码。
•WebService测试:WSDL文件可以作为测试的依据,测试人员可以根据WSDL文件中定义的接口和操作,编写相关的测试用例和断言条件。
•WebService文档化和交流:WSDL文件可以作为文档,用于记录WebService的接口和数据格式等定义,便于开发者和团队之间的交流和理解。
WSDL文件的结构•Definitions:WSDL文件的根元素,包含了整个文件的定义和命名空间等信息。
•Types:定义了WebService中使用的数据类型,可以是基本类型、复合类型或自定义类型。
•Message:定义了WebService的消息,包括消息的名称和消息中使用的数据类型。
•PortType:定义了WebService的接口,包括可用的操作和操作的输入输出等信息。
•Binding:将WebService的接口定义与具体的通信协议绑定在一起,如SOAP、HTTP等。
•Service:定义了WebService的服务地址和服务的实现名称等信息。
WSDL文件的编写和使用1.创建WSDL文件:可以使用文本编辑器创建一个扩展名为.wsdl的文件。
WebService 之 WSDL文件讲解恩,我想说的是,是不是经常有人在开发的时候,特别是和第三方有接口的时候,走的是SOAP协议,然后用户给你一个WSDL文件,说按照上面的进行适配,嘿嘿,这个时候,要是你以前没有开发过,肯定会傻眼,那如果你想学习的话,就认真的看下面的讲解咯:一、WSDL概述WebServices Description Language (WSDL Web服务语言)是一个用于精确描述Web Service 的文档格式。
WSDL非常适合于用作代码生成器,它能够读取WSDL文档,并且可以为访问Web服务生成一个程序化的接口,大多数软件供应商和主要的标准机构(包括 W3C、WS-I和OASIS)都支持WSDL。
例如:JAX-RPC provider(例如:BEA Weblogic)通过API用WSDL生成相应的占位程序;IBM WebSphere、以及Apache Axis都有自己的工具生成相关的代码。
下图是一个例子:上面的例子JAX-RPC通过读取WSDL文档,创建JAX-RPC RMI接口(endpoint接口)和实现此接口的网络占位程序(stub)。
客户端程序通过RMI接口,Stub和Web Service服务端交换SAOP消息。
二、WSDL基本结构WSDL文档是一个遵循WSDL XML模式的XML文档(文档实例);类似于:SOAP文档是一个遵循SOAP XML模式的XML文档(文档实例);一个WSDL文档的根元素是definitions元素,WSDL文档包含7个重要的元素:types, import, message, portType, operations, binding和service元素。
三、WSDL声明3.1 XML声明<?xml version="1.0" encoding="UTF-8"?>WSDL的声明必须定义成使用:UTF-8 或者UTF-16 编码。
3.2 definition元素所有WSDL文档的根元素都是definition元素。
<definitions name="BookQuoteWS"targetNamespace="/jwsbook/BookQuote"xmlns:mh="/jwsbook/BookQuote"xmlns:soapbind="/wsdl/soap/"xmlns:xsd="/2001/XMLSchema"xmlns="/wsdl/">definition元素中一般包括若干个XML命名空间;/wsdl/是默认的命名空间,这样就可以不用显式地定义每一个WSDL元素的命名空间了,例如:<types><messages><portType>…;文档中所有的元素缺省应该属于这个命名空间。
definition元素的的一个属性是name,此属性不重要可以没有;定义了targetNamespace命名空间,它为在模式中显式创建的所有新类型均声明了XML命名空间,而且上面的例子中赋予了mh前缀。
<!-- message elements describe the input and output parameters --><message name="GetBookPriceRequest"><part name="isbn" type="xsd:string"/></message><message name="GetBookPriceResponse"><part name="price" type="xsd:float"/></message><!-- portType element describes the abstract interface of a Web service --><portType name="BookQuote"><operation name="getBookPrice"><input name="isbn" message="mh:GetBookPriceRequest"/><output name="price" message="mh:GetBookPriceResponse"/></operation></portType>上面的例子中:message元素利用name属性指定了标签(例如:GetBookPriceRequest),这些标签会自动使用targetNamespace的命名空间,标签了的messages元素通常被称为定义。
文档中的其他元素用标签和命名空间前缀去应用定义,例如上面的例子中:input元素是使用mh:GetBookPriceRequest来引用标签GetBookPriceRequest。
3.3 Types元素Types元素用作一个容器,定义了自定义的特殊数据类型,在声明消息部分(有效负载)的时候,messages定义使用了types元素中定义的数据类型与元素。
<?xml version="1.0" encoding="UTF-8"?><definitions name="BookQuoteWS"targetNamespace="/jwsbook/BookQuote"xmlns:mh="/jwsbook/BookQuote"xmlns:soapbind="/wsdl/soap/"xmlns:xsd="/2001/XMLSchema"xmlns="/wsdl/"><types><xsd:schema targetNamespace="/jwsbook/BookQuote"><!-- The ISBN simple type --><xsd:simpleType name="ISBN"><xsd:restriction base="xsd:string"><xsd:pattern value="[0-9]{9}[0-9Xx]"/></xsd:restriction></xsd:simpleType></xsd:schema></types>Types元素作为一个容器,用来定义XML模式内置的数据类型(即复杂类型和定制的简单类现,详细见Web Service XML文章)中没有描述的各种数据类型。
例如:ISBN。
上面的例子中,types元素中直接嵌套了一个完整的W3C XML模式文档,此文档中targetNamespace必须是一个有效的非空值,而且必须属于由WSDL文档。
3.4 Import元素Import元素可以让当前的文档使用其他WSDL文档中指定命名空间中的定义。
<definitions name="AllMhWebServices"xmlns="/wsdl/"><import namespace="/jwsbook/BookQuote"location="/jwsbook/BookPrice.wsdl"/><import namespace="/jwsbook/po"location="/jwsbook/wsdl/PurchaseOrder.wsdl"/><import namespace="/jwsbook/Shipping"location="/jwsbook/wsdl/Shipping.wsdl"/></definitions >WSDL的import元素必须声明两个属性,即namespace属性和location属性。
namespace属性必须和正导入的WSDL文档中声明的targetNamespace相匹配。
location属性必须指向一个实际的WSDL文档。
四、WSDL抽象接口Message、portType和operation元素用于描述Web服务的抽象接口,相当于JAVA或者C++中编程中的类的接口。
其中portType相当于类接口的名称;operation相当于接口中包含的函数,message相当于函数的参数和返回值。
4.1 Message元素Message元素描述了Web服务的有效负载。
相当于函数调用中的参数和返回值。
<message name="GetBulkBookPriceRequest"><part name="isbn" type="xsd:string"/><part name="quantity" type="xsd:int"/></message><message name="GetBulkBookPriceResponse"><part name="price" type="mh:prices"/></message>RPC式样的Web服务的message服务GetBulkBookPriceRequest表示消息的输入(相当于函数的参数),GetBulkBookPriceResponse表示消息的输出(相当于函数的返回值)Web Service的输入和输出参数可以是多个(一个特点),每一个输入或者输出使用part元素定义,R PC样式必须使用type来定义类型RPC样式用类型来数据定义过程调用,调用中的每一个元素表示某一个类型的参数。