http://blog.csdn.net/hikaliv/article/details/6459779

一天的时间调通了一个 WebService 的 Java 端的 C/S、一个 Android 端的 C/S,调通了而已,很不爽,很闷。因为刚刚上手 JAVA & Eclipse,对于我这个用惯了 VS 2010 的同学来说,感觉大大的不好。被迫和陌生的感觉很容易让我这个巨蟹座的男人直接地由然而生强烈的抵触情绪。不过话说回来了,网络方面的东西我一直很感兴趣,苦于没有项目参与。谁让项目要求我 AXIS2 + Ecliipse + Tomcat + Android 呢?看在网络项目开发的面子上,忍了!

于是用两天的时间好好地看了看 20 多年前的故事,抽空儿看了看 SOA & SOAP & WebService 的东西,看了看 WSDL 和 SOAP 标准。

简单地说 WSDL 这东西,一种网络服务描述规范,它是一个实现 WebService 的组件,也只是提供一种描述的框架,如果想用 SOAP,就往里面添 SOAP 的元素节点,如果想用 MIME 的东西,就往里面添 MIME 的元素节点,想用 HTTP-GET/POST 的东西,就往里面添相应的元素节点。

搞清楚整个 WSDL 结构,了解构成 WSDL 内容的主要元素标签就可以了,还挺有层次感的:

  1. 1、Type
  2. 2、Message:需要交互的类型数据的定义
  3. 3、Operation:服务支持的某个动作描述
  4. 4、Porttype:由若干个 endpoint 支持的 Operation 集合
  5. 5、Binding:为某 Porttype 绑定的具体协议和数据格式规范
  6. 6、Port:定义为某  Binding 和某 network address 的联合的 endpoint
  7. 7、Service:相关 endpoints 集

SOA 这个东西很好。不过使用 AXIS2 + Eclipse + Tomcat 配起一个 WebService 架构,很烦!SOA 和 WebService 不是一个东西,SOA 是一个概念和模式、一种业务,WebService 是一种实现 SOA 理念的框架,一个工具。

开个玩笑说,话说 SOAP 这个词儿我刚看到的时候,还以为是所谓的 SOA + P……

SOAP 应是一种应用协议,初衷是针对 RPC 设计的;但和 HTTP 最初是奔着应用协议而设计的命运越来越像,它越来越有“堕落”到“传输协议”的倾向。不过无论 SOAP 还是 HTTP,都还是用于消息传输的应用协议。

有人说 SOAP = RPC + XML+ HTTP,基本上吧,不准的。还是试图点出 SOAP 和 HTTP 的关系了的。SOAP 消息的请求和响应动作,是需要映射为 HTTP 的请求和响应来完成 C/S 之间的通信的。怎么映射,不管了,反正就是这么回事儿。对于 WebService 来说,除了 SOAP 还有 HTTP-GET/POST 和 MIME 两种消息通信方式。但对于更好地实现 SOA 理念的要求来说,我们只关注 SOAP 就可以了。

SOAP 传的是什么,是 XML 数据元素,嗯……是序列化的 XML 数据元素。SOA 所谓的与终端平台无关嘛,那就是,无论什么业务,大家一起来遵循同一规范就是了—— SOAP + XML(应用协议和数据格式),这是典型的天下大一统的历史演变趋势,所以,我们泱泱华夏七千年文明历史,老祖宗早早就觉悟了,早早地推动天下大一统的治世理念了;洋人文明史才一千多年,觉悟得晚,刚刚才知道,是时候去推动天下大一统了,要不,这天下也太他妈的乱了。

对于开发来说,程序员需要搞清楚的应该是代码逻辑,尤其是这种遵循业务规范做开发编程的,与其说要搞清楚代码逻辑,不如说,必须得先搞清楚业务逻辑是什么,规范是什么,然后它们是如何反映到代码结构中的才是。

若是用 AXIS2 的 WSDL2JAVA 生出来的 STUB,那你开发客户端可就省大事儿了,不过自己去用代码建起整个请求响应的操作过程,包括指定端点,指定 URI,指定方法签名,指定参数,指定传输方式,指定请求目标,指定 SOAP 消息的哪个部分该填充哪个对像等等……你只需要指明要调用哪个服务方法,传什么参,怎么操作返回值就好了,关注点很集中,因为整个 SOAP 是怎么跑的你根本不用关心,反正肯定能成功就对了。

