基本使用
HttpURLConnection是一个抽象类,需要通过 url.openConnection()获取实例
HttpURLConnection connection = null;
try {
URL url = new URL("https://www.baidu.com/");
connection = (HttpURLConnection) url.openConnection();
InputStream is = connection.getInputStream();
String result = readInputStream(is);
Log.d("", result);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(connection != null) {
connection.disconnect();
}
}
Android 主线程不能执行网络操作,上面代码需要放到工作线程中执行。
connection.connect();会被getOutputStream调用,所以不需手动调用
HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。
getOutputStream
无论是post还是get请求,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。所以对outputStream的写操作,必须要在inputStream的读操作之前。
connection.setRequestMethod("POST");
OutputStream outStrm = connection.getOutputStream();
ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);
// 向对象输出流写出数据,这些数据将存到内存缓冲区中
objOutputStrm.writeObject(new String("我是测试数据"));
// 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream)
objOutputStrm.flush();
// 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,
// 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器
objOutputStrm.close();
getInputStream
getInputStream()这个函数里面才正式发送请求
InputStream is = connection.getInputStream();
String result = readInputStream(is);
readInputStream函数
private String readInputStream(InputStream is) {
InputStreamReader isReader = new InputStreamReader(is);
BufferedReader bufferReader = new BufferedReader(isReader);
String inputLine = null;
StringBuffer result = new StringBuffer();
try {
while ((inputLine = bufferReader.readLine()) != null) {
result.append(inputLine);
}
} catch (IOException e) {
e.printStackTrace();
}
return result.toString();
}
参数
在用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重,对connection对象的一切配置(那一堆set函数)都必须要在connect()函数执行之前完成。
1、设置是否向httpUrlConnection输出,默认情况下是false。使用httpUrlConnection.getOutputStream(),把内容输出到远程服务器上。
httpUrlConnection.setDoOutput(true);
2、设置是否从httpUrlConnection读入,默认情况下是true。使用httpUrlConnection.getInputStream(),从远程服务器上得到响应的内容。
httpUrlConnection.setDoInput(true);
3、是否使用缓存。
httpUrlConnection.setUseCaches(false);
4、设定传送的内容类型是可序列化的java对象 (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)。
httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");
5、设定请求的方法为”POST”,默认是GET 。
httpUrlConnection.setRequestMethod("POST");