WebService 之 WSDL文件 讲解

合集下载

wsdl文件用法

wsdl文件用法

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文件结构详解

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接口

webservice接口通过wsdl获取请求报文格式,xmlhttprequest调用wsdl接口

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调用方式及解析摘要:一、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调用方法

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简介

WEBSERVICE简介

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文件类型

WebService接口的几种调用方式--wsdl文件类型

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三种服务访问的方式(附案例)

浅淡Webservice、WSDL三种服务访问的方式(附案例)

浅淡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类的⼯具。

WebService接口说明文档

WebService接口说明文档

说明 所分配的用户名 密码 短信内容。70 字以内 目标号码。以逗号(,)分隔。发送状态
现 a. 定义 场 public QueryResult QuerySMS(string Username, string Password, string 拍 b. 参数 照 参数 说明 ( Username 所分配的用户名 取 Password 密码 得 SID 短信编号 客 户 c. 返回值 public class QueryResult 同 { 意 /// <summary> ) /// 查询状态(0:成功;-201:用户名/密码错误;-203:编号错误) 。
SID)
PS:双击获取文档。Ctrl+A,Ctrl+C,然后粘贴到word即可。 未能直接提供word版,抱歉。
b. 参数 参数 Username Password Content Numbers c. 返回值
public class SendResult { /// <summary> /// 发送状态(0:成功;-102:余额不足;-201:用户名/密码错误) /// </summary> public int State; /// <summary> /// 短信编号 /// </summary> public string SID; }
wsdl接口定义1sendsms发送短信定义publicsendresultsendsmsstringusernamestringpasswordstringcontentstringnumbers参数参数说明username所分配的用户名password密码content短信内容
WebService 接口说明文档

wsdl文件用法(一)

wsdl文件用法(一)

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的文件。

WSDL文件结构详解

WSDL文件结构详解

WSDL文件结构详解WSDL(Web Services Description Language)是一种用于描述Web 服务的XML格式文件,它定义了服务的接口和消息格式。

WSDL文件的结构非常重要,它包含了用户和开发者需要了解的所有信息。

下面详细解释WSDL文件的结构。

3. 类型(Types):在定义元素中,类型元素定义了用于通信的消息的数据类型,它可以包含XML模式定义语言(XSD)的定义。

这些定义描述了Web服务请求和响应的数据结构。

4. 抽象(Abstract):在定义元素中,抽象元素定义了Web服务的操作。

每个抽象元素都描述了一个操作,包括输入消息和输出消息。

抽象元素是独立于具体协议的,也就是说,它描述的是服务接口,而不是具体的通信协议。

5. 绑定(Bindings):在定义元素中,绑定元素将抽象元素与具体的通信协议进行绑定。

它描述了如何将抽象操作映射到实际的请求和响应消息格式。

绑定元素通常包含一个或多个操作元素,每个操作元素定义一个特定的Web服务操作。

6. 服务(Services):在定义元素中,服务元素定义了Web服务的具体实例。

它包含一个或多个端口元素,每个端口元素定义了一个具体的网络终点。

每个端口元素都与一个特定的绑定元素相关联,这样可以将具体的消息格式和协议绑定到服务端点上。

7. 导入(Import):WSDL文件中可以使用导入元素引入其他WSDL 文件或XSD文件。

导入元素允许将多个文件组织在一起,以便更好地管理和维护。

总的来说,WSDL文件的结构主要包括命名空间定义、定义元素、类型元素、抽象元素、绑定元素、服务元素和导入元素。

这些元素之间的关系是层次化的,每个元素都有其特定的作用。

WSDL文件的结构非常重要,它提供了Web服务的所有信息,描述了服务的接口和消息格式。

通过使用WSDL文件,用户和开发者可以了解如何与Web服务进行交互,以及如何解析和构造消息。

因此,了解WSDL文件的结构对于理解和使用Web服务非常关键。

WebService异构系统通信的原理及特点:SOAP与WSDL

WebService异构系统通信的原理及特点:SOAP与WSDL

从标准上来说,整个技术架构是WebServices(带s的),有时会看到很多人写成WebService(不带s的),其实这是不标准的WebService指的是单独一个服务,而WebServices指的是它的技术架构目前WebServices技术使用的稍多些,因为它走的是HTTP协议,它可以穿越防火墙,它天生就能穿越80端口但是WebServices的缺点就是:慢!!因为WebServices是基于HTTP协议传送大文本,实际传送的是XML文件而IIOP(属于CORBA技术架构)协议传送的就是二进制,所以它的效率要比WebServices快很多所以在一些行业里,也大量的使用了CORBA技术,比如说电信网而CORBA的缺点就是:编程模型复杂,它是属于重量级的SOAP——简单对象访问协议假设我们在本地通过Java写一个main()方法与远程的一个可以是用任何语言写的取得天气预报的服务打交道如果打交道的过程中采用的是WebServices技术的话,那么它传送给远程的就是XML文件,使用的是SOAP协议SOAP即简单对象访问协议,其实质就是HTTP+XML,也就是说它是通过HTTP协议来传送XML文件也就是说SOAP是基于XML的简易协议,可以使应用程序在HTTP之上进行信息交换或者更简单地说SOAP是用于访问网络服务的协议,而一条SOAP消息就是一个普通的XML文档使用SOAP协议通信的过程中,远程对象会将所要返回的信息形成一个XML文件传给Stub然后客户端就会把XML文件转换成Java对象,而当客户端在调用远程服务时客户端就会把Java对象转换成XML文件作为参数传给Skeleton,而Skeleton 就负责把XML文件转换成远程服务的相应语言的对象比如说服务端是采用Java开发的,那么Skeleton就会将接收到的数据解析成Java对象,再传送给服务端同理若服务端是采用C#开发的,那么Skeleton就会将接收到的数据解析成C#对象,再传送给服务端所以,WebServices能够实现异构语言的通信,可以用来整合异构系统同理,如果不是异构系统的话,也就没有必要使用WebServices技术比如说客户端和远程对象都是采用Java开发的,那么就没有必要使用WebServices了因为二者都是采用Java开发的,它们之间可以直接以二进制来传输数据,访问效率会快的很多而WebServices其实就是基于XML的数据交换,即WebServices所传送的是大文本,效率自然就慢了除非我们的系统是采用多语言开发的,那么就可以考虑使用WebServices技术或者说我们的系统想做的通用一些,则可以采用并开放WebServices的一些方法其实SOAP就是用来最终完成Web服务的调用的,而WSDL则用于描述如何使用SOAP来调用Web服务WSDL——WebServices描述语言仍以上面为例,即客户端采用Java开发,服务端是采用C#开发的天气预报的服务作为客户端,它知道在服务端提供了一个能够获取天气预报的服务,并且客户端也可以调用该服务但作为服务端,应该对这些服务进行描述,以告诉客户端都有哪些服务可供调用而这个服务是不能用C#语言来描述的,因为采用Java开发的客户端是无法识别的所以服务端就需要使用一套语言来描述它所提供的服务,这套语言就是WSDL 其实WSDL就是一个XML文件,也就是说WebServices定义了一套标准,里面都是XML格式使用这套标准来描述服务端对外提供的服务,比如C#的方法名、参数名、返回值等信息假设服务端的天气预报功能还没有使用C#来实现,并且客户端也没有使用Java 来实现这时突然要求定义一套标准来描述一下即将准备实现的服务端的天气预报的功能并且客户端可以任意调用这个天气预报功能,此时就可以写一套WSDL来描述方法名、参数、返回值等信息当服务端的C#得到该WSDL时,就可以通过WSDL生成C#代码,然后它就可以把取得天气预报功能的逻辑补充上而客户端的Java在得到这个WSDL之后,同样可以生成Java代码,然后把相应的约定的接口实现补充上在使用WSDL生成相应语言的代码的过程中,就需要用到一些引擎来实现比如在WebServices中就有:Axis、CXF、XFire等框架,它们就可以根据WSDL 解析成Java代码所以WSDL是一种中立的语言而CORBA架构中也有类似于WSDL的一种东西,叫做IDL,它的语法类似于C++语言,但IDL不是C++UDDI——发现和整合服务类似于JNDI。

java解析wsdl文档获取具体的方法与参数

java解析wsdl文档获取具体的方法与参数

java解析wsdl文档获取具体的方法与参数Java解析WSDL文档获取具体的方法与参数WSDL是Web Services Description Language的缩写,是一种基于XML的语言,用于描述Web服务的功能、参数和协议等信息。

WSDL文档定义了Web服务的接口,以及调用Web服务的参数和返回值。

本文将介绍Java中解析WSDL文档获取具体的方法与参数的方法。

1. 使用Java自带工具解析WSDL文档Java自带了一个工具叫做wsimport,用于生成Java客户端代码,并解析WSDL文档。

在终端中执行以下命令:wsimport -keep -verbose [WSDL URL]其中,-keep选项表示保留生成的Java代码,-verbose选项表示显示详细的生成信息。

执行该命令后会在当前目录下生成一个包含WebService端点的Java代码。

2. 使用Apache CXF解析WSDL文档Apache CXF是一个开源的Web服务框架,支持SOAP、REST和XML等协议。

使用Apache CXF可以很方便地生成客户端代码,并解析WSDL文档。

以下是使用Apache CXF解析WSDL的步骤:(1)添加Maven依赖:```<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-bundle</artifactId><version>[版本号]</version></dependency>```(2)使用CxfClientFactoryBean创建客户端对象:```javaCxfClientFactoryBean factory = new CxfClientFactoryBean(); factory.setAddress("[Web服务的地址]");factory.setServiceClass([服务接口类].class);factory.setWsdlLocation("[WSDL文档的URL]");[服务接口类] client = (服务接口类)factory.create();3. 手动解析WSDL文档如果不想使用自带工具或者第三方框架,可以手动解析WSDL文档。

WS-Services:使用WSDL组合多个Web服务以增加应用程序的使用范围

WS-Services:使用WSDL组合多个Web服务以增加应用程序的使用范围

WS-Services:使用WSDL组合多个W eb 服务以增加应用程序的使用范围WebServices使用WSDL组合多个Web服务以增加应用程序的使用范围绾者注:WSDL.WebServicesDescrlptionLanguage.Web曩务描述语言owSDL是一种XML格式.用f将雨络墨务描述为一组避点.这些蛾点对包含面向文档信惠或面向过程信惠的消惠进行羹佧.这种格式t先对■作和潸惠进行抽象描述.然看将其绑定到具体的田络协议和消惠格式上以定义谴点.相关的具体谴点郾组合成为抽象谴点e骚务)o可以对wsDL进行扩爱.这样无论通信时使用伺种滑惠格式或硒缀协议.都可以列罐点及其消惠进行撬述.业解决方案通常聚合了来自无数个内部应用程序l亡和外部源的信息.作为一种容易且可靠地使用这些解决方案所需各种数据的方法,Web~JE务(WebServices)已得到了迅速采用.但不可避免会出现一些特殊的情况,即单个解决方案要求使用多个互补的web服务.而这些服务通常共享特定于公司或特定于域的XML类型.遗憾的是.正是那些帮助推动了广泛采用Web服务的工具以及它们所提供的强大抽象.可能经常妨碍开发人员窥探组成Web~JE务栈的XML标准的内幕.本文将提供一个解决方案.以便实现为互补的Web服务创建的代理之间的类型共享.同时提供一个分析Web~JE务描述语言(WSDL.WebServicesDescriptionLanguage)及其与我们了解并喜欢的Web~JE务工具之间的交互的机会.当我第一次尝试创建两个互补的Web~.务以共享常见◆作者:GerrardLindsay一作者介绍GerrardLindsay是EastRegion的一名MicrosoftServices应用程序开发顾问.相关技术:.NETFramework,C#,XML,WebSer—vices难度:★★★★☆读者类型:.NET开发人员,WebServices开发人员导读:本文探讨了XML命名空间和WSDL的秘密,介绍了如何在多个Web服务之间共享类型而无需编写代码,以及WSDL.exe工具.的XML类型时.我遭遇到一个令我不太愉快的意外.在我的客户端应用程序中创建的每个代理.都在不同的C#命名空间中具有常见消息的不同对象表示.我必须将每个属性从一个类的实例手动复制到另一个类的实例.而这似乎是这些工具当前实现的一项不必要的结果.最后,我无意中发现了一种技术.从而能够公开单个Web服务协定该协定通过创建带有多个绑定的WSDL文件封装了多个Web 服务终结点.这就显式地定义了服务之间的关系.而且还具有代理的优势.这些代理可以共享表示常见消息的托管类.在完成上述工作之后可以通过手动编辑工具生成的代理.在相同命名空间中共享由多个协定定义的类型.但是.通过将Web服务绑定组合到单个WSDL文件中.Web服务实现者可以定义共享关系,而不是给为服务创建客户端的开发人员增加负担.该技术还使您每次在开发过程中更改服务协定时,无需重新创建对代理类进行的更改. XML命名空间(XMLNamespace)对弈CLR命名空间(CLRNamespace)在继续讨论以前.有必要确保您理解命名空间的概念.并且理解XML上下文中的命名空间和托管代码上下文中的命名空间之间的区别.这两种类型的命名空间都具有类似的目的:帮助开发人员避免名称冲突.它们使一组项可以包含多个具有相同名称但含义不同的项.它使您可以使用名称"Order"来同时表示客户的订单及其购物车中某个项的顺序.那样,命名空间就像用来区分"Johnsmith" 和"JohnBrown"的姓氏.让我们通过分析代码段1中显示的XML命名空间来考察这一点.&lt;CustomerlnfoxmJns:o="/OrderService"xmJns=s="/ShoppingCartService '&gt;&lt;O:0rders&gt;&lt;O:OrderorderNumber="1"&gt;&lt;!一一otherorderinformationwouldgohere一一&gt;&lt;/o:0rder&gt;&lt;/o:0rders&gt;&lt;s:ShoppingCart&gt;&lt;s:Item&gt;&lt;s:0rder&gt;l&lt;/s:0rder&gt;&lt;/s:Item&gt;&lt;/s:ShoppingCart&gt;&lt;/Customer~fo&gt;在代码段中.架构(由使用http://www.examplecom/OrderService命名空间的公司创建)中的Order元素可以与架构(由使用http://www.exampIe,com/Shopping CartService命名空间的公司创建)中的Order元素和睦相处. 用作XML命名空间的URI通常但不总是采取URL的形式.但是.并没有任何要求(并且情况通常不是这样)规定这些URL必须实际指向某个架构文件或其他任何实际资源.为了防止XML文件令人难以忍受地冗长(这通常是对XML格式的批评之一),可以使用命名空间前缀作为定义命名空间的实际URI引用的简写形式.当该命名空间前缀被追加到命名空间中元素的本地名称时,就可以借助于分号得到该元素的限定名称.下面是一个示例:+":¨+:"O"+":"+"Order"="0:Order"类似地.托管世界中的命名空间可以将类与完全相同的名称区分开来.这方面的一个很好的示例是:Windows窗体库包含一个名为System.Windows.F0rmsButton的类,而库包含一个名为SystemWeb.UIWebControls Button的类——这不会出现任何问题.尽管我的示例使用了不同程序集中的类.但您需要记住的是,在单个程序集中也可以具有多个带有相同名称的类——只要它们位于不同的命名空间中.什么是绑定WSDL是一种用于描述由SOAP信封传送的消息的有线格式的标准.WSDL文件是一个充当Web服务协定的XML文档.它可以由该Web服务的使用者用作指南,以便创建和验证与该服务之间往来传送的XML有效负载.在我深入探讨该解决方案之前.让我们花一点儿时间来快速回顾一下构成WSDL文件的活动部分.我将重点讨论一个通过HTTP操作的非常简单的document—literalWeb~E 务.存在很多个选项(例如.SoapHeaders和不同的传输以及各种编码).因为WSDL期望成为一种具有高度可扩展性的标准.简单的WSDL文件所描述的服务,其正文包含一个自定义XML文档,document部分(在该服务中使用XML架构定义语言[XSDL,XMLSchemaDefinitionLanguage]定义)以及literal部分.如果您需要有关RPC/encodedWeb服务, WSDL,SOAP或其他构成Web~E务栈的XML标准的更详细信息.则请访问MSDNWebServicesDeveloperCenter.同时,我还将向您简要介绍一下服务协定.WSDL是一种用于描述由SOAP信封传送的消息的有线格式的标准.WSDL文件是一个充当Web服务协定的XML文档.它可以由该Web服务的使用者用作指南,以便创建和验证与该服务之间往来传送的XML有效负载.让我们观察一下WSDL文件的主干(如代码段2所示),以便更好地了解它的组件.请记住.这不是有效的服务协定.我已经通过移除某些属性和命名空间声明,针对该示例简化了它.以便我可以集中讨论最有趣的部分.&lt;wsdI:deftnitioasxmlns:wsdl="/wsdl/"xmlns:soap="/wsdl/soap/"xmlns:xsd="/2001/XMLSchema"xmlns:my="/supersimpleweb~ targetNamesPace="httP://examPIe supersimplewebservice"&gt;&lt;wsdl=types&gt;&lt;xsd:schema&gt;&lt;xsd≈elementname="Requt)e#9dlstring/&gt;eatMessageEIement"』I一一…一一…一…一&lt;xsd:elementname="Retype='.xsd=string'./&gt;&lt;/xsd:schema&gt;&lt;/wsdI:types&gt;&lt;wadl:me.ssagenl~me="RequestMessage"&gt;&lt;partnsfTle="RequestMessagePart"element="my:RecluestMessageElement"/&gt;&lt;/wsdl:message&gt;&lt;wsdI:messagename="ResDonseMessage"&gt;&lt;partn~Tle='.ResponseMessagePart.'element="my&lt;/wsdI:message&gt;"/&gt;定义元素是WSDL文件的根元素,并且包含我将分析的其余元素.作为根元素.它还包含WSDL命名空间,SOAP 命名空间,XSD命名空间以及任何自定义命名空间(由WSDL文件或被导入的架构中定义的元素所使用)的命名空间声明.在示例文件中./super simplewebservice命名空间用"my"命名空间前缀声明.我将分析的下一个元素是types.它类似于内联的XSD.它定义了XML元素的结构.XML元素构成了由WSDL文件描述的消息(在这种情况下.为RequestMessageEIement和ResponseMessageEIement).WSDL设计者还可以选择在外部架构文件中定义类型;可以使用import将该外部架构文件导入到服务协定中(示例文件中未显示).我将导入的架构用于突出消息的协定优先设计.您将在进一步观察该解决方案时了解这一点.下面应该讨论消息元素了.每个消息元素都描述一个将由WSDL文件中定义的绑定使用的独特消息.消息元素主要充当部件元素的容器.每个部件都具有一个元素属性. 该属性指定了基础XSD类型(例如.string,float)或在WSDL 文件的types节中定义的元素之一.尽管可以在单个消息内部包含多个部件元素.但您将遇到的大多数WSDL文件都将只包含单个部件.portType元素充当一组操作以及在每个操作期间发送或接收的消息的容器.可以将操作视为已定义的消息交换.并将其建模为操作元素的实例.如果您从面向对象编程的角度考虑.您还可以看到在操作和抽象方法签名之间存在不太明显的相同之处.操作元素可以具有一个或零个输入,输出或错误元素.如果您曾经观察过WSDL文件.则您可能已经见到过指定操作所接受的向内和向外绑定消息的元素.但是我尚未见到过自然状态下的错误元素.尽管操作的每个子元素都是可选的.但必须至少定义一个输入或输出消息.实际上.大多数Web服务都至少包含一个输入消息.这些子元素中的每一个元素都包含一个消息属性,该属性指定了在该文件前面部分中定义的消息元素之一的名称.现在.让我们考察--Tbinding:~,素——更准确地说是wsdl:binding元素.我先前已经讨论过的所有元素都已经以抽象的方式定义了一些消息.这些消息可能会也可能不会与消息在网络中传送时的表示方式直接对应.Binding通过详细说明消息的实际格式,在交互期间使用的协议以及用于交换消息的网络传输机制.定义了消息的具体格式.Binding元素的type属性指定了该元素要链接到的端口类型.它的operation子元素指定了该binding所对应的端13类型内部的特定操作.以及要使用的输入,输出或错误消息.每个binding还都包含可扩展性元素.它们用来指定特定于该binding所使用的协苎,苎一通过使用突出肖篓要o息的协定优先设它的协因喜爻络中!善磊描_姜它们位于不同的命名空间中.示例服务中的soap:binding元素的transport属性指定该服务将使用HTTP而不是SMTP或TCP/IP作为它的网络传输.soap:binding元素的style属性将wsdl:binding中指定的操作所使用的默认正文样式声明为document或rpc(在该示例中.为document).示例WSDL文件中的另一个binding可扩展性元素为soap:operation元素. 它指定了实现该binding的服务所期望的SOAPAction标头. 它还提供了重写soap:binding元素所指定的默认样式的能力.我们要考察的最后一个元素是service.每个service元素都对应于一个特定的Web~.务终结点.并且定义了该终结点公开的名称和端口集.service元素还包含一个可扩展性元素.在该示例中.该元素为soap:address.soap:address元素的location属性指定了终结点本身的URI.当您开始生成真正的WSDL文件时.您可能会注意到它们不包含service 元素.因为它们准备供多个终结点重新使用.解决方案的设计到目前为止.您已经具有足够的基础知识来考察我先前描述的技术.Y asserShohoud在他的文章"PlaceXML MessageDesignAheadofSchemaPlanningtoImproveWeb ServiceInteroperability"(参见MSDNMagazine2002年12FJ刊)中介绍了Web服务的突出消息的协定优先设计.在这篇文章中.Y asser向您演示了创建具有以下功能的web服务的步骤:使用消息优先的设计方法返回有关当前天气的信息.概括说来,他首先定义了将用其服务交换的XML消息.然后,他使用该XML结构定义了一个XML架构,并且定义了一个抽象服务说明.该抽象服务说明用来创建该服务的实现.通过使用突出消息的协定优先设计.Web服务设计者可以定义将在网络中传送的消息的确切结构,而不是设计和实现对象表示并且让工具来决定网络级表示.可能存在很多已经开发的web服务——它们的设计师从未考虑过他们的服务的消息在网络中呈现的状况,这通常是因为这些服务是在单个平台上实现和测试的,并且只通过代理使用.如果强迫这些开发人员深入到其开发工具所提供的抽象之下来解决难解的问题,或者如果他们需要利用XML开发人员可以使用的强大工具,则他们可能会突然感到非常吃惊,因为他们面对的是其消息不够理想的XML表示.假设您是一个不同开发团队的一分子,要求该开发团队生成一个新的名为CalculateChanceOfRain的Web~JE务,该服务将作为Y asser的团队所实现的GetWeatherjEJE务的补充. 新的Web服务将使用一个在原始服务架构中定义的元素.但是它将返回一个浮点值以表示基于当前天气的降水概率.您的服务将驻留在它自己的位于不同数据中心的服务器上.并且将使用与GetWeatherjEJE务不同的后端系统.实际上.您可以轻松地假设新服务是由完全独立的合作伙伴组织开发的.您无法访问原始服务的源代码或其他实现详细信息而只能访问架构和WSDL文件.图1显示在与这两个服务的单用户交互中的操作序列.图1.单用户事务概述如您所见,从客户端的观点来看,这两个服务实现构成了一个"虚拟的"聚合服务.如果您承担设计新解决方案的任务,则您首先想到的可能是为新服务创建一个全新的服务协定(WSDL文件),以便导人为GetWeather服务定义的架构.遗憾的是,使用该技术将意味着当前的NET工具会将这两个WebnE务视为完全不同的实体.当使用Visual 或WSDL.exe来为这两个web服务创建代理时. 每个代理都将具有它自己的针对"CurrentWeather"消息的对象表示.这些类将完全相同,并且将被序列化和反序列化为完全相同的XML结构.实际上.您可以使用XmlSerializer 将~个类的实例序列化为文档,然后成功地将同一文档反序列化为另一个类的实例.但是,从运行库的角度来看,这两个类是不同的命名空间中恰好具有相同名称的不同托管类.既然如此,那么从对GetWeather代理对象的方法的调用中返回的对象实例就不能传递给CalculateChanceOfRain代理的方法.它们在托管世界中是不同的类,就像System WindowsForms.Button和SystemWebUIWebControlsButton是不同的类一样.这意味着您只能在不同类的实例之间复制值,或者手动编辑由工具生成的代理代码.如果消息不是非常巨大的话,那么在字段之间复制数据可能不会造成多么大的性能差异.但这一定是我宁愿避免的一项额外的维护任务.如果您决定手动更改代理,则您必须移除两个表示常见XML消息的类之一,并且对那个被移除表示的代理重新进行编码,以使用另一个代理的类.请记住,每当您创建对服务的新Web引用时.都必须重新实现这些更改.在我看来,这些解决方案都不是特别理想.因为它们使客户端开发人员必须在服务之间实施消息的概念性共享,从而增加了他们的负担.通过创建带有针对每个实现服务的binding的单个接口WSDL,您可以获得某种级别的封装.以显式定义两个服务实现之间至今存在的隐式关系.与只是具有一个GetWeather服务和一个caIcuIatechanceOfRain服务不同,您可以公开一个包含这两组行为的虚拟weatherseces服务.您还可以让您使用的WebfiE务工具创建这两个服务共有的数据类型的单个类表示.让我们考察一下如何创建包含这两个服务的binding的聚合服务说明.创建WeatherServicesWSDL创建新聚合服务说明的第一步是确定将要传递给新的caIcuIatechanceOfRain服务的消息.正如我先前已经讨论过的那样,作为输入传递给新Web服务的消息将是由Y asser的GetWeather服务返回的相同CurrentWeather元素.让我们观察一下原文中的示例XML:&lt;CurrentWeatherxmlns="/Weather"&gt; &lt;Conditions&gt;Sunny&lt;/Conditions&gt;&lt;lconUrl&gt;/images/sunny.gif&lt;/IconUrl&gt;&lt;Humidity&gt;0.41&lt;/Humidity&gt;&lt;Barometer&gt;30.18&lt;/Barometer&gt;&lt;FahrenheitTemperature&gt;75&lt;/FahrenheitTemperature&gt; &lt;CelsiusTemperature&gt;23.89&lt;/CelsiusTemperature&gt;&lt;/CurrentWeather&gt;如您所见,CurrentWeather元素包含一些子元素.其中包含当前情况的文本说明,摄氏温度和华氏温度,以及有关特定地区天气的其他信息片段.新的CalculateChanceOfRain 服务表面上将使用这一有关天气的信息来预测该地区的降水概率.降水的百分比概率将以包含浮点值的简单元素的形式返回给调用方.您将需要创建~个新的架构以定义该输出消息——您将其称为caIcuIatechanceOfRainResponse.新的RainServiceMessages架构的内容如下所示&lt;xs:schemaxmlr~:rnstns="http://somecompsnydot"ht://xrdns:xs="/2001/XMLSchems" elementFormDefault="qualified"&gt;&lt;xs:elementname="CalculateChanceOfRainResponse"type="XS:float"/&gt;&lt;/xs:schema&gt;既然已经定义了消息,那么您就可以创建新的聚合服务接口.与从头创建新的WSDL文件不同,您将修改由负责GetWeather服务的团队创建的WSDL文件.代码段3(参见光盘)显示该文件在其当前格式下的内容.要创建新的聚合服务接口,需要将WeatherlnterfaceWSdI的内容复制到一个新的文件中(我将该文件称为Aggregate—Weatherlnterfacewsd1).然后,您需要将新的RainServiceMessages架构的命名空间添加到新WSDL文件中的定义元素中.接下来,添加一个使用CurrentWeather元素作为其数据部件的请求消息,以及一个使用新的CalculateChanceOfRainResponse元素的响应消息.您还需要为新的服务向WSDL文件中添加一个port和一个binding.代码段4(参见光盘)显示已完成的Aggregate—Weatherlnterface 服务说明.在完成之后,您需要立即将WSDL文件移动到客户端可以访问的位置.当您告诉客户端开发人员有关WeblE务的信息时,或者当您使用像UDDI这样的服务发布该服务时,您可以将用户引导到该静态WSDL文件的位置.而不是使用在查询字符串中用"?WSDL"访问ASMXURL而创建的动态生成文件.当然,就像所有经验丰富的Web服务开发人员一样,一旦您进入实际工作环境,您总是将该动态文件保存为静态文件.如果您使用反射来动态生成它,则它就不是协定.您还可以使用BuiIdingXMLWeb ServicesUsingIndustryStandardizedWSDLs中描述的机制, 让动态生成的WSDL指向静态的WSDL.实现CalculateChanceOfRain服务既然聚合服务说明已经完成,那么您现在就可以着手实现CalculateChanceOfRainWebl~.务了.该过程中的第一个步骤是使用wsd1.exe工具为服务实现创建一个抽象存根, 就像Y asser在实现GetWeather服务时所做的那样.以下是我用来创建CalculateChanceOfRain存根的命令行:wsdl/server/o:RainServiceStub.CShttD;//IOCSIhOSt/WestherServiCe/ aggregateweatherinterface.wsdI如果您分析一下所生成的WeblE务存根文件,则您会注意到该文件包含两个抽象的Web服务类.每个类都对应干聚合WeblE务说明文件中包含的binding之一因为您只是使用该类实现您的CalculateChanceOfRainWeblE务,所以您应当手动从该存根文件中移除GetWeatherbinding实现但是,这只是为了更加美观一些,而没有任何真正的技术动机.您将需要保持CalculateWeather类的定义,因为在您的方案中,您无法访问用于定义GetWeather服务项目中类的源代码.代码段5(参见光盘)显示修改过的Web服务存根文件.现在,您需要创建从Webl~.务存根类中派生的服务实现.第一个步骤是创建一个新的Web服务项目.本文随附的示例代码中的项目名为RainService".向该项目中添加一个名为MyRainService的Web服务,然后打开它的代码隐藏文件.代码段6显示MyRainServiceWeb服务代码隐藏文件在修改之后所包含的代码.[WebServJce(Namespace="http://somecomDanydotcom/ RainServices")】NBrfl~"CalculatNemespece="/Weather".Location="httP://1OcaIhOst/WeatherService/ aggregateweatherinterface.wsdl")】publicclassMyRainService:CatcuJat{publicMyRainService(){//ThiscalIiSrequiredbytheASPNETWebServicesDesisnerInitializeComponent()l}[WebMethod][SOSDDOCUmentMethOd("",ParameterStYle=SoapParameterStyle.Bare)]}[return:XmlElement("CatcLdateChanceOfRainResponse". {Namesosce="http://somecom口anydotcom/iRainServices")】l{publicoverridefloatCalculateCheclceOfRain(I[System.Xm1.Serialization.×mIEIementAttr.bute(L————,一——一——……————————————————一一Namespace="http://learnxmlws.corn/Weather")] CurrentWeatherCurrentWeather){floatresult=0:if(CurrentWeather.Conditions=="Rainy")result100;else{Randomrnd=newRandom(DateTime.Now.Millisecond);result=(float)rnd.Next(101);}returnresult;}}请注意.我已经向该类应用了WebServiceAttribute.以便设置将由该服务使用的命名空间.这并非严格需要.因为WebfiE务基础结构将默认使用tempuriorg命名空间.但是对于生产Web服务而言.这是一个好主意.我还向该类应用了WebServiceBindingAttribute类.以指示该Web服务的binding在先前创建的聚合服务说明中定义.该属性至关重要:它指定该服务将使用聚合WSDL文件中定义的CalculateChanceOfRainlnterfacebinding.由于我对气象学一无所知,对于风暴等气候现象也缺乏了解,所以CalculateChanceOfRain方法的实现只是返回一个介于零和一百之间的随机浮点值.更准确的天气预报逻辑作为练习留待读者来完成.鉴于此.该算法的成功率很可能能够与我在电视上看到的很多本地天气预报员的成功率相媲美.实现GetWeather服务由于您的情况是虚构的.因此您需要创建GetWeather服务的示例实现,以便测试您的解决方案.相关步骤几乎与您在实现上一个Web服务时所遵循的步骤完全相同.因此我不再对它们详加讨论.唯一需要说明的是,您将再次使用WSDL.EXE工具生成web服务存根.然后仓0建一个新的类文件以保持服务实现.代码段7(参见光盘)显示Web服务的完整实现.正如我已经说过的那样,我对气象学几乎一无所知,并且我没有天气检测设备.myGetWeather方法将忽略由调用方指定的邮政编码,而不是与天气信息提供商签订合同.该服务返回一个填充了随机值的CurrentWeather实例.由于cafcuIatechanceOfRain服务无论如何都会忽略发送给它的消息,因此这一点并不重要. WeatherSerVices客户端应用程序到目前为止.您已经准备好测试新的聚合Web服务.为此,请创建一个简单的名为WeatherClient的Windows窗体应用程序,该应用程序将充当Web服务的客户端.它看起来如图1中的窗体(不带背景图像).现在.让我们考察一下该实现需要的内容.首先,需要向主窗体中添加一些控件,使用户可以与该应用程序交互.向主窗体中添加一个文本框.并将其命名为"Zipcode".然后,向该窗体中添加一个按钮.并且将其命名为"Submit Button".最后.添加一个标签以显示计算结果.并将其命名为"DisplayLabel".接下来.使用添加一个对聚合服务说明的引用.请记住.应该将该引用添加到所创建的静态WSDL文件.而不是ASMX件的动态创建的WSDL.聚合服务说明不包含用于指定服务实现的终结点的service元素.因此您在调用Webfie务之前必须手动设置代理实例的URL属性.像很多NETXMLWeb服务开发人员一样.我在添加web引用之后完成的第一件事情是将web引用的URLBehavior 属性设置为Dynamic.在设置该属性以后.代理类通过分析应用程序配置文件中的设置来确定Web服务终结点的URL. 因此您不需要将该URL硬编码到类本身中.遗憾的是.对于您已经创建的多重绑定文件,该方法不起作用.因此您必须手动创建配置项.并且设置代理实例的URL属性.现在.您已经做好了向应用程序中添加客户端代码的准备.代码段8显示该窗体中的重要代码节. privatevoidSubmitButton——Click(objectsender,System.EventArgse){//lettheuserknowwe'reworkingthis.Cursor=Cursors.WaitCursor:updateStatus("Gettingweatherj",false);//c酬theGetWeathermethodasynchronously weatherservices.WeatherlnterfaceweatherService= newWeatherClIent.weatherservIces.WeatherInterface()jweatherService.UrI=ConfigurationSettIngs.APPSettings["weatherServiceU一"];weatherService.BeginGetWeather(ZipCode.Text. newAsyncCallback(this.getWeatherResult), weatherService):}privatevoidgetWeatherResult(IAsyncResultar){//we'rereturnedfrOmourcalItoGetWeatherlupdateStatus("Gettingchanceofraini",false);//let'sgettheresultofourcalItoGetWeather weatherservices.WeatherInterfaceweatherService=(weatherservices.WeatherInterface)ar.AsyncState: weatherservices.CurrentWeathercurrentWeather= weatherService.EndGetWeather(ar)://nowweneedtocalItheGetWeathermethodasyn-chronouslyweatherservices.CelculateChanceOfRainlnterface rainCalculetor=newWeatherCnawASyncCaIlback(thiS.getCalculateCh8riceOfRainResult),rainCalculator);lprivatevoid8atCalculateChanceOfRainResult(IAsyncResuIt81") {tweatherservices.CalculateChanceOfRainlnterface rainCalculator=(weatherservices.CalculateChanceOfRainlnterface)ar.AsyrlcStatelfIoatChanca0fRain=rainCeIcuIat0r. EndCalculateChanceOfRain(or);stringresultMessage=string.Format("Thereisa{0}%chanceofrain."chanceO仟l);updateStatus(resuttMessage,true);}在按钮的Click事件的事件处理程序中.使用Web~.务代理类启动对GetWeather~.务的调用.为了使用户界面能够快速响应.使用web服务代理对AsynchronousMethodIn- vocationDesignPattern的实现.这会使Web服务请求在ThreadPool中的线程上执行.而不是在需要处理已发布的Windows消息的用户界面线程上执行.以便使uI能够快速响应.getWeatherResuIt方法被指定为对GetWeather方法的异步调用的AsyncCallback委托.代理是第三个参数.当GetWeatherweb服务调用完成时.将执行getWeatherResult方法.getWeatherResuh方法将作为其参数提供的IAsyncResuh 对象的AsyncState属性转换为CurrentWeather的实例.然后它使用CurrentWeather实例作为对CalculateChanceOfRainWeb 服务的调用的参数.getcaIcuIatechanceOfRain只esult方法被指定为对GetWeather方法的异步调用的AsyncCalIback委托.当执行getCalculateChanceOfRainResult方法时,调用updateStatus 方法.以便通过更新DisplayLabel标签的Text属性来向用户显示降水概率.正如您可能知道的那样.Windows窗体控件不是线程安全的.并且它们的方法只应当从用户界面线程中调用.当在ThreadPool辅助线程上收到来自Web服务的异步响应时,DisplayLabel的InvokeRequired属性将为true.该方法随后通过DisplayLabe1.Invoke递归调用它自己.以便在用户界面线程上分配该标签的Text属性..NETFramework2.0中的类型共享类型共享功能在即将发布的Framework2.0中得到极大的改善知道这一点一定会令您感到非常高兴.下一个版本的WSDLEXE工具通过添加sharetypes命令行参数.使得服务之间的类型共享变得更为简单.通过向该工具提供多个WSDLURL以及向参数中添~gsharetypes 标志.您可以告诉该工具.您希望在生成的代理之间共享任何公共类型.公共类型是指在同一架构文件中定义的具。

C#操作webservice(经典入门教程及实例)

C#操作webservice(经典入门教程及实例)

Web Service基本概念Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。

是:通过SOAP在Web上提供的软件(服务),使用WSDL文件进行(说明),并通过(UDDI)进行注册。

XML:(Extensible Markup Language)扩展型可标记语言。

面向短期的临时数据处理、面向万维网络,是Soap的基础。

Soap:(Simple Object Access Protocol)简单对象存取协议。

是XML Web Service 的通信协议。

当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。

SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。

WSDL:(Web Services Description Language) WSDL 文件是一个XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。

大多数情况下由软件自动生成和使用。

UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。

在用户能够调用Web 服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。

UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。

它采用XML 格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。

概念补充:http soap关系http:是一个客户端和服务器端请求和应答的标准(TCP)。

http协议其目的是为了提供一种发布和接收htttp页面的方法一http协议的客户端与服务器的交互:由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。

WebServices中XML、SOAP和WSDL的一些必要知识

WebServices中XML、SOAP和WSDL的一些必要知识

WebServices中XML、SOAP和WSDL的⼀些必要知识Web Services 是由xml来定义数据格式的,通过SOAP协议在各个系统平台中传输,那么接下来讨论下SOAP和WSDL的各⾃作⽤。

SOAP和WSDL对Web Service、WCF进⾏深⼊了解的基础,因此花⼀些时间去了解⼀下是很有必要的。

⼀、SOAP(Simple Object Access Protocol)如果我们要调⽤远程对象的⽅法,就必定要告诉对⽅,我们要调⽤的是⼀个什么⽅法,以及这个⽅法的参数的值等等。

然后对⽅把数据返回给我们。

这其中就涉及到两个问题:1、数据如何在⽹络上传输。

2、如何表⽰数据?⽤什么格式去表⽰函数以及它的参数等等。

1、SOAP的传输协议SOAP的传输协议使⽤的就是HTTP协议。

只不过HTTP传输的内容是HTML⽂本,⽽SOAP协议传输的是SOAP的数据。

看⼀下下⾯的例⼦:这是⼀个HTTP请求(请求google的⾸页)的内容:GET / HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap,application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*Accept-Language: en-usUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; CIBA) chromeframe/4.0Accept-Encoding: gzip, deflateConnection: Keep-AliveHost: Cookie: PREF=ID=d8f9f1710bfa5f72:U=a5b3bec86b6433ef:NW=1:TM=1260238598:LM=1260241971:GM=1:S=q2agYsw3BsoOQMAs;NID=29=JgIGDDUx70IQTBVAnNEP_E9PLLKBI9STjzaBjgq1eWuDg-_jCgFpka59DrOC0aZKLbj4q77HU1VMKscXTP3OaseyTbv643c2XPe9dS7lsXDHAkAnS46vy-OU8XRqbmxJ; rememberme=true;SID=DQAAAH4AAABW7M4nVkTeOR7eJUmC1AJ4R6hYbmVewuy_uItLUTzZMUTpojdaHUExhPa_EPAkO9Ex1u3r7aPXZ5cj28xHnv2DbfRYf5AyaBcimciuOTITKSIkqn3QSpGDFkRS1Xn7EGzDpCV HSID=AFEFTMA68EgNjkbil; __utmx=173272373.; __utmxx=173272373.---------如果有Post的数据,这⾥还会有Post的数据--------这个是⼀个SOAP请求的内容:POST /WebServices/WeatherWebService.asmx HTTP/1.1User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3603)Content-Type: text/xml; charset=utf-8SOAPAction: "/getSupportCity"Host: Content-Length: 348Expect: 100-continueConnection: Keep-Alive<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="/soap/envelope/" xmlns:xsi="/2001/XMLSchema-instance"xmlns:xsd="/2001/XMLSchema"><soap:Body><getSupportCity xmlns="/"><byProvinceName>⼴东</byProvinceName></getSupportCity></soap:Body></soap:Envelope>可以看到,⼀个SOAP请求其实就是⼀个HTTP请求,但为了表明内容是SOAP的数据,需要加⼊上⾯请求中红⾊字的部分来以⽰区别。

webservice wsdl详解及调用

webservice wsdl详解及调用

WebService是一种跨网络的服务通信方法,它允许不同机器、不同语言之间的程序进行通信。

WSDL(Web Services Description Language)是一种XML格式的文档,用于描述Web服务的接口信息,包括服务的方法、参数和返回值等。

通过WSDL文档,客户端可以知道如何调用Web服务。

WSDL详解:1. 类型(Types):定义了Web服务中使用的数据类型,包括简单类型和复杂类型。

2. 消息(Message):定义了Web服务中的输入和输出参数,每个消息都包含一个或多个参数。

3. 端口类型(PortType):定义了Web服务中的方法(操作),以及方法的输入和输出消息。

4. 绑定(Binding):定义了Web服务的协议(如SOAP)和数据格式(如XML),以及端口地址。

5. 服务(Service):定义了Web服务的访问地址。

调用WebService的步骤:1. 获取WSDL文档:可以通过访问Web服务的URL获取WSDL文档。

2. 解析WSDL文档:使用工具(如wsimport、svcutil等)根据WSDL文档生成客户端代码。

3. 调用Web服务:使用生成的客户端代码调用Web服务的方法。

以Java为例,使用wsimport工具生成客户端代码并调用Web服务:```java// 导入生成的客户端代码import com.example.webservice.MyWebService;import com.example.webservice.MyWebServicePortType;public class WebServiceClient {public static void main(String[] args) {// 创建WebService代理对象MyWebServiceService service = new MyWebServiceService();MyWebServicePortType port = service.getMyWebServicePort();// 调用Web服务的方法String result = port.myMethod("Hello, WebService!");// 输出结果System.out.println("Result: " + result);}}```。

webservice调用具体方法

webservice调用具体方法

webservice调用具体方法摘要:1.什么是WebService2.如何调用WebService的具体方法3.调用过程中可能遇到的问题及解决方法4.实战案例分享正文:WebService,即网络服务,是一种跨平台的、基于XML(可扩展标记语言)的分布式计算技术。

它使得应用程序之间可以通过互联网进行通信,实现数据的交换和共享。

在实际开发中,调用WebService的具体方法如下:1.首先,确定你需要调用的WebService的地址和协议。

通常,WebService的地址是以WSDL(Web服务描述语言)文件形式提供的。

你可以通过WSDL文件查看WebService提供的接口和方法。

2.根据WSDL文件,生成客户端代码。

这可以通过使用诸如Apache CXF、JAX-WS等开源库来实现。

这些库会根据WSDL文件自动生成客户端代码,包括调用WebService的方法和处理响应的代码。

3.在生成的客户端代码中,找到调用WebService的具体方法。

这个方法通常是一个带有HTTP请求头的Web方法,如POST、GET等。

在方法中,传入所需的参数,这些参数通常包括在WSDL文件中定义的输入参数。

4.发送HTTP请求,并将响应结果解析为JSON、XML等格式。

这一步可以通过使用如Jackson、Gson等库来实现。

5.处理响应结果,并根据需要进行相应的业务逻辑处理。

在调用WebService的过程中,可能会遇到以下问题:1.网络问题:由于WebService通常跨网络调用,因此可能会遇到网络不稳定、延迟等问题。

为了解决这个问题,可以考虑使用重试策略、增加超时设置等方法。

2.服务异常:WebService可能会因为各种原因抛出异常,如参数不合法、服务器故障等。

为了解决这个问题,可以实现异常处理机制,如使用try-catch语句捕获异常,并根据需要进行日志记录、通知等操作。

3.身份验证和授权问题:为了避免unauthorized access,WebService 通常需要进行身份验证和授权。

wsdl文件结构分析

wsdl文件结构分析

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中的类型系统)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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样式用类型来数据定义过程调用,调用中的每一个元素表示某一个类型的参数。

相关文档
最新文档