浅淡Webservice、WSDL三种服务访问的方式(附案例)
Webservice
Webservice是使应用程序以与平台和编程语言无关的方式进行相互通信技术。
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类的工具。
- 提供例子程序。
- 提供TCP/IP数据包监视工具。
Axis有四种Service styles,分别是:
- RPC(Remote Procedure Call Protocol远程访问调用协议,部署时属于默认选项)
- Document
- Wrapped
- Message
WSDD(Web Service Deployment Descriptor):Web服务分布描述,它定义了Web服务的接口,如服务名、提供的方法、方法的参数信息。
UDDI(Universal Description,Discovery,and Integration):统一描述、发现和集成,用于集中存放和查找WSDL描述文件,起着目录服务器的作用。
WSDL元素
WSDL元素基于XML语法描述了与服务进行交互的基本元素:
Type(消息类型):数据类型定义的容器,它使用某种类型系统(如XSD)。
Message(消息):通信数据的抽象类型化定义,它由一个或者多个part组成。
Part:消息参数
Operation(操作):对服务所支持的操作进行抽象描述,WSDL定义了四种操作:
- 单向(one-way):端点接受信息;
- 请求-响应(request-response):端点接受消息,然后发送相关消息;
- 要求-响应(solicit-response):端点发送消息,然后接受相关消息;
- 通知(notification):端点发送消息。
Port Type (端口类型):特定端口类型的具体协议和数据格式规范。
Binding:特定端口类型的具体协议和数据格式规范
Port :定义为绑定和网络地址组合的单个端点。
Service:相关端口的集合,包括其关联的接口、操作、消息等。
以上类图表达了Service、Port、Binding、Operation、Message之间的依赖、关联、聚合、合成、泛化、实现,这里暂不多说,若感兴趣,请参考该文章
UML类图关系大全:http://www.cnblogs.com/riky/archive/2007/04/07/704298.html
WSDL伪代码
WSDL 文档是利用这些主要的元素来描述某个 web service 的:
元素 定义
web service 执行的操作
<message> web service 使用的消息
<types> web service 使用的数据类型
<binding> web service 使用的通信协议
一个 WSDL 文档的主要结构是类似这样的:
<definitions>
<types>
definition of types........
</types>
<message>
definition of a message....
</message>
<portType>
definition of a port.......
</portType>
<binding>
definition of a binding....
</binding>
</definitions>
WSDL 文档可包含其它的元素,比如 extension 元素,以及一个 service 元素,此元素可把若干个 web services 的定义组合在一个单一的 WSDL 文档中
实践
为了形成鲜明的对比,客户端用CS架构来创建客户端。
实践之一:创建服务端
创建ASP.NET Web服务
代码示例
using System;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq; using DotNet.Model;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class Service : System.Web.Services.WebService
{
public Service () {
//如果使用设计的组件,请取消注释以下行
//InitializeComponent(); }
[WebMethod(Description="获取字符串",MessageName="HelloWorld")]
public string HelloWorld() {
return "Hello World";
} [WebMethod(Description="获取用户信息",MessageName="getCustomer")]
public Customer getCustomer(Customer cus1)
{
return cus1;
} [WebMethod(Description = "获取用户信息以参数形式", MessageName = "getCustomerFromParams")]
public Customer getCustomerFromParams(int id, string name, string address)
{
Customer cus1 = new Customer();
cus1.cus_id = id;
cus1.cus_name = name;
cus1.cus_address = address;
return cus1;
} }
实践之二:创建客户端
创建ASP.NET WEB客户端(以CS架构)
代码示例
(其中一种方式通过创建“服务引用”的方式,输入“http://localhost:端口号/XX.asmx?wsdl”方式,获得服务访问接口)
private ServiceReference1.ServiceSoapClient myclient = new ServiceReference1.ServiceSoapClient(); private void button1_Click(object sender, EventArgs e)
{
try
{
/* 第一种方式可以传参、传实体,返回实体 */
ServiceReference1.ServiceSoapClient myclient = new ServiceReference1.ServiceSoapClient();
ServiceReference1.Customer tem = new ServiceReference1.Customer();
tem.cus_id = int.Parse(textBox1.Text);
tem.cus_name = textBox2.Text;
tem.cus_address = textBox3.Text;
string str = JsonHelper.Jso_ToJSON(myclient.getCustomer(tem));
richTextBox1.Text = str;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void button2_Click(object sender, EventArgs e)
{
richTextBox1.Text = string.Empty;
try
{
richTextBox1.Text = myclient.HelloWorld();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void button4_Click(object sender, EventArgs e)
{
try
{
/* 第二种方式可以传参,返回实体(不能传入一个对象实体,但是配置动态灵活) */
string url = "http://localhost:3199/ServicePort/Service.asmx";
string methodname = "getCustomerFromParams"; object[] obj = new object[];
obj[] = int.Parse(textBox1.Text);
obj[] = textBox2.Text;
obj[] = textBox3.Text;
string str = JsonHelper.Jso_ToJSON(WebServiceHelper.InvokeWebService(url, methodname, obj));
richTextBox1.Text = str;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void button5_Click(object sender, EventArgs e)
{
try
{
/* 第三种方式可以传参、传实体,返回XmlDom(配置动态灵活,响应处理麻烦了点而已) */
string url = "http://localhost:3199/ServicePort/Service.asmx";
string methodname = "getCustomer";
Hashtable parm = new Hashtable();
string objectName = "cus1";
parm["cus_id"] = int.Parse(textBox1.Text);
parm["cus_name"] = textBox2.Text;
parm["cus_address"] = textBox3.Text;
XmlDocument oo = WebServiceXmlHelper.QuerySoapWebServiceByObject(url, methodname, objectName, parm);
richTextBox1.Text = oo.InnerXml;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
运行效果
服务端
WSDL
客户端(支持多平台,如服务器的Webservice用Java、.Net等)
第1种方式:传参、传实体,URL配置缺少灵活,数据处理灵活
第2种方式:传参,不能传实体,URL配置灵活, 数据处理要稍微加工
第3种方式:传参、传实体、URL配置灵活,数据处理要稍微加工
小结
- 如果只传递参数,可以用HTTP来传递,Webservice提供的接口如下
HTTP POST
以下是 HTTP POST 请求和响应示例。所显示的占位符需替换为实际值。
POST /ServicePort/Service.asmx/getCustomerFromParams HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: length id=string&name=string&address=string
返回接收串
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<Customer xmlns="http://tempuri.org/">
<cus_id>int</cus_id>
<cus_name>string</cus_name>
<cus_address>string</cus_address>
</Customer>
- 如果是传递实体或传递参数,也可以使用SOAP来传递,Webservice提供的接口如下
POST /ServicePort/Service.asmx HTTP/1.1
Host: localhost
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length <?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<getCustomerFromParams xmlns="http://tempuri.org/">
<id>int</id>
<name>string</name>
<address>string</address>
</getCustomerFromParams>
</soap12:Body>
</soap12:Envelope>
返回接收串:
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length <?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<getCustomerFromParamsResponse xmlns="http://tempuri.org/">
<getCustomerFromParamsResult>
<cus_id>int</cus_id>
<cus_name>string</cus_name>
<cus_address>string</cus_address>
</getCustomerFromParamsResult>
</getCustomerFromParamsResponse>
</soap12:Body>
</soap12:Envelope>
WebService向外发布接口的功能,能够更好的为其它平台提供数据以及现实信息平台一体化。
Word文档下载:浅淡Webservice、WSDL三种服务访问的方式.doc
源代码下载:http://files.cnblogs.com/yongfeng/001DotNetWebService.rar
参考网站:http://www.cnblogs.com/yongfeng/archive/2013/01/30/2883146.html
浅淡Webservice、WSDL三种服务访问的方式(附案例)的更多相关文章
- Webservice、WSDL三种服务访问的方式【转】
http://www.cnblogs.com/yongfeng/archive/2013/01/30/2883146.html 用soapUI试了下wsdl的测试,但还是不知道webService和W ...
- 九 三种Struts2访问Servlet方式总结
Servlet是单例的,Action是多例的. 多个程序访问Servlet只会创建一个Servlet对象,多个程序访问Action会创建对应的多个Action对象. 跳转页面可以获取对象的属性,说明使 ...
- 云计算的三种服务模式:SaaS/PaaS/IaaS
转载http://blog.chinaunix.net/uid-22414998-id-3141499.html 定义 云计算主要分为三种服务模式,而且这个三层的分法重要是从用户体验的角度出发的: S ...
- 云计算三种服务模式SaaS、PaaS和IaaS及其之间关系(顺带CaaS、MaaS)
云计算架构图 很明显,这五者之间主要的区别在于第一个单词,而aaS都是as-a-service(即服务)的意思,这五个模式都是近年来兴起的,且这五者都是云计算的落地产品,所以我们先来了解一下云计算是什 ...
- 云计算 --> 三种服务模式IaaS,PaaS,SaaS
三种服务模式IaaS,PaaS,SaaS “云”其实是互联网的一个隐喻,“云计算”其实就是使用互联网来接入存储或者运行在远程服务器端的应用,数据,或者服务.任何一个使用基于互联网的方法来计算,存储和开 ...
- Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress(转发)
原文 http://cloud.51cto.com/art/201804/570386.htm Kubernetes的三种外部访问方式:NodePort.LoadBalancer和Ingress 最近 ...
- 云计算的三种服务模式:IaaS,PaaS和SaaS
云服务”现在已经快成了一个家喻户晓的词了.如果你不知道PaaS, IaaS 和SaaS的区别,那么也没啥,因为很多人确实不知道. “云”其实是互联网的一个隐喻,“云计算”其实就是使用互联网来接入存储或 ...
- IaaS、PaaS、SaaS是云计算的三种服务模式
IaaS.PaaS.SaaS是云计算的三种服务模式 1. SaaS:Software-as-a-Service(软件即服务)提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户可以在各种设备 ...
- 01:云计算三种服务模式SaaS、PaaS和IaaS
1.1 云计算 1.什么是云计算 1. 云计算服务是指将大量用网络连接的计算资源统一管理和调度,构成一个计算资源池向用户按需服务. 2. 用户通过网络以按需.易扩展的方式获得所需资源和服务(资源包括网 ...
随机推荐
- keil教程
KEIL C51标准C编译器为8051微控制器的软件开发提供了C语言环境,但是界面是英文的好多初学者看很多教程都是一头雾水,这个相对简单的教程.KEIL C51编译器的功能不断增强,使你可以更加贴近C ...
- 面试:如何找出字符串的字典序全排列的第N种
1.题目 如何找出字符串的字典序全排列的第N种?(字符串全排列的变种) 2.思路 主要想通过这题,介绍一下康托展开式.基于康托展开式可以解决这个问题. 一般的解法:①求出所有全排列 ②按照字典序排个序 ...
- Android程序安装后在模拟器上不显示,并且控制台显示The launch will only sync the application package on the device!
初学安卓,今天写了一个小例子,可是eclipse控制台却提示 No Launcher activity found! The launch will only sync the application ...
- Rectangle and Square(判断正方形、矩形)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=42#problem/D 改了N多次之后终于A了,一直在改判断正方形和矩形那,判断 ...
- 一起啃PRML - Preface 前言
一起啃PRML - 前言 Preface @copyright 转载请注明出处 http://www.cnblogs.com/chxer/ PRML,Pattern Recognition and M ...
- 清除nginx静态资源缓存
之前写过一篇如何配置nginx缓存及手动清除缓存的文章: http://www.cnblogs.com/Eivll0m/p/4921829.html 但如果有大量缓存需要清理,手动一条条清理就比较慢了 ...
- JPush三分钟之后的事 fragmentActivity(一)
JPush是我用过的平台中最快的,比leanCloud短信验证快的多,当然leanCloud正在飞速的成长 另外江宏 是我的偶像啊:http://tech.sina.com.cn/i/2015-01- ...
- HDU-1035 Robot Motion
http://acm.hdu.edu.cn/showproblem.php?pid=1035 Robot Motion Time Limit: 2000/1000 MS (Java/Others) ...
- Linux cat命令详解
本文主要内容源自网络,参考资料如下: 华夏名网,linux cat命令详解,http://www.sudu.cn/info/html/edu/20070101/290711.html 命令格式:cat ...
- php正则常用表达式
[]里的.相当于\. 涉及到换行一般考虑用模式修正符s s (PCRE_DOTALL) 如果设置了这个修饰符, 模式中的点号元字符匹配所有字符, 包含换行符. 如果没有这个 修饰符, 点号不匹配换行符 ...