在Android应用开发中,经常需要与网络上的服务端的程序(J2EE或者.NET等应用)进行通信、交互。例如“优酷、土豆”的android客户端,每天访问都会有最新的视频资讯,那些是哪里来的呢?如果你正在从事企业级开发,你们公司的CRM系统需要开发一个Android手机移动版本,方便随时随地联系、关怀客户。那android客户端上需要显示的客户列表和基本信息那些从哪里来呢?当然,公司可以让每个人打开电脑,对着屏幕上的CRM系统,不停的往自己手机里面去录入,然后一条条存起来。(很显然没人会这么干)

更为“明智”的一种方式是:公司的CRM系统提供一个webservice接口,android客户端去访问,读取到数据后,然后存入SqlLite数据库中(这是其中一种存储方式),定期更新并同步数据。这样省去了不少人力和时间,也保证了数据的正确性,实时性。

那在android开发中,如何访问网络上webservice呢?本文将通过一个“手机归属地查询工具”实例的方式,向大家详细介绍,在android中如何调用远程服务器端提供的webservice,实现典型的移动互联网分布式应用。有些软件厂商和作者总喜欢“故作神秘”,将这种分布式的应用称之为所谓的“云计算”。真是浮云啊!

第一步

上网google到一个可靠并且免费的webservice地址。推荐一个网站:http://www.webxml.com.cn/zh_cn/index.aspx

找到了“天气预报”的服务公开地址为:http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx。

好吧。先在浏览器中访问该地址,输入自己的手机号码测试一下,看是否可靠。

调用http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo,观察SOAP消息规范。

关于什么是WebService?WebService的原理、SOAP消息等等方面的知识,不是本文讨论的重点,请参阅博客园其他文章。

我们需要的是请求webservice,获取服务响应的数据,解析后并显示。首先,将服务公布的SOAP请求消息保存在XML文件中,然后使用$替换请求参数,如下。

<?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>

下一步:建立项目,并完成基本的软件界面布局。文件如下:

<?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="@string/mobile"/>

<EditText android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:id="@+id/mobile"/>

<Buttonandroid:layout_width="wrap_content"     android:layout_height="wrap_content"     android:text="@string/button"    android:id="@+id/button"/>

<TextView  android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:id="@+id/address"/></LinearLayout>

接下来正式开始编码了,接收用户输入,给界面上的按钮设置事件,完成界面数据显示及用户提示等。

package cn.itcast.mobile.address;

import java.io.InputStream;

import cn.itcast.service.MobileInfoService;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;

public class MainActivity extends Activity {private EditText mobileText;private TextView addressView;private static final String TAG = "MainActivity";

    @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);        setContentView(R.layout.main);

        mobileText = (EditText)this.findViewById(R.id.mobile);        addressView = (TextView)this.findViewById(R.id.address);        Button button = (Button)this.findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {                        @Overridepublic void onClick(View v) {                String mobile = mobileText.getText().toString();                InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("mobilesoap.xml");try {                    addressView.setText(MobileInfoService.getMobileAddress(inStream, mobile));                } catch (Exception e) {                    Log.e(TAG, e.toString());                    Toast.makeText(MainActivity.this, "查询失败", 1).show();                }            }        });    }}

下面的代码,才是重点(包含http网络编程,XML编程等)。

主要步骤就是读取SOAP消息XML文件,动态替换soap参数,发送http响应,等待服务端响应,解析服务端响应的数据,返回给Activity去完成页面显示/提示。

package cn.itcast.service;

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.util.Xml;import cn.itcast.utils.StreamTool;

public class MobileInfoService {

private static String readSoapFile(InputStream inStream, String mobile) throws Exception{byte[] data = StreamTool.readInputStream(inStream);        String soapxml = new String(data);        Map<String, String> params = new HashMap<String, String>();        params.put("mobile", mobile);return replace(soapxml, params);    }

public static 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 = "\\{1}quot;+ entry.getKey();                Pattern pattern = Pattern.compile(name);                Matcher matcher = pattern.matcher(result);if(matcher.find()){                    result = matcher.replaceAll(entry.getValue());                }            }        }return result;    }

public static String getMobileAddress(InputStream inStream, String mobile)throws Exception{        String soap = readSoapFile(inStream, mobile);byte[] data = soap.getBytes();        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);//如果通过post提交数据,必须设置允许对外输出数据        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 null;    }

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;    }}

最后提醒大家一句,记得在项目清单文件中,加入网络访问权限,否则无法访问公网。(笔者就因为一时大意,弄了一身汗,还好有Android单元调试和日志控制台比较方便,严重推荐大家使用)。

 <!-- 访问网络的权限 --><uses-permission android:name="android.permission.INTERNET"/>

好了,通过上面简单的例子,相信读者已经明白了webservice的调用方式。效果图我就不贴了,读者不妨动手去实践吧。

