学习笔记:细说面向HTTP协议的服务器访问方式GET/POST的区别和框架的使用

笔记之前:因为现阶段公司业务需求需要在短时间内进行IOS的开发,所以最近下午公司的IOS工程师每天在会议室对我进行IOS开发的培训,因为OC的语法相对于JAVA之类区别还挺大的,所以打算前面的项目能够用OC维护就行,后面如果有IOS项目,直接用SWIFT进行开发,所以晚上在学习SWIFT,最近压力也开始大了,所以安卓的学习笔记更新势必会放缓很多,但是每周还是会有1-3篇的笔记更新,等Activity的内容讲完,基本上再一起学习几个UI框架,像GITHUB上的StaggeredGridView瀑布流.还有Android支持库中的android.support.v4.view.ViewPager标签等就会结束Android基础学习笔记的更新,往后只会偶尔更新一些新用到的开源框架和实现方式,在Android基础内容更新完后即会开始更新IOS开发日记,以苹果公司现在力推的SWIFT语言为基础XCODE6进行开发,并且当时在更新笔记前会先更新一篇如何在VMware Workstation虚拟机上安装Mac OS X 系统,并桥接主机网络下载XCODE进行开发.当然,现在还是来继续我们的Android开发的基础学习笔记.

    在上一篇笔记中,我们主要讲了Android下为了防止ANR错误,访问网络等耗时的操作都不能在UI线程中进行,所以我们需要开启一个新的线程执行这些操作,执行完后更新UI的操作又只能由主线程进行,所以利用了主线程中的Handler消息处理器进行接收和处理UI的操作.上一篇笔记中我们因为需要介绍更新ui和耗时操作的一些做法所以将访问网络的逻辑部分用一段话直接概括了,今天这篇笔记主要来学习面向HTTP协议的get/post请求的实现和apache提供的httpClient工具的使用,最后再来讲解一下托管在GITHUB上的一个非常实用的异步,基于回调的Http客户端开发开源框架怎样简单的实现前面两种服务器访问方式.(我直接用项目代码来讲解)
    为了方便实现服务器的访问,我另开一个Eclipse写一个servlet作为服务端,简单的在doGet()和doPost()分别接收get请求和post请求,里面直接简单的打印一下客户端传进来的参数:学习笔记:细说面向HTTP协议的服务器访问方式GET/POST的区别和框架的使用_第1张图片

然后我们在 ADT中进行Android客户端的实现:
首先还是一样,网络的访问不能在UI线程中进行,所以必须新开一个线程,然后处理完网络操作后得到的数据需要更新的手机界面,更新UI的操作又必须在UI线程中进行,上一篇笔记中我们用了 
Handler消息机制实现,今天.我们介绍另外一种在子线程中更新UI的简单方式:Activity本身自带的一个方法runOnUiThread(Runnable),顾名思义:运行在UI线程中.此方法只需要实例化一个Runnable对象,并在里面重新它的run方法即可,我们先讲用法,再讲原理:同样看代码:(我们在布局中创建两个editview和一个button当作是一个登录界面,然后在button中添加cilck方法:login):
学习笔记:细说面向HTTP协议的服务器访问方式GET/POST的区别和框架的使用_第2张图片

以上代码中开辟了一个子线程,然后获取result服务器响应数据后我们没有利用Handler的sendMessage()方法通知消息处理器去处理,而是直接调用了Activity的runOnUiThread(Runnable)方法,并直接重写Runnable的run()方法,将更新UI的操作放在run()方法中执行了.
其实它的底层实现原理就是线程中的JOIN方法,我们知道,在线程中,一个线程可以通过JOIN到另一个线程的方法去优先执行本线程的逻辑,在这里子线程通过JOIN到UI线程中进行了UI界面的更新.

在上面的代码中,我们已经将创建子线程,更新UI的逻辑处理完了,接下来就是访问服务器的操作逻辑了,我们先看看我在IE下通过HttpWatch截包工具截取的IE分别通过GET和POST访问服务器的请求参数:
 我们直接用我们写的servlet服务器进行访问

