Http请求
- 请求方式
主要包含:GET、POST、HEAD、OPTIONS、DELETE、TRACE、PUT,我们一般只用到GET和POST。 -
GET和POST请求的区别
这两种方式的区别主要表现在数据传递上:
顺便我们从请求英文名的字面意思理解一下GET、POST、PUT和DELETE的区别:Get是最常用的,就是向Web Server发请求“获取”资源;那么Post就是向Web Server“邮寄”一些封装的数据包获取资源,这两者方法严格的说都是“索取”行为。
Delete方法,顾名思义就是通过http请求删除指定的URL上的资源啦,Delete请求一般会返回3种状态码:
200 (OK) - 删除成功,同时返回已经删除的资源
202 (Accepted) - 删除请求已经接受,但没有被立即执行(资源也许已经被转移到了待删除区域)
204 (No Content) - 删除请求已经被执行,但是没有返回资源(也许是请求删除不存在的资源造成的)
而Put方法简单理解,就是往Web Server上直接扔资源(上传资源)嘛![^reference1]
GET,POST,PUT,DELETE URL 全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询 资源信息,而POST一般用于更新 资源信息(个人认为这是GET和POST的本质区别,也是协议设计者的本意,其它区别都是具体表现形式的差异 )。 [^reference2]
- Android客户端实现Http请求的方式和工具们
//1.通过JDK自带的URLConnection
//Sun公司提供的库,也是Java的标准类库[java.net]中的一员,但这个类什么都没封装,用起来很原始,若需要高级功能,则会显得不太方便,比如重访问的自定义,会话和cookie等一些高级功能。
URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in);
} finally {
urlConnection.disconnect();
}
//2.Apache的HttpClient
//Apache公司提供的库,提供高效的、最新的、功能丰富的支持HTTP协议工具包,支持HTTP协议最新的版本和建议,是个很不错的开源框架,封装了http的请求,参数,内容体,响应等,拥有众多API。
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet();
httpClient.execute(httpGet);
最初的时候,不管是什么Http的框架都是基于以上两种最基础的API进行了各种再封装。而且因为HttpURLConnection早期的bug,所以在2.3之后建议使用HttpURLConnection,之前建议使用HttpClient。后来因为HttpClient的一些缺点和维护成本较高,Android开发团队转投更为轻便的HttpUrlConnection,所以5.0之后干脆废弃了HttpClient,6.0进行了删除。所以在Android-23中的sdk中,已经找不到HttpClient了。
当然,现在已经有了更新的OkHttp:OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和 HTTP 缓存。从Android4.4开始,HttpURLConnection的底层实现采用的是OkHttp。Volley在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。这里指的是volley使用的http传输层,从volley创建RequestQueue的源码中可以看出:
if (stack == null) {
if (Build.VERSION.SDK_INT >= 9) {
stack = new HurlStack();
} else {
// Prior to Gingerbread, HttpUrlConnection was unreliable.
// See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
}
代码中的HurlStack执行网络请求就是基于HttpURLConnection的。
不过因为Volley在功能扩展性上的局限,始终无法与OkHttp相比。所以Volley最终停止了更新,而OkHttp得到了官方的认可,并在不断优化。不过Volley可以轻松设置OkHttp作为其传输层,我们的项目中一直用的volley,想要使用OkHttp,只需要下面两行代码,指定使用的HttpStack为OkHttpStack即可:
OkHttpClient client = new OkHttpClient();
RequestQueue mRequestQueue = Volley.newRequestQueue(context, new OkHttpStack(client));