二月春风似剪刀,在这把剪刀的裁剪下,三月里春天正式拉开了她得帷幕,看到武大学妹发的樱花照片,正是美得无法收拾,令人陶醉,先给大家上两张,共同欣赏
来张近的:
再来张特写
好一只张可爱的乌龟:
连池塘里面的乌龟,都被这美景诱惑,爬上了水面,哈哈。。
时光荏苒,一转眼离开武大已经5年了,但是当我看到这些图的时候,我的思绪一下就回到了5年前,樱顶、梅园、情人坡、奥场… 种种场景历历在目,好怀念那所大学,下辈子,我愿意生在武大,长在武大,学在武大,老在武大…
好像越写越偏离主题了是不是,今天不是来跟大家分享技术的吗,哈哈。 好吧,还是先整理下思绪,开始正题吧,其实说不上分享,共同学习吧,我们知道樱花开了不是吗,但是想我这种人在杭州却想观赏武大樱花的朋友,尤其是像我这种毕业多年的校友们,肯定想一睹樱花的美丽,不要急,今天百度推出了樱花直播,朋友们,只需要在百度搜索里面搜索武大樱花节,就可以直接观看到武大樱花,从多种角度进行观赏,如果运气好的话,还可以看到很多漂亮的MM哦,哈哈,互联网给大家带来的实惠实在是明显了,我们今天要聊的话题其实跟樱花直播也有关系哦,我们知道在百度里面搜索的时候首先是不是要发一个HTTP请求,是不是,如果没有这个请求,我们怎么能拿到数据,或的直播的接口呢?哈哈关系是有点儿牵强,废话说太多了,让我们切入正题吧。
转载请注明出处:http://blog.csdn.net/qinjunni2014/article/details/44570473
互联网对世界的影响越来越大,如今任何事物都可以跟互联网扯上关系了,连克强总理都在两会上提出了“互联网+”的概念,相信如今已经全面进入了互联网改造社会的时代,互联网是基于网络请求的,而Http请求就是网络请求中用的最多的一个请求,今天我们就来浅谈一下HTTP请求如何在Android中合理的使用。
1. HttpUrlConnection
Android中发送http请求有两种方法,一种是使用HttpClient,另外一种就是HttpUrlConnection,但是如今使用最多的是HttpUrlConnection,因为它更轻量,而且对缓存和安全的支持比较好。我们先来看一个基于HttpUrlConnection建立http请求最简单的例子,
String geturl = "http://www.baidu.com;
try {
URL getUrl = new URL(geturl);
HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();
// 进行连接,但是实际上get request要在下一句的connection.getInputStream()函数中才会真正发到
// 服务器
connection.connect();
// 取得输入流,并使用Reader读取
BufferedReader reader = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
System.out.println("=============================");
System.out.println("Contents of get request");
System.out.println("=============================");
String line;
while ((line = reader.readLine()) != null) {
Log.e("Junli", line);
}
reader.close();
// 断开连接
connection.disconnect();
System.out.println("=============================");
System.out.println("Contents of get request ends");
System.out.println("=============================");
} catch (IOException e) {
e.printStackTrace();
}
我们使用Get请求,去获得百度的主页,只需要简单地五步:
- new URL(String url)创建一个URL对象
- openConnection URL对象打开连接,获得一个HttpUrlConnection
- connect, 建立连接,我们知道http是基于Tcp的,这一步只是建立起Tcp连接,而并没有真正发http请求
- connection.getInputStream获取输入流,这一步才会真正去发request,拿到相应。
这个例子确实很简单,我们来看一个稍微复杂点的:
public void doPostRequest(String _url, List<NameValuePair> params) {
URL url = null;
try {
url = new URL(_url);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded; charset= utf-8");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(getQuery(params));
writer.flush();
writer.close();
os.close();
conn.connect();
conn.getResponseCode();
BufferedReader reader = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
// do something on reader
reader.close();
// 断开连接
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException {
StringBuilder result = new StringBuilder();
boolean first = true;
for (NameValuePair pair : params) {
if (first)
first = false;
else
result.append("&");
result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
}
return result.toString();
}
doPostRequst 通过调用setRequestMethod(“POST”) 尝试发送一个post请求,我们post请求是可以包含body的,我们可以讲我们需要传递给服务器的参数放在body部分。
1. setConnectTimeOut指定建立连接的超时时间,如果超过这个时间,就会抛出SocketTimeOutException,如果我们没有指定,那么默认值是0,但是不代表永远不超时,在数分钟之后仍然会抛出TCP超时
2. setReadTimeOut是指定数据读取的超时时间
3. setRequestProperty,设置请求的属性,在这个函数里面设置的属性,就是配置了Http请求头中的属性, 比如上面例子中,我们配置了Content-type属性
4. 通过connection.getOutPutStream拿到输出流,向这个流中写入我们想传得参数,当然在这之前我们必须调用setDoOutput(true)允许connection写入数据,
5. setDoInput 指定connection是否允许接受数据,默认情况下位true,通常不需要设置
如果我们每次,要发送http请求都需要自己构造HttpUrlConnection,确实很繁琐,多余,因为需要自己去设置header和body,部分。如果涉及到请求的取消等操作,那就更繁琐,如果能把这些东西继承起来,包装成一个更易容的接口岂不是更好,没错Volley就是这样一个库,类似的库有很多,比如ion,OkHttp等,我相信大部分人都熟练能够熟练使用volley了,如果还不会,请参考郭霖的文章,他详细讲解了volley的基本用法。今天我要讲的是volley是如何封装httpUrlConnection的。
2.封装
我们先从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));
}
}
我们注意到在Volley.newRequestQueue时,我们会判断当前系统api版本,如果大于9,则会生成一个HurlStack,否则会生成一个HttpClientStack,其中HurlStack是使用HttpUrlConnection进行http请求的发送,而后者则是使用HttpClient。
我们直接进入到HurlStack,找到performRequest函数,