HttpURLConnection 用法

来源:互联网 发布:达芬奇消失的两年 知乎 编辑:程序博客网 时间:2024/05/29 14:20

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
原创粉丝点击