若你不想用或者不会用或者害怕用 WSDL2JAVA 工具生出来的代码,想自己写客户端,或者类似于做 ANDROID 上面的东西,要走 KSOAP2,客户端就得自己去写。这个时候就只能给自己个“勤奋好学求知”的理由去好好搞清楚整个 SOA & SOAP & WebService 是怎么个回事儿,回头来再看代码了。

不过使用 AXIS2 的包儿去写客户端和使用 KSOAP2 的包儿去写客户端还是有很大不同的。AXIS2 在背后还是替你做了很多工作,在这点上你一点儿选择都没有,使得基于 AXIS2 的包儿开发的客户端的代码逻辑很不怎么 SOAP,所以先看基于 KSOAP2 的客户端代码逻辑吧。

看之前,先想想,要想完整地在客户端处理一个 SOAP 请求/响应过程,需要准备什么?

我们回头看看 SOAP 的结构,一个信封,一个可有可无的头,一个体。信封指明谁来处理消息,也就是把消息寄给谁。使用 HTTP 通信的话,则须用 URI 填充 SOAP Action HTTP Header 域,这个域指明了这封信是要交给谁的。SOAP 体用来装 RPC 对像,而 RPC 包含需要调用的函数的一切信息,至少函数名、参数是必须指定的。使用 HTTP 传输 SOAP,则须指定服务端的 endpoint,用 URL 指定。

看,这些信息是明确一个完整 SOAP 过程的最小集了。它明确了,这个 SOAP 消息要怎么寄(HTTP),要寄到哪儿(endpoint/URL),寄给谁(URI/SOAP Action Header),寄的是什么(SOAP Body/RPC),而要求都写在 RPC 里面了。

好了,现在回头看代码:

// RPC 对像,服务方法所在命名空间和方法名 
SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME); 
// 方法的参数名和参数值 
rpc.addProperty(PARA_NAME, PARA_VALUE); 
// 使用 HTTP 传输,指定 URL,就是要把信寄到哪儿,URL 指定到 ?wsdl  
HttpTransportSE ht = new HttpTransportSE(URL); 
// 要写信了,指明是 soap 1.1 标准 
SoapSerializationEnvelope envelope = 
       new SoapSerializationEnvelope(SoapEnvelope.VER11); 
// 将 RPC 塞信里面 
envelope.bodyOut = rpc; 
// 这步很重要,告诉把信寄给谁,填充 SOAP Action Header 域 
ht.call(SOAP_ACTION, envelope); 
// 处理回馈 
if (envelope.getResponse() != null) { 
       // 返回对像是一个包含基础类型的封装体 
       SoapPrimitive re = (SoapPrimitive) envelope.getResponse(); 
       System.out.println(re.toString()); 
}

这段使用 KSOAP2 包开发的客户端代码逻辑,就已经很明白了吧!

使用 AXIS2 包开发的客刻端代码逻辑很不好看,它只需要照顾到几个围绕要调用的服务方法的方面:函数所在的服务端点、命名空间和函数签名、参数:

// 使用 RPC 方式调用WebService  
RPCServiceClient rpcClient = new RPCServiceClient(); 
Options soption = rpcClient.getOptions();           
// 函数所在的服务端点在哪儿,不用指定到 WSDL  
EndpointReference enpointref = 
       new EndpointReference("http://192.168.1.100:8080/axis2/services/hikaliv"); 
// 将端点引用与 RPC 对像关联  
soption.setTo(enpointref);  
// 参数 
Object[] inargs = new Object[]{"hikaliv"}; 
// 返回参数类型 
Class[] returnclasses = new Class[]{String.class}; 
// 指定要调用的方法及命名空间 
QName qname = new QName(NAMESPACE, METHOD_NAME); 
// 采用同步阻塞调用,等待结果反馈 
Object[] result=rpcClient.invokeBlocking(qname, inargs, returnclasses); 
for(Object obj : result){ 
       System.out.println(obj); 
}

