Android调用Web应用浅析
2015-11-14龙军杨鹏
龙军 杨鹏
摘要:该文主要研究Android访问JSP、ASP.NET等不同Web应用的方法及解决方案,分析了URL、HttpClient、HttpURLConnection网络应用的技术,对XML、JOSN数据的解析进行了比较,就asp.net、jsp和Web Service的应用资源生成、调用提出了解决方案。
关键词:Android;XML;JOSN;Web Service
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)22-0140-03
通过长期的信息化建设,基于互联网的Web应用已非常丰富,积累了大量的数据和资源,随着移动智能设备的普及,App应用大量涌现,APP的设计与制作不再是专业公司的专利,众多的企事业单位将原有系统进行APP化拓展已是大势所趋。将这些用不同语言编写、使用不同数据库的资源融入企业的APP应用中就是本文探讨的主题。
1 Android访问Web应用资源的主要途径
1.1 通过URL进行网络应用
URL统一资源定位器是指向互联网资源的指针,由协议名、主机、端口和资源组成:protocol://host:port/resourceName。常用方法有:获取URL资源名getFile()、获取URL查询字符串getQuery()、返回URL远程连接的URLConnection对象openConnection()、打开URL连接并返回其输入流openStream()等。
无参数直接用URL访问网络资源时openStream()方法读取指定资源并生成InputStream流,在本地对该输入流进行读取,如while(InputStream对象.read(byte[]数组对象)>=0){}将输入流读到字节数组中。
当提交参数时,则用URL的openConnection()方法返回的URLConnection对象(示例中的conn),建立起应用与URL间的通信连接,通过其实例发送请求并读取相关资源。发送GET方式请求时用connect()建立连接;发送POST方式请求时,取得URLConnection对象的输出流再发送请求参数。
1.2 使用Http访问网络
(1) 使用Apache HttpClient
为更好处理如Session、Cookie等,在Android中可用HttpPost和HttpGet封装post请求和get请求,用HttpClient的excute()方法发送post请求并返回服务器的响应数据。用HttpResponse的getAllHeaders()、getHeaders(String name)等方法获取服务器的响应头,用getEntity()方法获取HttpEntity对象,该对象包装了服务器的响应内容,程序通过该对象获取服务器的响应内容。
2 Android访问Web应用资源需解决的主要问题
2.1 中文乱码现象
网络通信中产生乱码的主要原因是编码不一致,多数终端设备都支持UTF-8字符集,而Java网络传输使用ISO-8859-1,调用资源时,可用EntityUtils.toString(数据,"编码")进行传输,也可用getBytes("编码")对汉字编码得到字节数组,再用new String(Bytes[],”解码”)对字节数组解码。
2.2 用DOM、SAX、Pull三种方式解析XML
1) DOM解析先将XML文件内容以文档树的方式存入内存,通过API遍历树、检索数据,简单易用,占内存多,用于数据量小的文件。DOM解析常用属性:元素Element、节点Node、节点名称nodeName、节点值nodeValue、属性attributes;常用方法:获取所有元素getDocumentElement()、获取指定标签的所有元素getElementsByTagName(name)、插入子节点appendChild(node)等。
2) SAX解析基于回调函数,速度快占用内存少,读取到开始或结束标签、节点、内容时就回调一个事件,事件源通过XMLReader的parser()方法解析并产生事件,事件处理器由ContentHander等4个接口集合而成,一般可用DefaultHandler类进行简化处理。
使用时创建SAXParserFactory对象,调用newSAXParser()方法生成SAXParser解析器,用getXMLReader()方法获得解析器的事件源对象XMLReader,实例化一个DeafultHandler对象,用setContentHandler将两者连接,通过XMLReader的parse()方法从输入源得到XML数据,最终由DefaultHandler对象返回数据。
3) Pull解析与SAX类似,也是基于回调,Pull回调时返回数字,操作更为便捷,通过parser.next()方法即可进入下一元素并触发事件。
2.3 用JSON進行数据交换
JSON是轻量级的数据交换语言,用编程语言对JSON对象进行生成和解析,实现数据交换。JSON和XML均有相同的数据可读性和丰富的解析手段,但JSON相较XML数据体积小、与JavaScript交互更方便、速度快,但JSON的数据描述性差。
JSONObject是JSON定义的基本单元,由健-值对构成,外部调用返回一个{健:值}字符串,内部用put(健,值)方法添加数值;JSONStringer创建JSON text;JSONArray值为数组,toString()输出时,值用逗号","隔开放在一对中括号内;JSONTokener是 JSON文本解析类,用Object nextValue()将JSON文本解析为对象。
JSONObject、JSONArray构建json文本时,先创建JSONObject对象,put()方法向里面加入数据,若添加同类型多数据,可创建JSONArray对象,将数据加入JSONArray对象后再加入JSONObject对象,也可将JSONObject对象加入另一JSONObject对象。获取时用getType("关键字")或optType("关键字")获取键的值并转换为指定类型。JSONStringer构建json文本时object和endObject配对使用,分别设置健和值,值为数组时要求array和endArray配对使用。
解析一条记录的Json时,创建JSONObject对象,用map.put("键",jsonObj.getType("键"))将数据加入Map对象。解析多条记录的Json,创建JSONArray对象,进行遍历,用((JSONObject)jsonObjs.opt(索引)) .getJSONObject("singer")獲得当前记录对象,再取内容。
3 Android调用Asp.net应用的解决方案
制作被手机调用Asp.net页面,设置网页的Request和Response的ContentEncoding编码为utf-8,用Request.Params["键"]得到传入参数后,获得要返回的数据内容,进行Xml处理后转换为字符串返回。
Android应用中首先将网址编码由utf-8转为ISO-8859-1,在将要传递的参数加入Map对象后生成List
4 Android调用Jsp应用的解决方案
Web端用jsp实现时,根据提交的参数取得数据并转换为XML格式,参数要用String(参数getBytes("iso-8859-1"),"utf-8")进行转码后再提交,获得的内容可用DOM、SAX、JDOM、DOM4J等方式解析,若获得的数据内容简单,可直接用字符串的形式加入XML标签生成,将生成的字符串由utf-8转为iso-8859-1编码输出。Android应用同上。
5 Android调用Web Service的解决方案
Web Service是发布在互联网上的一种完成特定需求的在线应用服务,基于XML和HTTPS,通信协议主要基于SOAP、用WSDL进行服务描述,通过UDDI来发现和获取服务。Web Service可以用C#、Java、PHP等任何语言编写,最后返回XML类型的数据。可由各种平台的应用进行交互,与RMI、CORBA等远程调用技术相比,Web Service跨平台、跨语言的特点使其应用广泛,但性能略低。
Android没有WebService相关的库,一种是通过加载XML格式的SOAP协议数据,把该数据与要提交的参数封装成实体并通过HTTP请求发送给WebService服务器,获得Web Service服务器返回的XML数据并进行解析。更常用的是采用ksoap2第三方包的方式,用SoapObject(WebService名称空间,方法名)创建SoapObject对象后,通过addProperty()增加要提交的参数,创建SoapSerializationEnvelope对象并指定其bodyOut属性为SoapObject对象实例,调用HttpTransport对象的call(完整的方法路径, SoapSerializationEnvelope对象)连接到指定WebService方法,通过getResponse()即可获得返回的数据。
针对目前众多已建有Web应用或网站的单位,在进行APP应用开发过程中,为利用现有的资源,可根据原有的平台制作相应的Web页面,将原不同语言、不同平台的的应用系统综合到统一的APP应用中,并结合互联网+的发展趋势,拓展新的功能和业态,实现资源的充分利用。
参考文献:
[1] 龙军. Android技术核心与应用开发[M].南海出版公司,2014.
[2] 姜文波,龙军. Android平台的套接字应用浅析[J].科技信息,2014(9).
[3] 龙军. 基于Java语言的流式套接字编程探析[J].电脑知识与技术,2013,9(10).
[4] 翟大昆. Android项目开发详解[M]. 北京:机械工业出版社,2012.
[5] 王小科. ASP.NET程序开发范例宝典[M].北京:人民邮电出版社,2012.