【转】 Pro Android学习笔记(七二):HTTP服务(6):HttpURLConnection
文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件,转载须注明出处:http://blog.csdn.net/flowingflying/
之前我们都是使用HttpClient来进行http连接,在上一次学习中,HttpClient远比封装socket要来得复杂,有管理器,有连接池。从Android2.3版本开始,可以是java.net.HttpURLConnection提供更小更轻载的连接服务。具体详见:http://developer.android.com/reference/java/net/HttpURLConnection.html
Http Get的使用方式
基础小例子
private void httpUrlConnGetTest(){
HttpURLConnection urlConn = null;
try{
URL url = new URL("http://www.android.com/");
/* 【1】 获取HttpURLConnection的对象。通过调用URL.openConnection(),并将类型适配为HttpURLConnection类型。 如果是处理https,则使用HttpsURLConnecction,相关的代码参考: http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html */
urlConn = (HttpURLConnection) url.openConnection();
/* 【2】 处理request的header,设置超时属性 。 */
urlConn.setRequestProperty("private-Hello", "Hello world!");//加入属性测试
urlConn.setConnectTimeout(3000); //对应connection timeout
urlConn.setReadTimeout(5000); //对应Socket timeout
/* 【3】 处理request的body。HTTP Get 没有body,相关的在HTTP POST中演示 */
/* 【4】读取response。*/
// 【4.1】获取response code测试
int responseCode = urlConn.getResponseCode();
Log.d("PRO","Response code = " + responseCode);
if(responseCode == HttpURLConnection.HTTP_OK){
Log.d("PRO","测试获取头信息Content-Type:" + urlConn.getContentType()); //【4.2】获取header信息测试
// 读取body
BufferedReader in = new BufferedReader(
new InputStreamReader(
urlConn.getInputStream()));
String line = null;
while((line = in.readLine()) != null ){
Log.d("PRO",line);
}
in.close();
}
}catch(Exception e){
e.printStackTrace();
}finally{
/* 【5】 断开连接。*/
if(urlConn != null)
urlConn.disconnect();
}
}

