热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android使用webService(发送xml数据的方式,不使用jar包)

Android使用webService可以用ksoap2.jar包来使用。但是我觉得代码不好理解,而且记不住。所以我查询了好多资料,以及自己的理解。可以用代码发送http请求(发送xml数据)来访

Android使用webService可以用ksoap2.jar包来使用。但是我觉得代码不好理解,而且记不住。

所以我查询了好多资料,以及自己的理解。可以用代码发送http请求(发送xml数据)来访问WebService的功能。


这里我主要是用到了http://www.webxml.com.cn上的webService。

打开网页,我们会看到这个网站里面有很多的web服务,比如说查询手机归属地,查询天气预报,等等。


我们在这里以查询手机号的为Demo,总结一下如何使用WebService



布局文件的界面:


选择我们调用的方法:


我们可以在网页上试试这个方法的调用,输入我们想要查询的手机号码,userID--为空,点击调用即可查询出来。

在下面会有soap1.1和soap1.2的请求响应实例。


我们只需要把请求的xml文件发送既可返回一个响应的xml文件。

所以我们就可以通过发送http请求,解析http响应就可以获得我们想要的功能。


在src目录下创建一个xml文件,我这里命名为queryPhone.xml

文件内容就是上面图片中的内容



  
    
      phoneNumber
      
    
  

下面我们开始写查询手机号码归属地的业务逻辑类(QueryPhone.java)

package com.example.webservice.service;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.util.Log;

import com.example.webservice.Utils.WebServiceUtil;

/**
 * 用于查询手机号码归属地的业务逻辑类
 * 
 * @author info
 * 
 */
public class QueryPhone {
	private static String address;
	private static String tag = "QueryPhone";

	public static String queryAddressByPhone(String phone) {

		// 这是我们访问网络的url地址-就是webxml网站上提供的方法那个网页的地址的前半部分
		String path = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx";

		// 读取本地的xml文件queryPhone.xml
		InputStream is = QueryPhone.class.getClassLoader().getResourceAsStream(
				"queryPhone.xml");

		// 调用工具类中的方法,把流转换为String
		String soap = WebServiceUtil.stream2String(is);
		// 替换我们调用方法的参数
		soap = soap.replaceAll("phoneNumber", phone);

		// 把需要传输的数据转换为字节数组
		byte[] datas = soap.getBytes();

		// Log.i(tag ,"本地文件"+soap);

		try {
			// 获取连接
			HttpURLConnection cOnn= (HttpURLConnection) new URL(path)
					.openConnection();
			// 设置超时时间
			conn.setConnectTimeout(4000);
			// 设置请求方式
			conn.setRequestMethod("POST");
			// 允许发送数据
			conn.setDoOutput(true);
			// 设置请求头信息--不是固定的,有wenxml网站提供的
			conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
			conn.setRequestProperty("Content-Length",
					String.valueOf(datas.length));

			// 发送数据
			conn.getOutputStream().write(datas);

			Log.i(tag, "==响应码======" + conn.getResponseCode());
			// 获取响应码
			if (conn.getResponseCode() == 200) {
				// 访问网络成功--获取返回的流数据
				InputStream resultIs = conn.getInputStream();

				// 我们知道这个流数据里面就是一个xml文件,我们解析xml文档
				address = WebServiceUtil.parseXml(resultIs);

				Log.i(tag, "结果是:" + address);
			}

		} catch (Exception exception) {
			exception.printStackTrace();
		}

		return address;
	}
}

我们使用到的工具类

package com.example.webservice.Utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;

public class WebServiceUtil {