学习笔记:细说面向HTTP协议的服务器访问方式GET/POST的区别和框架的使用_第3张图片

学习笔记:细说面向HTTP协议的服务器访问方式GET/POST的区别和框架的使用_第4张图片

首先从后面的服务器控制台可以看到get和post请求都已经成功的访问并打印,然后从前面的显示器我们用截包工具截获的数据可以看到post和get的请求参数不同:
get请求:
图片



post请求:
学习笔记:细说面向HTTP协议的服务器访问方式GET/POST的区别和框架的使用_第5张图片

 明显的post比get请求要多了几个参数,我们对比之后可以看到,post多了以下参数:
content-type:
application/x-www-form-urlencoded
Content-length:31
username=wuxinchao&password=123

GET请求中的参数直接在请求路径中
所以根据以下区别我们在代码中直接采用HttpURLConnection方式开启HTTP进行GET/POST请求时只要相对应的给予这些参数即可:

学习笔记:细说面向HTTP协议的服务器访问方式GET/POST的区别和框架的使用_第6张图片

学习笔记:细说面向HTTP协议的服务器访问方式GET/POST的区别和框架的使用_第7张图片
在代码中可以看到与GET请求方式的不同,POST请求是通过流的方式将请求参数写入服务器

上面介绍了直接采用HttpURLConnection方式进行面向HTTP协议的服务器访问方式,并且通过截包工具也知道两者在传参时的不同 .
上面的访问方式是比较接近底层的操作,在实际的代码开发中一般都是通过工具类去实现这些操作,而AndroidSDK下已经集成了Apache面向HTTP协议访问服务器开源框架httpClient,我们直接通过代码来了解这个框架是如何处理GET和POST请求的:
先看GET请求:
学习笔记:细说面向HTTP协议的服务器访问方式GET/POST的区别和框架的使用_第8张图片

我们实例化一个HttpClient的接口实现类DefaultHttpClient, 然后实例化一个框架的HttpGet对象并将请求路径赋予,最后执行
HttpClient下的execute()方法将这个HttpGet对象传进去,即可完成一个GET请求,对比我们之前的GET请求代码,我们可以看到,代码量并没有多少减少,但是使用这个方法我们就不必关心一些请求参数的设定,框架帮我们处理了
接下来我们看POST请求:
学习笔记:细说面向HTTP协议的服务器访问方式GET/POST的区别和框架的使用_第9张图片 

首先我们对比之前的POST请求方法可以看到代码量明显减少,在这里操作基本上和GET方法类似,但是我们传递参数的时候可以直接采用框架的 
NameValuePair,以键值对的方式放置参数,并将这些参数所对应的NameValuePair放到一个LIST中进行传参,更加便于操作:
将list中的数据和指定的编码方式以一下方法处理,便完成了一个POST请求. 

httpPost.setEntity(new UrlEncodedFormEntity(paramaters,"utf-8"));

HttpResponse response = client.execute(httpPost); 

好了,以上的内容 就是怎样去利用AndroidSDK下的工具进行面向HTTP协议的服务器请求,表达不是很好,大家可以通过代码看看不同,但是这些方式都必须建立在开启一个子线程,然后处理完通过Handler消息处理器或者通过Activity的
runOnUiThread方法去处理UI,在项目开发中如果这样的方法比较多,那势必很麻烦,当然,我们自己也可以去封装这些操作,自己自定义一个简单的框架去处理这些,在GITHUB上就托管了一个非常好用的异步HTTP框架:android-async-http:
url地址:https://github.com/loopj/android-async-http.git
学习笔记:细说面向HTTP协议的服务器访问方式GET/POST的区别和框架的使用_第10张图片

客户电话过来了...手头上有东西要忙,晚上我再更新这个框架的使用方式,非常非常的方便! 



你可能感兴趣的:(学习笔记:细说面向HTTP协议的服务器访问方式GET/POST的区别和框架的使用)