在Android中调用WebService

某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电;二是流量贵如金那。我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。
既然是调用WebService,我们首先的搭建WebService服务器。为了便于操作,我们就使用网上免费的WebService进行学习。
地址:http://www.webxml.com.cn/zh_cn/index.aspx
下面演示的就是如何通过该网站提供的手机号码归属地查询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>

 

 

 

 

 

posted @ 2013-07-01 09:00  最後的輕語  阅读(529)  评论(0编辑  收藏  举报