HttpURLConnection看起来真整个设计更贴近底层的TCP的流概念。从抓包情况看,已经成功地增加自定义的头字段:private-Hello: Hello world!。我们可以根据所需属性,构造http请求消息。HttpURLConnectoion也支持401的认证,不过现在基本上很少用这种认证方式,SIP还在用。
Cookie的使用
// 通过CookieHander和CookieManager,HttpURLConnection包含一个格外的cookie管理器,以此在client和server件维护一个长期的session。这部分的代码来自reference。
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
//写和读cookie的小例子
HttpCookie cookie = new HttpCookie("lang", "fr");
cookie.setDomain("twitter.com");
cookie.setPath("/");
cookie.setVersion(0);
cookieManager.getCookieStore().add(new URI("http://twitter.com/"), cookie);
重定向
HttpURLConnection可以自动处理重定向的情况,对代码进行修改来进行相关测试。HttpURLConnection最多可支持5次重定向(估计是防止循环),但不能跨scheme,即不能重http重定向到https,反之亦然,原因很简单,因为http和https是由不同的类来进行处理。当然浏览器是支持跨scheme的重定向。HttpURLConnection会自动根据302 Found消息给出的Location信息进行连接。
URL url = new URL("http://www.google.com/"); //将被重定向到www.google.com.hk
... ...
/* 4、读取response */
if(!url.getHost().equals(urlConn.getURL().getHost())) //比较请求的url和实际的url
Log.d("PRO","Redirect to " + urlConn.getURL().getHost());
… …
HTTP POST的小例子
基础小例子
如果设置了setDoOutput(true),这说明是HTTP POST。如果是其他的,例如OPTIONS,HEAD,PUT,DELETE和TRACE,可以通过setRequestMethod(String)来进行设置,无非就是确定status line如何写。
private void httpUrlConnPostTest(){
HttpURLConnection urlConn = null;
try{
URL url = new URL("http://blog.csdn.net/flowingflying1");//这是个无效的地址,预计回复403
urlConn = (HttpURLConnection) url.openConnection();
/* 【3】 处理request的body */
urlConn.setDoOutput(true); // 设置允许output,即可以带有request body
// 为了性能更好,应该设置setFixedLengthStreamingMod(int)或者setChunkedStramingMode(int)。如果不设置,request将的带buffer已经完成body的写,再发送,这对body数据量大的情况下显然效率较低。
urlConn.setChunkedStreamingMode(0);
// 通过outstream,写入body
OutputStream out = new BufferedOutputStream(urlConn.getOutputStream());
String content = "user=myfriend&action=TEST";
out.write(content.getBytes());
out.close();
/* 4、读取response。*/
if(urlConn.getResponseCode() = HttpURLConnection.HTTP_OK){
BufferedReader in = new BufferedReader(
new InputStreamReader(
urlConn.getInputStream()));
String line = null;
while((line = in.readLine()) != null ){
Log.d("PRO",line);
}
in.close();
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(urlConn != null)
urlConn.disconnect();
}
}
本博文涉及的例子代码,可以在Pro Android学习:Http service小例子中下载。
相关链接: 我的Android开发相关文章
【转】 Pro Android学习笔记(七二):HTTP服务(6):HttpURLConnection的更多相关文章
- 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter
目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...
- 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge
目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...
- 【转】Pro Android学习笔记(二五):用户界面和控制(13):LinearLayout和TableLayout
目录(?)[-] 布局Layout 线性布局LinearLayout 表格布局TableLayout 布局Layout Layout是容器,用于对所包含的view进行布局.layout是view的子类 ...
- 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期
在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...
- 【转】 Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner
目录(?)[-] GridView Spinner GridView GridView是网格状布局,如图所示.在了解ListView后,很容易了解GridView.下面是例子的XML文件. <? ...
- 【转】 Pro Android学习笔记(二一):用户界面和控制(9):Gallery和SimpleAdapter
Gallery画廊式控件,如图所示,但是在API level 16,也即Android 4.1,被deprecated,可以使用HorizontableScroolView和ViewPager.但是后 ...
- 【转】Pro Android学习笔记(二六):用户界面和控制(14):RelativeLayout
相对布局:RelativeLayout RelativeLayout也是非常常用的布局,能够精确对控件的位置进行网格对齐,可以设置在控件与其他控件的相对位置,以及控件在容器中的位置.缺省控件的位置为最 ...
- 【转】Pro Android学习笔记(二四):用户界面和控制(12):Style和Theme
目录(?)[-] 静态格式 代码中设定 Style Theme 静态格式 在res/values中设置静态的Style,在资源中设置静态Style可使用的HTML格式有<i> <u& ...
- 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式
可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
随机推荐
- 核函数 深度学习 统计学习 强化学习 神经网络 xx
- 为什么Git 比 SVN 好
原文链接:http://www.worldhello.net/2012/04/12/why-git-is-better-than-svn.html Why Git is better than SVN ...
- vim vimdiff diff 使用及命令
vim: vim 从 vim7 开始加入了多标签切换的功能, 相当于多窗口. 之前的版本虽然也有多文件编辑功能, 但是总之不如这个方便啦.用法::tabnew [++opt选项] [+cmd] 文件 ...
- mybatis_1
mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE co ...
- HackerRank - camelcase 【字符串】
思路 找单词 第一个 单词 是小写 然后 后面的单词 第一位 都是大写 刚开始 初始化 ans = 1 然后 往后遍历 碰到 大写的 更新答案 AC代码 #include <cstdio> ...
- Python程序打包成exe的一些坑
今天写了一个项目,Python项目,需要在win7上跑起来,我想,这不是简单的不行么,直接上Pyinstaller不就完了? 但是后来,我发觉我真是too young too simple. 为什么这 ...
- 每天一个Linux命令(33)cal命令
cal命令用于显示当前日历,或者指定日期的日历. (1)用法: 用法: cal [选项] [[[日] 月] 年] (2)功能: 功能: 用于查看日历等时间信息,如只有一 ...
- CKeditor插件开发流程(一)
1.放在多文件中 第一步:config.js中 config.extraPlugins = '插件名称';//注册插件,extraPlugins只允许出现一次,你如果之前有新增别的插件,那么用逗号分隔 ...
- iOS中成员变量和属性区别
历史由来: 接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法. 但这只是在iOS5之后,苹果推出的一个新机制.看老代码时,经 ...
- 【leetcode刷题笔记】Linked List Cycle
Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...