's Blog

详解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)
  • setRequestPropertyaddRequestProperty区别就是,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. 序列化对象
    // 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("我是测试数据"));
  2. 字符串
    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 }

 

posted @ 2021-12-07 17:34  Limit℃  阅读(376)  评论(0)    收藏  举报