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