目录(?)[-]

  1. Http Get的使用方式
    1. 基础小例子
    2. Cookie的使用
    3. 重定向
  2. HTTP POST的小例子
    1. 基础小例子

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件,转载须注明出处: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的更多相关文章

  1. 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

    目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...

  2. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

  3. 【转】Pro Android学习笔记(二五):用户界面和控制(13):LinearLayout和TableLayout

    目录(?)[-] 布局Layout 线性布局LinearLayout 表格布局TableLayout 布局Layout Layout是容器,用于对所包含的view进行布局.layout是view的子类 ...

  4. 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期

    在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...

  5. 【转】 Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner

    目录(?)[-] GridView Spinner GridView GridView是网格状布局,如图所示.在了解ListView后,很容易了解GridView.下面是例子的XML文件. <? ...

  6. 【转】 Pro Android学习笔记(二一):用户界面和控制(9):Gallery和SimpleAdapter

    Gallery画廊式控件,如图所示,但是在API level 16,也即Android 4.1,被deprecated,可以使用HorizontableScroolView和ViewPager.但是后 ...

  7. 【转】Pro Android学习笔记(二六):用户界面和控制(14):RelativeLayout

    相对布局:RelativeLayout RelativeLayout也是非常常用的布局,能够精确对控件的位置进行网格对齐,可以设置在控件与其他控件的相对位置,以及控件在容器中的位置.缺省控件的位置为最 ...

  8. 【转】Pro Android学习笔记(二四):用户界面和控制(12):Style和Theme

    目录(?)[-] 静态格式 代码中设定 Style Theme 静态格式 在res/values中设置静态的Style,在资源中设置静态Style可使用的HTML格式有<i> <u& ...

  9. 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

    可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...

  10. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

随机推荐

  1. http 长连接 & 短连接

    1.意义 同一个TCP连接来发送和接收多个HTTP请求/应答,而不是为每一个新的请求/应答打开新的连接的方法. 2.优 较少的CPU和内存的使用 允许请求和应答的HTTP pipelining 降低网 ...

  2. SM30 表格维护生成器

    1)SE11创建自建表,结构如下: 2) 创建表维护 3) 针对上面创建的函数组ZMM_MAT_DESC,做以下增强处理 添加的Module 代码如下: module mod_customize in ...

  3. 基于卡方的独立性检验原理及R语言实现

    在读到<R语言实战>(第二版)P143页有关卡方独立性检验所记 假设检验 假设检验(Test of Hypothesis)又称为显著性检验(Test of Ststistical Sign ...

  4. 用cocos2d-html5做的消除类游戏《英雄爱消除》(1)——系统主菜单

    系统主菜单如下图所示: 首先,介绍下这个主菜单,它包含了一个动画logo以及一个按钮选项,动画logo每隔1秒钟切换一张图片,点击相应的按钮选项会切换不同的游戏场景. 下面看下这个界面的源码: /** ...

  5. .vimrc .bashrc

    怕丢了,赶快保存! .bashrc # switch caps lock with escxmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'sudo ...

  6. python 常用的字符串方法

    st = ' hello Kitty 'str = 'hello {name} {age}' #print(st.format(name='fadfa'))#常用的字符串方法print(st.coun ...

  7. BestCoder Round #4 之 Miaomiao's Geometry(2014/8/10)

    最后收到邮件说注意小数的问题!此代码并没有过所有数据,请读者参考算法, 自己再去修改一下吧!注意小数问题! Miaomiao's Geometry Time Limit: 2000/1000 MS ( ...

  8. jquery 实现动态表单设计

    只是实现了前台页面的动态表单的设计,并未实现后台绑定数据到数据库等功能.技术使用到的为jquery和bootstrap.俗话说有图有真相,先说下具体效果如下: 点击添加一个面板容器: 容器添加成功: ...

  9. L100

    The world’s lightest wireless flying machine lifts off1Circult: cutting the circuitry from copper fo ...

  10. 关于c++中局部变量和全局变量的存储位置及内存回收机制

    局部变量,参数变量存放在栈中,当离开作用范围后,分配的内存在作用范围外会被系统自动回收. new出来的内存空间存放在堆中,不受作用域管理,不会被系统自动回收,只有在使用delete删除或者整个程序结束 ...