小猪的Android入门之路 Day 8 part 4

小猪的Android入门之路 Day 8 part 4

Android网络编程浅析——Android网络数据的上传

——转载请注明出处:coder-pig


本节引言:

在part 3中我们已经学习了Android网络数据的下载,难点是多线程断点续传下载;

有下载,当然也有上传啦,本节就来研究下Android中的网络数据的上传!

1.使用GET或者Post方式上传数据给服务器

2.使用开源框架HttpClient上传数据到服务区

3.发送xml数据给服务器

4.通过Http协议上传文件

5.WebService平台的了解以及简单应用

好了,开始本节的内容吧!



本节学习路线图


注意:在查询城市天气那个demo中可以不适用地区码,直接发送城市名即可!





正文:


使用GET方法或者POST方法上传数据



核心代码比较:


GET服务类:


POST服务类:


ps:相信细心的朋友都看出来这两个服务类不同的地方了,get是直接发送请求的,而post还需要设置相关的参数,

最后是以流的方式提交数据的!

完整项目下载:http://pan.baidu.com/s/1qWobnvm

效果图:



ps:另外还要说一点的是,传递中文可能出现乱码的情况,笔者之前也在这里纠结了半天,改来改去还是不行,后来发现是自己

的myeclpise的问题,上述运行结果是到同学的电脑运行的结果,乱码的话是因为tomcat默认支持的事iso8859-1编码方式

下面提供两个简单的解决乱码问题的方法(其实更重要的是注意编码的统一!!!)

1.在servlet取出数据的时候,使用下述代码进行转码:

 String name = new String(request.getParameter("name").getBytes("iso-8859-1"),"UTF-8"); 
2.修改Tomcat的conf/server.xml文件,找到,下述代码,添加:URIEncoding=‘UTF-8‘

修改后:(utf-8不行的话再改成gbk试试)


ps:如上述方法都不行的话,就可能是tomcat的问题了,建议别直接使用myeclpise提供的tomcat;自己下载个tomcat配置下

如果还是乱码;去别人电脑试试,如果可以就说明是编译器的问题了;如果还是不行的话,我也帮不了你了









使用开源框架HttpClient发送请求:




核心代码:(直接使用httpClient发送post请求)


代码使用示例:

用户向某个jsp页面发送请求,如果没登陆的话返回提示没有没有权限访问页面;

点击登录后,验证账号密码是否正确,正确的话弹出Toast信息,并显示服务端反馈的内容

服务端使用到了session,相信学过jsp的同学都知道,可以通过这个判断用户是否为登录状态!

这里就直接套用疯狂讲义中的demo

效果图:


代码下载:http://pan.baidu.com/s/1kTgJRxX

核心代码解析:

①服务端如何判断用户是否登录?

答:点击登录按钮指向的是login.jsp,在这里完成登录,同时把状态写入到session

session.setAttribute("user" , name);

同时在该页面中匹配账号密码是否正确,否则返回不同的结果,成功或者失败!

当我们点击访问页面,请求指向的事secret.jsp页面,该页面先取出session中的name对应的值

与"jay"进行匹配,有的话,根据判断结果返回不同的处理结果:

<%Object user = session.getAttribute("user");

if(user != null && user.toString().trim().equals("jay"))....%>

else{out.println("您没有被授权访问该页面");}%>

②客户端提交请求,解析响应结果:

// 创建一个HttpGet对象
	HttpGet get = new HttpGet("http://10.13.20.32:8080/foo/secret.jsp");

// 发送GET请求
HttpResponse httpResponse = httpClient.execute(get);
//获得服务器反馈的结果
HttpEntity entity = httpResponse.getEntity();
if (entity != null)
{
	// 读取服务器响应
	BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));
	String line = null;
	while ((line = br.readLine()) != null)
		{
			Message msg = new Message();
			msg.what = 0x123;
			msg.obj = line;
			handler.sendMessage(msg);
	}




发送xml数据给服务器:

和前面的差不多,这里只贴核心业务代码,要用的时候直接复制即可!








使用Http协议完成文件上传操作:

相信大家在使用app的时候,都要完成一个注册用户的流程,而注册的时候,通常都是需要

用户上传图片作为自己的用户头像的,这里提供一个使用Http协议完成文件上传的业务代码:

另外,一般使用http上传的文件比较小,通常是小于2M的!


实现代码解析:Android使用http协议上传mp3



Android平台调用WebService


WebService的简单介绍:



ps:如果上面看完还是对WebService不是很了解的话,就算了,笔者没弄过WebService,所以也不知道!

而现在我们要做的不是去讨论如果去搭建一个WebService,我们要做的是去获得WebService提供的服务!

然后解析返回的xml数据,把这些数据显示到安卓手机上,简单的小例子如:输入手机号码,获取手机归属地;

查询某地的天气预报,快递单号查询等!


那么我们要怎么去获得这些服务呢?

首先我们去找到提供webService的一些网站:(笔者知道的有以下这两个,如果有免费的站点,欢迎提出)

