详解HttpURLConnection
1. 版权声明
原文链接:https://blog.csdn.net/woxueliuyun/article/details/43267365
2. 请求响应流程

3. 设置连接参数的方法
- setAllowUserInteraction
- setDoInput
- setDoOutput
- setIfModifiedSince
- setUseCaches
- setDefaultAllowUserInteraction
- setDefaultUseCaches
4. 设置请求头或者响应头
- setRequestProperty(key,value)
- addRequestProperty(key,value)
- setRequestProperty和addRequestProperty的区别就是,setRequestProperty会覆盖已经存在的key的所有values,有清零重新赋值的作用。而addRequestProperty则是在原来key的基础上继续添加其他value。
5. 发送URL请求
建立实际连接之后,就是发送请求,把请求参数传到服务器,这就需要使用outputStream把请求参数传给服务器:
- getOutputStream
6. 读取响应
- getContent
- getHeaderField
- getInputStream
7. HttpURLConnection
任何网络连接都需要经过socket才能连接,HttpURLConnection不需要设置socket,所以,HttpURLConnection并不是底层的连接,而是在底层连接上的一个请求。这就是为什么HttpURLConneciton只是一个抽象类,自身不能被实例化的原因。HttpURLConnection只能通过URL.openConnection()方法创建具体的实例。
虽然底层的网络连接可以被多个HttpURLConnection实例共享,但每一个HttpURLConnection实例只能发送一个请求。请求结束之后,应该调用HttpURLConnection实例的InputStream或OutputStream的close()方法以释放请求的网络资源,不过这种方式对于持久化连接没用。对于持久化连接,得用disconnect()方法关闭底层连接的socket。
8. 设置HttpURLConnection参数
- 序列化对象
// 1. 设置HttpURLConnection参数 // 设定传送的内容型是可序列化的java对象 // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException) httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object"); .... .... // 2. URLConnection建立连接 // 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法, // 所以在开发中不调用上述的connect()也可以)。 OutputStream outStrm = httpUrlConnection.getOutputStream(); // 3. HttpURLConnection发送请求 // 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。 ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); // 向对象输出流写出数据,这些数据将存到内存缓冲区中 objOutputStrm.writeObject(new String("我是测试数据"));
- 字符串
connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");
9. 案例
2 BufferedReader reader = null; 3 OutputStreamWriter out= null; 4 HttpURLConnection connection = null; 5 String res = ""; 6 // 创建连接 7 URL url; 8 try { 9 url = new URL(requestUrl); 10 11 connection = (HttpURLConnection) url.openConnection(); 12 // DoOutput设置是否向httpUrlConnection输出,DoInput设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个 13 // 默认情况下是false 14 connection.setDoOutput(true); 15 connection.setDoInput(true); 16 // 连接主机的超时时间(ms) 17 connection.setConnectTimeout(10000); 18 // 从主机读取数据的超时时间(ms) 19 connection.setReadTimeout(10000); 20 // Post 请求不能使用缓存 21 connection.setUseCaches(false); 22 connection.setInstanceFollowRedirects(true); 23 // 设置请求方式 24 connection.setRequestMethod("POST"); 25 // 设置发送数据的格式 26 connection.setRequestProperty("Content-Type", "application/json;charset=utf-8"); 27 // 设置接受数据的格式 28 connection.setRequestProperty("Accept", "application/json"); 29 // 设置access_key 30 connection.setRequestProperty("access_key", accessKey); 31 // POST参数 utf-8编码 32 out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); 33 //发送请求参数即数据 34 out.write(paramJson); 35 out.flush(); 36 // 读取响应 37 reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); 38 String line; 39 while ((line = reader.readLine()) != null) { 40 res += line; 41 } 42 //断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。 43 connection.disconnect(); 44 45 json = JSON.parseObject(res); 46 } catch (Exception e) { 47 e.printStackTrace(); 48 }finally { 49 try { 50 if (out != null){ 51 out.close(); 52 } 53 if (reader != null){ 54 reader.close(); 55 } 56 } catch (IOException e) { 57 e.printStackTrace(); 58 } 59 }

浙公网安备 33010602011771号