HttpURLConnection 用法

HttpURLConnection

最近在写android blog的客户端,由于需要与网页交互,所以用到了这个类,整理一下。

创建方式:

据我所知有两种
1.HttpURLConnection conn = new HttpURLConnection(URL url);
2.HttpURLConnection conn = (HttpURLConnection) myurl.openConnection();

例子:

以下是本人blog客户端的某一片段

HttpURLConnection conn = (HttpURLConnection) myurl.openConnection();
            //设置链接方式,默认GET
            conn.setRequestMethod("POST");
            conn.setConnectTimeout(10000);
            conn.setReadTimeout(10000);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            StringBuffer params = new StringBuffer();
            params.append("number").append("=").append(number).append("&")
                    .append("passwd").append("=").append(pw).append("&")
                    .append("select").append("=").append(select);
            byte[] bytes = params.toString().getBytes();
            OutputStream out = conn.getOutputStream();
            out.write(bytes);
            out.close();
          //conn.connect(); 可以省略,因为在getOutputStream()之前会自动调用connect()方法

            if (200 == conn.getResponseCode()){
                return 2;
            } else if (302 == conn.getResponseCode()){
                String location = conn.getHeaderField("Location");
                if (location != null && location.length() > 0){
                    Map<String,List<String>> headerFields = conn.getHeaderFields();
                    List<String> cookiesHeader = headerFields.get("Set-Cookie");
                    if (cookiesHeader != null){
                        for(String cookies : cookiesHeader){
                            List<HttpCookie> list = HttpCookie.parse(cookies);
                            for(HttpCookie cookie :list){
                               cookieName = cookie.getName();
                               cookieValue = cookie.getValue();
                            }
                            System.out.println(cookieName+cookieValue);
                            return 3;
                        }
                    }

                }

            }else if(404 == conn.getResponseCode()) {
                return -1;
            }
总结:
  • HttpURLConnection.connect() 函数,只是建立了一个与服务器的tcp链接,并没有实际发送http请求.

  • 无论是post还是get,http请求实际上直到HttpConnection.getInputStream()/getResponseCode()这个函数中才正式的发出去,

  • 如果定义POST请求则不能使用setUseCache()方法

  • 在用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重,对connection对象的一切配置(那一堆set函数) 都必须要在connect()函数执行之前完成。而对outputStream的写操作,又必须要在inputStream的读操作之前。这些顺序实际上是由http请求的格式决定的.如果inputStream读操作在outputStream的写操作之前,会抛出异常:

        java.net.ProtocolException: Cannot write output after reading input....... 
    
  • http正文的内容是通过outputStream流写入的,实际上outputStream不是一个网络流,充其量是一个字符流串,往里面写入的东西并不会立即发送到网络,而是存在于内存缓冲区中,待outputStream流关闭的时候,根据输入的内容立即生成http正文.在获取服务端配置的时候发送,所以在getInputStream之后再次对conn进行设置就会报错

getCookies from inputStream

同样截取自我的代码,这里首先从HttpURLConnection中获取了所有的请求头,然后选出Set-Cookie这个下面的所有List然后遍历他们就可以得到结果.

Map<String,List<String>> headerFields = conn.getHeaderFields();
List<String> cookiesHeader = headerFields.get("Set-Cookie");
if (cookiesHeader != null){
    for(String cookies : cookiesHeader){
            List<HttpCookie> list = HttpCookie.parse(cookies);
                for(HttpCookie cookie :list){
                    cookieName = cookie.getName();
                    cookieValue = cookie.getValue();
                }
                System.out.println(cookieName+cookieValue);
            return 3
    }
}

这里还可以创建CookieManager实例,将cookies放入这里。

static final String COOKIES_HEADER = "Set-Cookie";
HttpURLConnection connection = ... ;
static java.net.CookieManager msCookieManager = new java.net.CookieManager();

Map<String, List<String>> headerFields = connection.getHeaderFields();
List<String> cookiesHeader = headerFields.get(COOKIES_HEADER);

if(cookiesHeader != null)
{
    for (String cookie : cookiesHeader) 
    {
      msCookieManager.getCookieStore().add(null,HttpCookie
          .parse(cookie).get(0));
    }               
}

取出的时候:

if(msCookieManager.getCookieStore().getCookies().size() > 0){
    //While joining the Cookies, use ',' or ';' as needed. Most of the server are using ';'
    connection.setRequestProperty("Cookie",
    TextUtils.join(";",  msCookieManager.getCookieStore().getCookies()));    
}

可见也是十分便利的

get Bitmap

很简单,直接上代码:

InputStream inputStream = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(inputStream);
inputStream.close();

参考:
1.http://blog.csdn.net/x1617044578/article/details/8668632
2.http://stackoverflow.com/questions/16150089/how-to-handle-cookies-in-httpurlconnection-using-cookiemanager

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值