Android使用webService(发送xml数据的方式,不使用jar包)
Android使用webService可以用ksoap2.jar包来使用。但是我觉得代码不好理解,而且记不住。
所以我查询了好多资料,以及自己的理解。可以用代码发送http请求(发送xml数据)来访问WebService的功能。
这里我主要是用到了http://www.webxml.com.cn上的webService。
打开网页,我们会看到这个网站里面有很多的web服务,比如说查询手机归属地,查询天气预报,等等。
我们在这里以查询手机号的为Demo,总结一下如何使用WebService
布局文件的界面:
布局文件编写:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp"
tools:context=".MainActivity" >
<EditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入手机号码" />
<Button
android:id="@+id/btn_query"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="查询" />
<TextView
android:id="@+id/tv_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询结果为:"
android:textColor="#000"
android:textSize="18sp" />
</LinearLayout>
查询www.webxml.com.cn网址上服务的访问方式:
选择我们调用的方法:
我们可以在网页上试试这个方法的调用,输入我们想要查询的手机号码,userID--为空,点击调用即可查询出来。
在下面会有soap1.1和soap1.2的请求响应实例。
我们只需要把请求的xml文件发送既可返回一个响应的xml文件。
所以我们就可以通过发送http请求,解析http响应就可以获得我们想要的功能。
在src目录下创建一个xml文件,我这里命名为queryPhone.xml
文件内容就是上面图片中的内容
<?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>phoneNumber</mobileCode><!--特别注意这里,这里是这个方法需要的参数,我们先用一个值占位,我们会在代码中动态的修改这个canshu-->
<userID></userID><!--免费用户为空-->
</getMobileCodeInfo>
</soap12:Body>
</soap12:Envelope>
下面我们开始写查询手机号码归属地的业务逻辑类(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) {
/*
* <?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> <getMobileCodeInfoResponse
* xmlns="http://WebXml.com.cn/">
* <getMobileCodeInfoResult>string</getMobileCodeInfoResult>
* </getMobileCodeInfoResponse> </soap12:Body>
* </soap12:Envelope>
*/
// 我们根据返回回来的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();
}
});
}
}
不要忘记了增加联网的权限:
<uses-permission android:name="android.permission.INTERNET"/>
这样我们就可以查询手机号码的归属地了。
当然输入的手机号码必须大于7位数字。
完成后的效果图片:
当然我们也可以用这样的方式访问其他的webService---天气预报,验证码等等。
写的第一篇博客,欢迎批评。
Android使用webService(发送xml数据的方式,不使用jar包)的更多相关文章
- WebService传递XML数据 C#DataSet操作XML 解析WebService返回的XML数据
Webservice传递的数据只能是序列化的数据,典型的就是xml数据. /// <summary> /// 通过用户名和密码 返回下行数据 /// & ...
- XML数据读取方式性能比较(一)
原文:XML数据读取方式性能比较(一) 几个月来,疑被SOA,一直在和XML操作打交道,SQL差不多又忘光了.现在已经知道,至少有四种常用人XML数据操作方式(好像Java差不多),不过还没有实际比较 ...
- PHP接收和发送XML数据(json也通用)
一.接收xml数据, 使用php://input,代码如下: <?php $xmldata=file_get_contents("php://input"); $data=s ...
- php通过curl发送XML数据,并获取XML数据
php编程中经常会用到用xml格式传送数据,如调用微信等第三方接口经常用到,这里演示下php以curl形式发送xml,并通过服务器接收 一.发送xml数据 -- postXml.php <?ph ...
- Android H5混合开发(4):构建Cordova Jar包
前言 上一节,介绍了原生项目如何嵌入Cordova,我们对Cordova的依赖使用的是CordovaLib Module,这也是安卓项目常用的方式. 但是,也有项目希望以Jar包的方式依赖Cordov ...
- Springboot中IDE支持两种打包方式,即jar包和war包
Springboot中IDE支持两种打包方式,即jar包和war包 打包之前修改pom.xml中的packaging节点,改为jar或者war 在项目的根目录执行maven 命令clean pa ...
- Android中的5种数据存储方式
本文转自 http://hi.baidu.com/maguowei/blog/item/7aca46c25574a33ae5dd3ba4.htmlAndroid数据存储Android提供了5种方式存 ...
- c#调用JAVA的Webservice处理XML数据及批量轮询的实现方法
前段时间做一个调用外单位WEBSERVICE的项目,项目完成的功能其实很简单,就是我们单位有很多车友会员,我们想对他们提供车辆违章信息告之服务!我们这边交警部门给我们开放了WS的接口,我们就是想通过这 ...
- 使用Java命令行方式导入第三方jar包来运行Java程序的命令
1.首先使用命令行进入到a.java所在的文件夹:(比如我的在D:\javaeeworkspace\SharedPS_WS\src\com\dyf\main 这样一个路径下,) d: 回车, cd D ...
随机推荐
- Waveform基于JavaScript的开源多声道音乐波形编辑器
快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中. <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...
- RPG Maker MV游戏解包
该文章最新版本请前往:https://www.crowsong.xyz/127.html 前言 使用Petschko's RPG-Maker-MV File-Decrypter进行解包 使用Petsc ...
- 关于这次KPL春季决赛的感悟
QG 4:0 横扫AG超玩会,关于这一点想写一些自己的感悟,AG超玩会一直都是 4:0 横扫别人,这次在冠军赛被别人横扫,一点喘息的机会都没有. 1.QGhappy 跟本没把AG超玩会放在眼里,很 ...
- 深入理解计算机系统 BombLab 实验报告
又快有一个月没写博客了,最近在看<深入理解计算机系统>这本书,目前看完了第三章,看完这章,对程序的机器级表示算是有了一个入门,也对 C 语言里函数栈帧有了一个初步的理解. 为了加深对书本内 ...
- 利用Shell开发MySQL的启动脚本
MySQL实例部署情况 01:MySQL程序安装目录:/data/apps/mysql 02:MySQL实例3306的配置文件为:/data/mysql/3306/my.cnf 03:MySQL实例3 ...
- 用composer安装php代码(以安装phpmailer为例)
1.安装composer.exe软件 2.下载composer.phar 3.创建composer.json文件 { "require": { "php": & ...
- linuxprobe培训第1节课笔记2019年7月5日
报了老刘的RHCE培训,这是老刘上课笔记简略版. 老刘在课上介绍了开源共享精神和大胡子(Richard M. Stallman—GNU创始人).linux发展史(Linus Benedict Torv ...
- 使用Minikube部署本地Kubernetes集群(二十八)
前言 使用Minikube部署本地k8s集群相对比较简单,非常推荐将其用于本地k8s开发环境,唯一麻烦点的仅仅是网络问题. 在本篇教程中,我们使用了国内的镜像来完成本地k8s集群的搭建.如果搭建过程中 ...
- Windows 应用容器化
背景 在这个时间点,我们可能已经对 Linux 容器使用已经达到熟练掌握的程度,因为 Docker 与 Kubernetes 都是最早为 Linux 平台设计.当我们从容器这项技术中体会到种种收益,对 ...
- Django前端HTML通过JS实现表格可编辑,动态添加行,回车完成新建文件夹
功能描述: 点击“新建文件夹”按钮,在table的末尾增加一行:单击页面的新增行,使单元格td变成可编辑状态:输入内容后,当单元格失去焦点时,保存输入的内容:回车后通过AJAX提交后台完成新建文件夹. ...