①WebXML:http://www.webxml.com.cn/zh_cn/web_services.aspx

也是使用得最多的一个WebService站点,貌似以前是免费的,不过都商业化了,当然是可以试用!不过次数有限!

该网站上提供了16个不同的web服务,可以按照自己的需求,查询自己需要的服务,调用不同的接口即可!


相关使用次数:






②云聚36wu:http://www.36wu.com/Service

同样也提供了很多的服务,很多手机的app都是用的这里的接口,比如彩虹公交,手机天气等

不过,这个也是要收费的=-=,可以试用,不过只能一小时内发送20次请求;

点击申请使用,获得key就可以了!两者随便选一个吧!鉴于笔者是学生狗,没什么收入来源,

后期可能会研究下如何搭建自己的WebService,毕竟现在有那么多云平台!敬请期待




好了,有了获取服务的站点后,接着就要开始我们app的开发了,由于篇幅关系,这里就简单的演示

下查询号码归属地和天气情况的流程吧,其他的以后根据需求再进行研究!



使用示例:根据手机号码获得归属地与天气情况


step 1:下载第三方jar包:ksoap2 Android:


首先如果想在Android平台上调用WebService需要依赖于第三方类库:ksoap2

而在Android平台上,使用的是ksoap2 Android,一个高效,轻量级的SOAP开发包!

jar包下载地址:https://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2

鉴于是google的网站,天朝墙了,可能上不去,这里给出百度云的下载链接:

备用胎:3.30版本:http://pan.baidu.com/s/1i3sZksl

           2.54版本:http://pan.baidu.com/s/1jGoTyQi

如果所幸你能进入jar包的下载地址的话,那么你会看到下面的界面:






step 2:记录相关参数:

在开始实际操作之前,我们先要从WebService获取一些信息:分别是:NameSpace(命名空间),SoapAction以及URL

URL就不用说了,其他参数这样找:



然后就可以获取我们需要的SoapAction和namespace了


好了,先把这两个mark下来,接着要测试下自己所在地区的地区码了,在theCityCode:输入所在的城市

下面的id可以不填,因为我们用的是免费用户,接着到达下一个界面,可以看到:


同样的,我们还要做一个号码归属地查询的,所以还要获取号码查询的Service的SoapAction与命名控件:





step 3:开始我们代码的编写了:

效果图:


源码下载:WebService的使用demo


工程核心解析:

一.记得把Android soap2的jar包导入到工程中!不然会提示相关类找不到的!


二.核心代码的编写:


①获取号码所属地的Activity


②获取某城市(这里是江门)的天气情况


ps:相信细心的朋友都会发现这里用了两个不同的webservice站点,一个是webxml一个是36wu;

其实呢一开始都是用的webxml,但是,笔者的运气真是背,刚好遇到了天气查询服务维护,


笔者即使使用申请使用id,也是返回"...现在不支持普通用户,...申请id",所以就用了36wu的!




其实都差不多,改起来也是比较简单的,根据站点的soap改下相关参数即可:







另外,别忘了,添加Internet权限哦!在AndroidManifest.xml文件中添加下述权限:

<uses-permission android:name="android.permission.INTERNET"/>




总结:

本文的内容还是比较多的,但是都不难,很多只要我们大概明白原理,然后到用的时候

知道怎么去改就可以了!笔者也写了几天才写完的!如果你能坚持看完的话,相信你会收获

很多,另外文章篇幅较长,希望读者可以耐心读完,写这么详细是想照顾一些和我一样的迷途

小菜鸟,望体谅,好了,本节就到这里!谢谢你们的支持另外,现在大部分的WebService站点

都是要收费的,笔者穷屌买不起会员,只能试用试用了,以后进公司就不用自己给钱了!

不过大牛说可以自己搭建个WebService服务器,以后有时间会尝试弄一个,然后把经验分享

给大家的,毕竟现在各种云,阿里云,腾讯云,搜狐云景...好了,最后贴下申请试用key的流程吧!

有兴趣的再看吧!



==============可以不看==================================================

附录:

一.webxml申请试用id:

注册账号


登陆账号,查看自己的key


点击我的web服务,可以看到相关的服务,这里笔者开通了天气查询的,试用五天:


这里的是要给钱的,所以说起其它的6个服务是免费的,比如我们的号码归属地查询...

接着我们来到weather服务那里,输入地区编码以及我们的key,就可以查询天气了:


噔噔噔,接着就可以看到信息了,我们就可以在我们的应用中解析这些数据了~!





二.36wu的key的申请与使用流程:

相比webxml就抠门很多了,人家起码可以使用5个服务,一个服务5天,5*5=25

而36wu的key只能用一天,也不能说扣吧,商家都要赚钱!一天就一天,也可以爽一下啦!

同样是需要申请key的


接着会收到一条短信=-=,把key复制下即可


接着同样来到wetherservice的界面:输入地区码和key


返回结果,接着就到我们的客户端进行处理了:





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。