在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
[html]  view plain copy
  1. <span style="font-size:16px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <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">  
  3.   <soap12:Body>  
  4.     <getMobileCodeInfo xmlns="http://WebXml.com.cn/">  
  5.       <mobileCode>$mobile</mobileCode>  
  6.       <userID></userID>  
  7.     </getMobileCodeInfo>  
  8.   </soap12:Body>  
  9. </soap12:Envelope></span>  
其次,设计MainActivity布局文件,
main.xml
[html]  view plain copy
  1. <span style="font-size:16px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:orientation="vertical"  
  5.     android:layout_width="fill_parent"  
  6.     android:layout_height="fill_parent">  
  7.     <TextView  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="手机号码" />  
  11.     <EditText  
  12.         android:id="@+id/mobileNum"   
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:text=""  
  16.         />  
  17.     <Button  
  18.         android:id="@+id/btnSearch"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"  
  21.         android:text="查询"  
  22.         />  
  23.     <TextView  
  24.         android:id="@+id/mobileAddress"  
  25.         android:layout_width="fill_parent"  
  26.         android:layout_height="wrap_content"  
  27.         />  
  28. </LinearLayout></span>  
下面贴出MainActivity,
在Android中调用WebService还是比较简单的:请求webservice,获取服务响应的数据,解析后并显示。
[java]  view plain copy
  1. <span style="font-size:16px;">package com.szy.webservice;  
  2.   
  3.   
  4. import java.io.ByteArrayOutputStream;  
  5. import java.io.InputStream;  
  6. import java.io.OutputStream;  
  7. import java.net.HttpURLConnection;  
  8. import java.net.URL;  
  9. import java.util.HashMap;  
  10. import java.util.Map;  
  11. import java.util.regex.Matcher;  
  12. import java.util.regex.Pattern;  
  13.   
  14.   
  15. import org.xmlpull.v1.XmlPullParser;  
  16.   
  17.   
  18. import android.app.Activity;  
  19. import android.os.Bundle;  
  20. import android.util.Log;  
  21. import android.util.Xml;  
  22. import android.view.View;  
  23. import android.widget.Button;  
  24. import android.widget.EditText;  
  25. import android.widget.TextView;  
  26. import android.widget.Toast;  
  27.   
  28.   
  29. /** 
  30.  * @author coolszy 
  31.  * @date 2012-3-8 
  32.  * @blog http://blog.92coding.com 
  33.  */  
  34. public class MainActivity extends Activity  
  35. {  
  36.     private EditText mobileNum;  
  37.     private TextView mobileAddress;  
  38.     private static final String TAG = "MainActivity";  
  39.   
  40.   
  41.     @Override  
  42.     public void onCreate(Bundle savedInstanceState)  
  43.     {  
  44.         super.onCreate(savedInstanceState);  
  45.         setContentView(R.layout.main);  
  46.   
  47.   
  48.         mobileNum = (EditText) this.findViewById(R.id.mobileNum);  
  49.         mobileAddress = (TextView) this.findViewById(R.id.mobileAddress);  
  50.         Button btnSearch = (Button) this.findViewById(R.id.btnSearch);  
  51.         btnSearch.setOnClickListener(new View.OnClickListener()  
  52.         {  
  53.             @Override  
  54.             public void onClick(View v)  
  55.             {  
  56.                 // 获取电话号码  
  57.                 String mobile = mobileNum.getText().toString();  
  58.                 // 读取xml文件  
  59.                 InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("mobilesoap.xml");  
  60.                 try  
  61.                 {  
  62.                     // 显示电话号码地理位置,该段代码不合理,仅供参考  
  63.                     mobileAddress.setText(getMobileAddress(inStream, mobile));  
  64.                 } catch (Exception e)  
  65.                 {  
  66.                     Log.e(TAG, e.toString());  
  67.                     Toast.makeText(MainActivity.this"查询失败"1).show();  
  68.                 }  
  69.             }  
  70.         });  
  71.     }  
  72.   
  73.   
  74.     /** 
  75.      * 获取电话号码地理位置 
  76.      *  
  77.      * @param inStream 
  78.      * @param mobile 
  79.      * @return 
  80.      * @throws Exception 
  81.      */  
  82.     private String getMobileAddress(InputStream inStream, String mobile) throws Exception  
  83.     {  
  84.         // 替换xml文件中的电话号码  
  85.         String soap = readSoapFile(inStream, mobile);  
  86.         byte[] data = soap.getBytes();  
  87.         // 提交Post请求  
  88.         URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");  
  89.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  90.         conn.setRequestMethod("POST");  
  91.         conn.setConnectTimeout(5 * 1000);  
  92.         conn.setDoOutput(true);  
  93.         conn.setRequestProperty("Content-Type""application/soap+xml; charset=utf-8");  
  94.         conn.setRequestProperty("Content-Length", String.valueOf(data.length));  
  95.         OutputStream outStream = conn.getOutputStream();  
  96.         outStream.write(data);  
  97.         outStream.flush();  
  98.         outStream.close();  
  99.         if (conn.getResponseCode() == 200)  
  100.         {  
  101.             // 解析返回信息  
  102.             return parseResponseXML(conn.getInputStream());  
  103.         }  
  104.         return "Error";  
  105.     }  
  106.   
  107.   
  108.     private String readSoapFile(InputStream inStream, String mobile) throws Exception  
  109.     {  
  110.         // 从流中获取文件信息  
  111.         byte[] data = readInputStream(inStream);  
  112.         String soapxml = new String(data);  
  113.         // 占位符参数  
  114.         Map<String, String> params = new HashMap<String, String>();  
  115.         params.put("mobile", mobile);  
  116.         // 替换文件中占位符  
  117.         return replace(soapxml, params);  
  118.     }  
  119.   
  120.   
  121.     /** 
  122.      * 读取流信息 
  123.      *  
  124.      * @param inputStream 
  125.      * @return 
  126.      * @throws Exception 
  127.      */  
  128.     private byte[] readInputStream(InputStream inputStream) throws Exception  
  129.     {  
  130.         byte[] buffer = new byte[1024];  
  131.         int len = -1;  
  132.         ByteArrayOutputStream outSteam = new ByteArrayOutputStream();  
  133.         while ((len = inputStream.read(buffer)) != -1)  
  134.         {  
  135.             outSteam.write(buffer, 0, len);  
  136.         }  
  137.         outSteam.close();  
  138.         inputStream.close();  
  139.         return outSteam.toByteArray();  
  140.     }  
  141.   
  142.   
  143.     /** 
  144.      * 替换文件中占位符 
  145.      *  
  146.      * @param xml 
  147.      * @param params 
  148.      * @return 
  149.      * @throws Exception 
  150.      */  
  151.     private String replace(String xml, Map<String, String> params) throws Exception  
  152.     {  
  153.         String result = xml;  
  154.         if (params != null && !params.isEmpty())  
  155.         {  
  156.             for (Map.Entry<String, String> entry : params.entrySet())  
  157.             {  
  158.                 String name = "\\$" + entry.getKey();  
  159.                 Pattern pattern = Pattern.compile(name);  
  160.                 Matcher matcher = pattern.matcher(result);  
  161.                 if (matcher.find())  
  162.                 {  
  163.                     result = matcher.replaceAll(entry.getValue());  
  164.                 }  
  165.             }  
  166.         }  
  167.         return result;  
  168.     }  
  169.   
  170.   
  171.     /** 
  172.      * 解析XML文件 
  173.      * @param inStream 
  174.      * @return 
  175.      * @throws Exception 
  176.      */  
  177.     private static String parseResponseXML(InputStream inStream) throws Exception  
  178.     {  
  179.         XmlPullParser parser = Xml.newPullParser();  
  180.         parser.setInput(inStream, "UTF-8");  
  181.         int eventType = parser.getEventType();// 产生第一个事件  
  182.         while (eventType != XmlPullParser.END_DOCUMENT)  
  183.         {  
  184.             // 只要不是文档结束事件  
  185.             switch (eventType)  
  186.             {  
  187.             case XmlPullParser.START_TAG:  
  188.                 String name = parser.getName();// 获取解析器当前指向的元素的名称  
  189.                 if ("getMobileCodeInfoResult".equals(name))  
  190.                 {  
  191.                     return parser.nextText();  
  192.                 }  
  193.                 break;  
  194.             }  
  195.             eventType = parser.next();  
  196.         }  
  197.         return null;  
  198.     }  
  199. }</span>  
最后注意,由于需要访问网络,需要加上权限
[html]  view plain copy
  1. <span style="font-size:16px;"><uses-permission android:name="android.permission.INTERNET"/></span>  

通过上面简单的例子,相信大家已经学习了如何在Android中调用WebService,最后运行效果:



实例代码:http://115.com/file/anjh65a6

 

本文出自若水工作室:http://blog.92coding.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值