在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,最后运行效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android通过Webservice操作sqlserver数据库实例代码

    首页在AndroidManifest.xml中添加访问数据库权限 <uses-sdk android:minSdkVersion="7" /> <uses-permission android:name="android.permission.INTERNET" /> 在src中新建一个连接webservice的类,名字随意,这里叫做"HttpConnSoap".基本上这个类是固定的,要改的大多数就是webservice端

  • android中soap协议使用(ksoap调用webservice)

    如下面代码所示: 复制代码 代码如下: SoapObject request  = new SoapObject(serviceNamespace, methodName); SoapObject构造函数的两个参数含义为: serviceNamespace – 你的webservice的命名空间,既可以是 http://localhost:8088/flickrBuddy/services/Buddycast这样的,也可以是 urn:PI/DevCentral/SoapService这样的: m

  • 在Android中访问WebService接口的方法

    需要引入ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar 复制代码 代码如下: //WebService的命名空间 static final String namespace = "http://impl.service.suncreate.com"; //服务器发布的url static final String url = http://10.100.3.41/axis2/services/UploadService;

  • Android 通过webservice上传多张图片到指定服务器详解

    Android 通过webservice上传多张图片到指定服务器详解 当你浏览这个的时候相信你对webservice的基本应用已经有一定的了解了,若是还没有明白的小伙伴,可以看我前面写的文章点击打开链接,这几天在开发一款app,需要上传图片到指定服务器吧,但是我刚开始以为在网上面应该有这样的好文章的吧,结果我在网络上找了好多代码,在传递图片的过程中,遇到各种bug,真是国人的东西就是喜欢复制别人的,自己不动手检验一下代码的正确性,哎,我也是无语了,然后我决定花点时间来填补一下这个空缺,写了这一片

  • Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍

    Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍 最近在学校搞点东西,搞了2天的webservice,心累呀,今天中午和小伙伴终于弄通了,感觉就是一些细节问题没有注意到,啊,我的时间呀,进这么过去了,为了不让小伙伴们走弯路,我还是认真的把开发文档写一遍吧! 首先,如果我们要用CXF发布webservice用自定义类型的对象来当参数传递的话,我们应该先把这个类序列化一遍,下面就是我测试的代码,我创建了一个TGrade类,实现了KvmSerializable接

  • Android ksoap调用webservice批量上传多张图片详解

    Android ksoap调用webservice批量上传多张图片详解 这几天一直在开发app,哎呀,什么都是第一接触,想想自己自学Java,然后自学Android,一直没有放弃,曾想放弃的,但是想到爸妈供我上学,不能在宿舍里面玩游戏,加入学校实验室,一天没课就来着里学习,当然这里也有志同道合的人,一起努力一起进步!虽然大学这几年都在努力的学习技术,也没有参加什么活动的,更别说找个女伴了!还是老老实实的敲代码,成功给我带来巨大的潜能,新技术总是吸引着我.自己做项目,哎呀!好像说偏题了,言归正传吧

  • Android开发调用WebService的方法示例

    本文实例讲述了Android开发调用WebService的方法.分享给大家供大家参考,具体如下: WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台.不同语言.不同技术整合到一块.在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService.PC版本的WEbservice客户端库非常丰富,例如Axis2,CXF等,但这些开发包对于Android系统过于庞大,也未必很容易移植到Andr

  • Android 中利用 ksoap2 调用 WebService的示例代码

    去年刚刚工作的时候,第一个项目是要访问 WebService.由于没有接触过,查了很多资料,在别人代码的基础上稍微修改了一下,总算满足了自己的需求.最近整理电脑的时候,发现了这个 WebService 的访问类,怕哪一天需要的时候找不到了,干脆写在博客上吧,也给需要的人提供一个参考. 1.下载 ksoap2 的 jar 文件 下载地址:ksoap2-android-assembly-3.6.1-jar-with-dependencies.jar 下载完成后依赖到自己的项目中即可. 2.封装网络访

  • android调用WebService实例分析

    本文实例讲述了android调用WebService的方法.分享给大家供大家参考.具体如下: WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台.不同语言.不同技术整合到一块.在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService.PC版本的WEbservice客户端库非常丰富,例如Axis2,CXF等,但这些开发包对于Android系统过于庞大,也未必很容易移植到Androi

  • 在Android中调用WebService实例

    某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查.我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电:二是流量贵如金那.我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互.本文就给大家讲解在Android中如何调用远程服务器端提供的WebService. 既然是调用WebS

  • Android 中ContentProvider的实例详解

    Android 中ContentProvider的实例详解 Content Provider 的简单介绍: * Android中的Content Provider 机制可支持在多个应用中存储和读取数据.这也是跨应用 共享数据的唯一方式.在Android系统中,没有一个公共的内存区域,供多个应用共享存储数据: * Android 提供了一些主要数据类型的ContentProvider ,比如:音频.视频.图片和私人通讯录等: 在android.provider 包下面找到一些android提供的C

  • Android 中 ActivityLifecycleCallbacks的实例详解

    Android 中 ActivityLifecycleCallbacks的实例详解           以上就是使用ActivityLifecycleCallbacks的实例,代码注释写的很清楚大家可以参考下, MyApplication如下: package com.cc; import java.util.LinkedList; import android.app.Activity; import android.app.Application; import android.os.Bun

  • Java中的instanceof关键字在Android中的用法实例详解

    在下面介绍Android中如何使用instanceof关键字开发更方便时,先来温习一下java中instanceof的概念. instanceof大部分的概念是这样定义的:instanceof是Java的一个二元操作符,和==,>,<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据.举个栗子: String s = "I AM an Object!"; boolean isObj

  • C#调用WebService实例开发

    一.基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册.简单的理解就是:webservice 就是放在服务器上的函数,所有人都可以调用,然后返回信息. 比如google就有一个web service ,你调用它就可以很容易的做一个搜索网站. 就像调用函数一样,传入若

  • C#调用WebService实例与开发教程(推荐)

    1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册. XML:(Extensible Markup Language)扩展型可标记语言.面向短期的临时数据处理.面向万维网络,是Soap的基础. Soap:(Simple Object A

  • ASP.NET Core项目中调用WebService的方法

    一.前言 现实生产中,有一些比较老的系统对外提供的接口都是WebService形式的,如果是使用.NET Framework创建的项目调用WebService非常方便,网上有很多代码示例,这里不在讲解,下面我们讲解如何在ASP.NET Core项目里面调用WebService.首先我们需要创建一个WebService项目和一个ASP.NET Core WebApi项目.创建的WebService代码如下: using System.Web.Services; namespace CoreCall

  • Android 中WallpaperManager用法实例

    Android 中WallpaperManager用法实例 注意:壁纸的设置得加入权限: <uses-permission android:name="android.permission.SET_WALLPAPER"/> 1.WallpaperManager  对象的获得: wallpaperManager =WallpaperManager.getInstance(this); 2.设置壁纸的方法: 方法一:wallpaperManager.setBitmap(); /

随机推荐