在Android中调用WebService实例
某些情况下我们可能需要与mysql或者oracle数据库进行数据交互,有些朋友的第一反应就是直接在android中加载驱动然后进行数据的增删改查。我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电;二是流量贵如金那。我个人比较推荐的做法是使用java或php等开发接口或者编写webservice进行数据库的增删该查,然后android调用接口或者webservice进行数据的交互。本文就给大家讲解在android中如何调用远程服务器端提供的webservice。
既然是调用webservice,我们首先的搭建webservice服务器。
下面演示的就是如何通过该网站提供的手机号码归属地查询webservice服务查询号码归属地
调用地址http://webservice.webxml.com.cn/webservices/mobilecodews.asmx?op=getmobilecodeinfo。
首先,将请求消息保存在xml文件中,然后使用$替换请求参数,如下:
mobilesoap.xml
<span style="font-size:16px;"><?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> <getmobilecodeinfo xmlns="http://webxml.com.cn/"> <mobilecode>$mobile</mobilecode> <userid></userid> </getmobilecodeinfo> </soap12:body> </soap12:envelope></span>
其次,设计mainactivity布局文件,
main.xml
<span style="font-size:16px;"><?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <textview android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="手机号码" /> <edittext android:id="@+id/mobilenum" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <button android:id="@+id/btnsearch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询" /> <textview android:id="@+id/mobileaddress" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </linearlayout></span>
下面贴出mainactivity,
在android中调用webservice还是比较简单的:请求webservice,获取服务响应的数据,解析后并显示。
<span style="font-size:16px;">package com.szy.webservice; import java.io.bytearrayoutputstream; import java.io.inputstream; import java.io.outputstream; import java.net.httpurlconnection; import java.net.url; import java.util.hashmap; import java.util.map; import java.util.regex.matcher; import java.util.regex.pattern; import org.xmlpull.v1.xmlpullparser; import android.app.activity; import android.os.bundle; import android.util.log; import android.util.xml; import android.view.view; import android.widget.button; import android.widget.edittext; import android.widget.textview; import android.widget.toast; /** * @author coolszy * @date 2012-3-8 * @blog http://blog.92coding.com */ public class mainactivity extends activity { private edittext mobilenum; private textview mobileaddress; private static final string tag = "mainactivity"; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); mobilenum = (edittext) this.findviewbyid(r.id.mobilenum); mobileaddress = (textview) this.findviewbyid(r.id.mobileaddress); button btnsearch = (button) this.findviewbyid(r.id.btnsearch); btnsearch.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { // 获取电话号码 string mobile = mobilenum.gettext().tostring(); // 读取xml文件 inputstream instream = this.getclass().getclassloader().getresourceasstream("mobilesoap.xml"); try { // 显示电话号码地理位置,该段代码不合理,仅供参考 mobileaddress.settext(getmobileaddress(instream, mobile)); } catch (exception e) { log.e(tag, e.tostring()); toast.maketext(mainactivity.this, "查询失败", 1).show(); } } }); } /** * 获取电话号码地理位置 * * @param instream * @param mobile * @return * @throws exception */ private string getmobileaddress(inputstream instream, string mobile) throws exception { // 替换xml文件中的电话号码 string soap = readsoapfile(instream, mobile); byte[] data = soap.getbytes(); // 提交post请求 url url = new url("http://webservice.webxml.com.cn/webservices/mobilecodews.asmx"); httpurlconnection conn = (httpurlconnection) url.openconnection(); conn.setrequestmethod("post"); conn.setconnecttimeout(5 * 1000); conn.setdooutput(true); conn.setrequestproperty("content-type", "application/soap+xml; charset=utf-8"); conn.setrequestproperty("content-length", string.valueof(data.length)); outputstream outstream = conn.getoutputstream(); outstream.write(data); outstream.flush(); outstream.close(); if (conn.getresponsecode() == 200) { // 解析返回信息 return parseresponsexml(conn.getinputstream()); } return "error"; } private string readsoapfile(inputstream instream, string mobile) throws exception { // 从流中获取文件信息 byte[] data = readinputstream(instream); string soapxml = new string(data); // 占位符参数 map<string, string> params = new hashmap<string, string>(); params.put("mobile", mobile); // 替换文件中占位符 return replace(soapxml, params); } /** * 读取流信息 * * @param inputstream * @return * @throws exception */ private byte[] readinputstream(inputstream inputstream) throws exception { byte[] buffer = new byte[1024]; int len = -1; bytearrayoutputstream outsteam = new bytearrayoutputstream(); while ((len = inputstream.read(buffer)) != -1) { outsteam.write(buffer, 0, len); } outsteam.close(); inputstream.close(); return outsteam.tobytearray(); } /** * 替换文件中占位符 * * @param xml * @param params * @return * @throws exception */ private string replace(string xml, map<string, string> params) throws exception { string result = xml; if (params != null && !params.isempty()) { for (map.entry<string, string> entry : params.entryset()) { string name = "\\$" + entry.getkey(); pattern pattern = pattern.compile(name); matcher matcher = pattern.matcher(result); if (matcher.find()) { result = matcher.replaceall(entry.getvalue()); } } } return result; } /** * 解析xml文件 * @param instream * @return * @throws exception */ private static string parseresponsexml(inputstream instream) throws exception { xmlpullparser parser = xml.newpullparser(); parser.setinput(instream, "utf-8"); int eventtype = parser.geteventtype();// 产生第一个事件 while (eventtype != xmlpullparser.end_document) { // 只要不是文档结束事件 switch (eventtype) { case xmlpullparser.start_tag: string name = parser.getname();// 获取解析器当前指向的元素的名称 if ("getmobilecodeinforesult".equals(name)) { return parser.nexttext(); } break; } eventtype = parser.next(); } return null; } }</span>
最后注意,由于需要访问网络,需要加上权限
<span style="font-size:16px;"><uses-permission android:name="android.permission.internet"/></span>
通过上面简单的例子,相信大家已经学习了如何在android中调用webservice,最后运行效果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Android 动态改变布局实例详解
推荐阅读
-
在Android中调用WebService实例
-
Android中在GridView网格视图上实现item拖拽交换的方法
-
Android中TimePicker与DatePicker时间日期选择组件的使用实例
-
Maven在Windows中的配置以及IDE中的项目创建实例
-
Android中在GridView网格视图上实现item拖拽交换的方法
-
Android中RecyclerView上拉下拉,分割线,多条目的实例代码
-
c# 在windows服务中 使用定时器实例代码
-
Android调用堆栈跟踪实例分析
-
在Sql Server中调用外部EXE执行程序引发的问题
-
在spring中实例化bean无效的问题