一、什么是Web Service ?
Web Services 是有企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过internet来访问并使用这项在线服务
WebServicce的主要目标是跨平台的可互操作性。为了达到这一目标,WebService完全基于XML(可扩展标记语言)、XSD(XMLSchema)等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台
二、关键的技术和规则
1、WebService时,主要用到以下几个关键的技术和规则:
a、XML:描述数据的标准方法
b、SOAP:表示信息交换的协议(Simple Object Access Protocol)
二、 xml的数据交换
要了解xml数据交换,首先我们要了解什么是数据交换。
1、什么是数据交换
数据交换是指为了满足不同信息系统之间数据资源的共享需要,依据一定的原则,采取相应的技术,实现不同信息系统之间数据资源共享的过程。
客户端与服务器常用数据交换格式xml、json、html
2、数据交换格式应用场景
移动端(安卓、IOS)通讯方式采用http协议+JSON格式走restful风格。
很多互联网项目都采用Http协议+JSON
因为xml比较重WebService服务采用http+xml格式银行项目使用比较多
我们先以一张图来初步了解我们的xml数据传输:
如图所示:
首先我们来一步步解析它们各自的作用:
1.服务器端
服务器端组件主要完成以下三个功能:
第一:网络监听功能
当接收到客户端传来的请求时,会触发一个监听事件,在这一事件的处理代码中得到客户端的查询请求,然后执行数据库操作
第二:查询数据库功能
得到客户端的请求内容,在进入所在的数据库里查询到客户端所需要的内容,一般是把查询结果放进一个Map集合当中
第三:将查询结果封装成xml文件格式发送给客户端
为了把map集合转换成xml格式的文件,我们需要用到以下代码实例:
代码如下:
/**
* map转xml
* @param map
* @param body xml元素
* @return
*/
private static Element map2xml(Map<String, Object> map, Element body) {
Iterator<Map.Entry<String, Object>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<String, Object> entry = entries.next();
String key = entry.getKey();
Object value = entry.getValue();
if(key.startsWith("@")){ //属性
body.addAttribute(key.substring(1, key.length()), value.toString());
} else if(key.equals("#text")){ //有属性时的文本
body.setText(value.toString());
} else {
if(value instanceof java.util.List ){
List list = (List)value;
Object obj;
for(int i=0; i<list.size(); i++){
obj = list.get(i);
//list里是map或String,不会存在list里直接是list的,
if(obj instanceof java.util.Map){
Element subElement = body.addElement(key);
map2xml((Map)list.get(i), subElement);
} else {
body.addElement(key).setText((String)list.get(i));
}
}
} else if(value instanceof java.util.Map ){
Element subElement = body.addElement(key);
map2xml((Map)value, subElement);
} else {
body.addElement(key).setText(value.toString());
}
}
//System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
return body;
}
2.客户端
客户端的组件主要完成以下三个方面的工作:
第一:与服务器端建立连接
通过服务器端的监听程序建立连接
第二:发送查询请求
用户在客户端发出查询请求,通过建立的连接把请求发送到服务器端
第三:接收服务器端返回的xml文件,一般都是把它转换为Map集合的形式,并从中提取出所需的各项数据
为了把xml格式的文件转换成map集合,我们需要用到以下代码实例:
代码如下:
将XML文档转换为Map集合,方式也比较多,下面这种方式是DOM4J的方式:
Map<String, String> map=new HashMap<String,String>();
try {
InputStream is = new FileInputStream(new File("config.xml"));
SAXReader sax=new SAXReader(); //创建解析器
Document doc=sax.read(is); //创建对应的Document对象
Element root=doc.getRootElement(); //获取XML文档的根节点对象
List<Element> list = root.elements();
//获取根节点下的所有的子节点
for (Element ele : list) { //遍历根节点下的所有子节点并将其放入MAP对象中
map.put(ele.getName(), ele.getText());
}
is.close();
} catch (Exception e) {
e.printStackTrace();
}
如果对xml数据传输还有什么疑问,我们不妨通过我们身边具体的实例来理解:
假设我们有一个婚恋网站,用户向我们提出了一个查询要求,但他需要这些人的个人房产信息,个人车辆信息,个人资产情况,可我们网站只有最基本的个人信息,没有很详细的数据,这个时候我们就要向我们的派出所取得详细的信息。
我们通过画图来帮助我们理解这个过程
如图所示:
我相信通过这个事例我们就可以对xml数据传输可以有更进一步的了解。
xml和json数据交换的比较
数据传输不只有xml数据传输,还有json数据传输,而且json数据传输在使用范围上已经超过了xml数据传输
接下来让我们了解一下xml和json数据交换的比较,看看它们各自的优缺点:
JSON(Javascript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavascriptProgramming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++,C#, Java, Javascript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
JSON概念很简单,就是服务器直接生成Javascript语句,客户端获取后直接用eval方法来获得这个对象,这样就可以省去解析XML的性损失。
常用的JSON解析框架:
fastjson(阿里)、gson(谷歌)、jackson(SpringMVC自带)
如要从后台载入信息,写成XML,如下:
<contact>
<friend>
<name>Michael</name>
<email>17bity@gmail.com</email>
<homepage>http://www.jialing.net</homepage>
</friend>
<friend>
<name>John</name>
<email>john@gmail.com</email>
<homepage>http://www.john.com</homepage>
</friend>
<friend>
<name>Peggy</name>
<email>peggy@gmail.com</email>
<homepage>http://www.peggy.com</homepage>
</friend>
</contact>
而写成JSON:
[
{
name:"Michael",
email:"17bity@gmail.com",
homepage:"http://www.jialing.net"
},
{
name:"John",
email:"john@gmail.com",
homepage:"http://www.jobn.com"
},
{
name:"Peggy",
email:"peggy@gmail.com",
homepage:"http://www.peggy.com"
}
]
注意:{}包裹的是一个对象 JSONObject []包裹的是一个数据JSONArray
简单的不只是表达上,最重要的是可以丢弃让人晕头转向的DOM解析了。因为只要符合Javascript的声明规范,JavaScrip会自动帮你解析好 的。Ajax中使用JSON的基本方法是前台载入后台声明Javascript对象的字符串,用eval方法来将它转为实际的对象,最后通过 DHTML更新页面信息。
JSON不仅减少了解析XML解析带来的性能问题和兼容性问题,而且对于Javascript来说非常容易使用,可以方便的通过遍历数组以及访问对象属性 来获取数据,其可读性也不错,基本具备了结构化数据的性质。不得不说是一个很好的办法,而且事实上google maps就没有采用XML传递数据,而是采用了JSON方案。
JSON的另外一个优势是"跨域性",例如你在www.Web.cn的网页里使用
JSON的定义
一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。
XML的定义
扩展标记语言 (Extensible Markup Language,XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
[ XML ]
使 用XML作为传输格式的优势:
- 格式统一, 符合标准
- 容易与其他系统进行远程交互, 数据共享比较方便
缺点:
- XML文件格式文件庞大, 格式复杂, 传输占用带宽
- 服务器端和客户端都需要花费大量代码来解析XML, 不论服务器端和客户端代码变的异常复杂和不容易维护
- 客户端不同浏览器之间解析XML的方式不一致, 需要重复编写很多代码
- 服务器端和客户端解析XML花费资源和时间
[ JSON ]
优点:
- 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小
- 易于解析这种语言, 客户端JavaScript可以简单的通过eval_r()进行JSON数据的读取
- 支持多种语言, 包括ActionScript, C, C#, ColdFusion, Java,JavaScript, Perl, PHP, Python, Ruby等语言服务器端语言, 便于服务器端的解析
- 在PHP世界, 已经有PHP-JSON和JSON-PHP出现了, 便于PHP序列化后的程序直接调用. PHP服务器端的对象、数组等能够直接生JSON格式, 便于客户端的访问提取.
- 因为JSON格式能够直接为服务器端代码使用, 大大简化了服务器端和客户端的代码开发量, 但是完成的任务不变, 且易于维护
缺点:
- 没有XML格式这么推广的深入人心和使用广泛, 没有XML那么通用性
- JSON格式目前在Web Service中推广还属于初级阶段
JSON 和 XML 优缺点的比较
-
在可读性方面,JSON和XML的数据可读性基本相同。JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
-
在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,而JSON不能的。
-
在编码难度方面,XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
-
在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
-
在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(AsynchronousJavascript and JSON)了。
-
JSON和XML同样拥有丰富的解析手段。
-
JSON相对于XML来讲,数据的体积小。
-
JSON与JavaScript的交互更加方便。
-
JSON对数据的描述性比XML要差。
-
JSON的速度要远远快于XML。
实际上,对于大多数web应用来说,他们根本不需要复杂的XML来传输数据,XML宣称的扩展性在此就很少具有优势;许多Ajax应用甚至直接返回HTML片段来构建动态web页面。和返回XML并解析它相比,返回HTML片段大大降低了系统的复杂性,但同时缺少了一定的灵活性。同XML或 HTML片段相比,数据交换格式JSON 提供了更好的简单性和灵活性。在web serivice应用中,至少就目前来说XML仍有不可动摇的地位
谢谢观看,多多指教!