更多Android系列文章,请访问http://blog.csdn.net/dinglang_2009/article/category/887633


转载于:https://www.cnblogs.com/dinglang/archive/2012/03/08/2385019.html

Android手机归属地查询工具相关推荐

  1. [解读小程序]手机归属地查询Demo(四)

    [解读小程序]手机归属地查询Demo(四) 分析的程序来源: http://blog.csdn.net/y1258429182/article/details/52666290 下载链接:http:/ ...

  2. wp7 手机归属地查询

    ps:之前一直看卤面网,看博客园里强人关于wp7开发介绍等也快大半个月了,不得不说实践是检验真理的唯一标准,还得自己动手做,这个是我做的第一个wp7小程序:手机归属地查询.不废话,先上图: 此应用拥有 ...

  3. JavaScript学习:利用第三方接口做手机归属地查询

    逆战学习 整理一下关于怎么获取接口数据,然后渲染数据到页面上 第三方接口地址:手机归属地查询 一.思路和大致需要用到的知识点 1.body标签里准备一个input和button,用一个盒子包起来,一个 ...

  4. HTML5第9节课堂笔记(初探mui,制作手机归属地查询)

    手机MUI程序 ,利用它的ajax方法访问baidu的API http://apistore.baidu.com/apiworks/servicedetail/794.html http://dev. ...

  5. J2ME:手机归属地查询软件

    最近在网上下载了一个"猫头鹰"手机归属地查询软件,界面太繁杂,看着很不爽,于是自己也做了一个.速度也有明显的改进: 原版的软件一次读取整个文件,我这个一次只读取一组,比较完后再读取 ...

  6. php实现手机归属地的查询、,PHP实现手机归属地查询API接口实现代码

    我们经常会开发一些行业分类的网站,这个时候我们需要显示手机归属这个功能,这个时候我们找了很多API接口的地址,但是都不如人意,那么PHP实现手机归属地查询API接口实现代码,大家清楚吗?一起去看看爱站 ...

  7. 实现手机归属地查询页面

    实现手机归属地查询页面 看图!!! 页面的实现: 使用Ajax异步请求向服务器发送请求,请求手机号归属地查询,然后动态生成列表,显示手机号码段,卡号归属地,卡的类型等信息,代码如下: <!DOC ...

  8. 12、手机归属地查询API接口,免费好用

    1.前言 手机归属地查询接口,这个是RollToolsApi通用系列接口的其中一个,内部包含了1个小接口,能实现查询手机号的归属地,可用于粗略估算注册用户的所在地. 查看接口完整信息:https:// ...

  9. 使用jQuery的ajax的方法完成一个手机归属地查询

    使用jQuery的ajax的方法完成一个手机归属地查询 1.设计页面的效果: 2. 选用HTTP GET方法,将电话提交到服务端,并将返回的结果显示在界面相应的位置: 3. 服务端API地址:http ...

最新文章

  1. 资源高效搜索方法,你 Get 到了吗?
  2. 『PyTorch』第五弹_深入理解autograd_中:Variable梯度探究
  3. PgSQL · 应用案例 · 阿里云 RDS PostgreSQL 高并发特性 vs 社区版本
  4. 如何判断数组是静态还是动态分配的
  5. vue项目中使用JSX
  6. 关于slot、slot-scope的指令的一些操作记录
  7. webstorm卡顿问题
  8. 微信重大更新,mac版可刷朋友圈!可以看,可以评论! 支持M1
  9. UWP ListView 绑定 单击 选中项 颜色
  10. Linux简单死锁程序,Linux 死锁例子
  11. 【UOJ】【34】多项式乘法
  12. 最优矩阵链乘(动态规划)
  13. ENSP配置华为路由器配置SSH登陆
  14. 【C++初阶:STL简介】
  15. Go 原生插件使用问题全解析
  16. 游戏开发物语方案点数分配_《游戏开发物语》官方超全新手攻略和名词解析!...
  17. 考研英语 - word-list-11
  18. [对话CTO]当当网熊长青:兴趣是成为优秀工程师的第一因素-CSDN.NET
  19. css 超链接样式设置
  20. springboot整合mybatis:Consider defining a bean of type 'com.mk.mapper.UserMapper'

热门文章

  1. PTA天梯训练赛一二
  2. # 计算圆周长和面积
  3. 如何取消计算机共享密码设置,win7系统计算机取消共享密码的操作方法
  4. 台式计算机windows7系统怎么做,台式电脑如何安装win7系统
  5. cache是什么?作用是什么?位置在哪?
  6. Echarts字体和线条颜色设置操作笔记
  7. C++控制台实现滚动字幕
  8. centos 日志审计_CentOS7下安全审计工具Auditd的简单使用
  9. 2015最新经典语句搞笑段子
  10. win10远程登录Ubuntu14.04图形化界面