随便聊聊 SOA & SOAP & WebService 的一些东西,以及客户端开发的代码逻辑解析的更多相关文章

  1. SOA,Webservice,SOAP,REST,RPC,RMI的区别与联系

    SOA,Webservice,SOAP,REST,RPC,RMI的区别与联系 SOA面向服务的软件架构(Service Oriented Architecture) 是一种计算机软件的设计模式,主要应 ...

  2. SOAP Webservice和RESTful Webservice

    http://blog.sina.com.cn/s/blog_493a845501012566.html REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的 ...

  3. Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice

    浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.RE ...

  4. 简单聊聊SOA和微服务

    转自:https://juejin.im/post/592f87feb123db0064e5ef7c  (2017-06) 简单聊聊SOA和微服务 架构设计中的朴素主义 前两天和一个朋友聊天,他向我咨 ...

  5. Restful是什么,SOAP Webservice和RESTful Webservice

    首先,应该怀着这样一种心态来学习Restful——Restful你可以将其理解一种软件架构风格,并且诠释了Http协议的设计初衷,所以不要把他理解的那么神秘,Restful风格有好处,当然也是有坏处的 ...

  6. PHP中调用Soap/WebService

    关于在PHP中如何调用Soap/WebService的描述,网络上有不少帖子.但是主要讲述了如何用PHP开发服务器端.客户端并加以关联,而很少触及在PHP中调用现成的WebService的情况.在本文 ...

  7. REST & SOAP webservice 小结

    REST: REST是一种架构设计,特点是面向资源,存在于互联网的任何事物都可以理解为资源,REST相比较SOAP WS具有比较低的开发门槛. 1. 网络上的事物被抽象成资源,每个资源对应唯一的资源标 ...

  8. Spring Boot SOAP Webservice例子

    前言 本文将学习如何利用Spring boot快速创建SOAP webservice服务: 虽然目前REST和微服务越来越流行,但是SOAP在某些情况下,仍然有它的用武之地: 在本篇 spring b ...

  9. SOA,ESB,WebService的关系

    1. 什么是SOA SOA(Service-Oriented Architecture)既服务导向架构,是指为了解决在inernet环境下业务集成的需要,通过连接能完成特定任务的独立功能实现的一种软件 ...

随机推荐

  1. [BZOJ1188][HNOI2007]分裂游戏(博弈论)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1188 分析: 设SG[i]表示一个石子在位置i上的SG值 这个很容易暴力求,因为i的后 ...

  2. STM32 (战舰)

    一.战舰STM32 1.引脚描述表---有ft 兼容5V 2.原理图----有ADC,不兼容5V 3.(1)学会基本外设:GPIO输入输出,外部中断,定时器,串口. (2)学会外设接口:SPI IIC ...

  3. 网站flash黑屏问题

    操作系统 专业回答 2012-04-12 20:44 看网站视频时,可以小屏看,不能最大化.最大化的时候,只有声音,图象卡住了不动. 解决办法: 1 打开视频 然后最大化 按键 击右健 设置 把加速硬 ...

  4. Spring学习进阶 (三) Spring AOP

    一.是什么AOP是Aspect Oriented Programing的简称,最初被译为“面向方面编程”:AOP通过横向抽取机制为无法通过纵向继承体系进行抽象的重复性代码提供了解决方案.比如事务的控制 ...

  5. Android 轻量级输入校验库:Fire Eye

    Fire Eye是一款轻量级简单易用的Android校验库. FireEye 2.0 在 1.0 的基础上,全部重写了代码,并优化了架构,性能上和逻辑上都大大提升.只需要几行代码,即可验证用户输入,并 ...

  6. Beta版本冲刺Day3

    会议讨论: 628:已经将原本写在jsp中的所有界面修饰代码转移到了css文件中,同时当页面跳转的时候也不会出现崩溃的现象,并且已经解决了上次无法连接数据库的问题.但是又遇到了一些新的小问题,希望明天 ...

  7. 'hibernate.dialect' must be set when no Connection avalable’

    一个错误'hibernate.dialect' must be set when no Connection avalable ‘ 网上也有不少人遇到这种问题,看上去好像是跟Hibernate的方言有 ...

  8. linux core dump 文件 gdb分析

    core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIG ...

  9. mxnet目录结构

    普通目录 R-package, R语言API, 因为用的python, 所以对R暂时不感兴趣 amalgamation, 将整个mxnet库打包成一个文件, 以方便直接在客户端调用, 如Android ...

  10. const、static、extern三个关键字

    默认情况下,C语言的全局变量是全世界都可以访问的,也就是全局变量可以跨文件访问. extern可以引用全局变量 例如,如果有一个全局变量int money = 100;extern int money ...