`

在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

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

其次,设计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>  
<?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>

下面贴出MainActivity,
在Android中调用WebService还是比较简单的:请求webservice,获取服务响应的数据,解析后并显示。

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

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

  1. <SPAN style="FONT-SIZE: 16px"><uses-permission android:name="android.permission.INTERNET"/></SPAN>  
<uses-permission android:name="android.permission.INTERNET"/>

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


 

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics