首页Androidandroid技术 › 在Android中调用WebService与Mysql或者Oracle数据库进行数据交互

在Android中调用WebService与Mysql或者Oracle数据库进行数据交互

某些情况下我们可能需要与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

  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

  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,获取服务响应的数据,解析后并显示。

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

最后注意,由于需要访问网络,需要加上权限

  1. <span style="font-size:16px;"><uses-permission android:name="android.permission.INTERNET"/></span>

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

31260987M8fd

转载本站文章请注明出处:就是他吧 http://www.94taba.com/?p=381

上一篇:

下一篇: