使用HttpURLConnection进行网络访问
HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。继承至URLConnection,抽象类,无法直接实例化对象。通过调用openCollection() 方法获得对象实例,默认是带gzip压缩的;
HttpURLConnection的使用步骤
创建一个URL对象:
URL url = new URL(https://www.baidu.com);
调用URL对象的openConnection( )来获取HttpURLConnection对象实例
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
设置HTTP请求使用的方法:GET或者POST,或者其他请求方式:
conn.setRequestMethod("GET");
设置连接超时,读取超时的毫秒数,以及消息头:
conn.setConnectTimeout(10*1000);
调用getInputStream()方法获得服务器返回的输入流:
InputStream in = conn.getInputStream();
获取后,就可以对输入流进行操作了(读取接口返回的数据)。
关闭连接
conn.disconnect();
HttpURLConnection代码实战
/**
* post请求数据
*
* @param urlStr
* @return
*/
public String reqHttpURLConnection(String urlStr) {
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) new URL(urlStr).openConnection();
//设置请求方式,请求超时信息
conn.setRequestMethod("POST");
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
//设置运行输入,输出:
conn.setDoOutput(true);
conn.setDoInput(true);
//Post方式不能缓存,需手动设置为false
conn.setUseCaches(false);
//我们请求的数据:
String data = "name=" + URLEncoder.encode("budaye", "UTF-8") +
"&book=" + URLEncoder.encode("android", "UTF-8");
//请求头...
//获取输出流
OutputStream out = conn.getOutputStream();
out.write(data.getBytes());
out.flush();
//请求结果处理
if (conn.getResponseCode() == 200) {
// 获取响应的输入流对象
InputStream is = conn.getInputStream();
// 创建字节输出流对象
ByteArrayOutputStream message = new ByteArrayOutputStream();
// 定义读取的长度
int len = 0;
// 定义缓冲区
byte buffer[] = new byte[2048];
// 按照缓冲区的大小,循环读取
while ((len = is.read(buffer)) != -1) {
// 根据读取的长度写入到os对象中
message.write(buffer, 0, len);
}
// 释放资源
is.close();
message.close();
// 返回结果字符串
String str = new String(message.toByteArray());
return str;
}
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
HttpURLConnection的connect方法,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()方法里面才正式发送出去。
HttpURLConnection在getInputStream()函数调用的时候,会把准备好的http请求正式发送到服务器,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http请求在getInputStream的时候已经发送出去了(包括http头和正文),因此在getInputStream()函数之后对connection对象进行设置(对http头的信息进行修改)或者写入 outputStream(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生。