	/**
	 * 把流转换为String
	 * 
	 * @param is
	 *            需要转换的流
	 * @return 返回转化后的数据 返回null则代表是有异常
	 * 
	 */
	public static String stream2String(InputStream is) {

		String result = null;

		ByteArrayOutputStream baos = null;
		try {
			baos = new ByteArrayOutputStream();

			// 转化流
			byte[] buffer = new byte[1024];
			int len = -1;

			while ((len = is.read(buffer)) != -1) {
				baos.write(buffer, 0, len);
			}

			// 转换为字符串
			result = baos.toString();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭流
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					is = null;
				}
			}
			if (baos != null) {
				try {
					baos.close();
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					baos = null;
				}
			}
		}

		return result;
	}

	/**
	 * 解析返回的xml文件
	 * 
	 * @param resultIs
	 *            需要解析的流数据
	 * @return 返回解析后的结果
	 */
	public static String parseXml(InputStream resultIs) {
		XmlPullParser parser = Xml.newPullParser();

		try {
			parser.setInput(resultIs, "utf-8");

			int type = parser.getEventType();

			while (type != XmlPullParser.END_DOCUMENT) {
				/*
				 *  
				 *  
				 * string
				 *  
				 * 
				 */
				// 我们根据返回回来的xml文件的格式,获取我们需要的节点内容
				switch (type) {
				case XmlPullParser.START_TAG:
					if (parser.getName().equals("getMobileCodeInfoResult")) {
						return parser.nextText();
					}
					break;
				}

				type = parser.next();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}

}
我们在MainActivity中进行查询即可:

package com.example.webservice;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.example.webservice.service.QueryPhone;

public class MainActivity extends Activity {

	private EditText et_phone;
	private Button btn_query;
	private TextView tv_result;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 找到控件
		et_phOne= (EditText) findViewById(R.id.et_phone);
		btn_query = (Button) findViewById(R.id.btn_query);
		tv_result = (TextView) findViewById(R.id.tv_result);

		// 设置按钮的点击事件
		btn_query.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// 获取手机号码
				final String phOne= et_phone.getText().toString().trim();
				// 开启子线程查询手机归属地

				new Thread() {
					public void run() {
						final String address = QueryPhone.queryAddressByPhone(phone);

						// 不能在子线程中修改UI
						runOnUiThread(new Runnable() {
							public void run() {
								tv_result.setText(address);

							}
						});

					};
				}.start();
			}
		});

	}

}
不要忘记了增加联网的权限:
 


这样我们就可以查询手机号码的归属地了。

当然输入的手机号码必须大于7位数字。


完成后的效果图片:



当然我们也可以用这样的方式访问其他的webService---天气预报,验证码等等。


写的第一篇博客,欢迎批评。


推荐阅读
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • SOA架构理解理解SOA架构,了解ESB概念,明白SOA与微服务的区别和联系,了解SOA与热门技术的结合与应用。1、面向服务的架构SOASOA(ServiceOrien ... [详细]
  • 1.WebServicea.定义:WebService是一种跨编程语言和跨操作系统平台的远程调用技术b.三大技术:XMLXSD,SOAP, ... [详细]
  • Postman 调试 WebService
    Postman调试WebServiceWebServicePostman设置Headers请求头参数Body请求体传参返回结果WebService天气预报Web服务http:ww ... [详细]
  • -1{baos.write;baos.flush(;}responseDatabaos.toByteArray(;}catch{thrownewIO ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 03Spring使用注解方式注入
    基于注解的DI注入1.导包环境搭建:导入aop包(spring-aop-4.1.6.RELEASE.jar)2.创建类3.创建spring.xml配置文件(必须在src目录下)该配 ... [详细]
  • 阿里首席架构师科普RPC框架
    RPC概念及分类RPC全称为RemoteProcedureCall,翻译过来为“远程过程调用”。目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程 ... [详细]
  • .NET最新漏洞CVE20178759 POC已公布,大规模攻击即将来临
    图世界范围内感染FinSpy图(即漏洞利用导致下载的间谍程序)前天微软刚补好的漏洞,昨天fireeye发文,然后各平台开始写 ... [详细]
  • 分布式Dubbo 分布式服务
    分布式,du ... [详细]
  • Centos7安装PHP7最新版PHP编译安装适合Centos6以及Centos7PHP一、简单安装通过yum1.安装epel-releaserpm-ivhhttp:dl.fedo ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
author-avatar
liyanyl_499
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有