首页 > 其他分享 >HttpURLConnection使用分析

HttpURLConnection使用分析

时间:2023-02-28 17:24:01浏览次数:42  
标签:分析 调用 请求 获取 connection 使用 HttpURLConnection out

在项目中遇到各种版本的httpClient,所以想了解一下httpClient的实现

首先查看的是JDK1.1中自带的HttpURLConnection,看一下最初的设计是怎么样的

代码分析

使用HttpURLConnection主要分几步

//第一步是先获取HttpURLConnection对象
//请求url
URL url = new URL(请求url);
//得到请求对象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

//第二步是设置请求方法和请求头

//请求方法为POST
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//  connection.setRequestProperty("Content-Type", "application/json");
//设置连接超时和读取超时
connection.setConnectTimeout(100);
connection.setReadTimeout(100);
//设置是否将参数输出倒正文
connection.setDoOutput(true);
//设置是否从 httpUrlConnection读取请求结果,默认情况下是true;
connection.setDoInput(true);

如果有参数的话就可以往里写,HTTP正文的内容是通过OutputStream流写入的, 向流中写入的数据不会立即发送到网络,而是存在于内存缓冲区中,待流关闭时,根据写入的内容生成HTTP正文

//参数
if(prarm != null){

 OutputStream out = connection.getOutputStream();
 out.write(prarm.getBytes());
 out.flush();
 out.close();
}
//请求头也是
  if (heard != null) {
      for (Map.Entry<String, String> stringObjectEntry : heard.entrySet()) {
          connection.setRequestProperty(stringObjectEntry.getKey(), stringObjectEntry.getValue());
      }
  }

如果使用json参数,先将json参数转换成字符串,然后再获取字节

第三步发起请求

 //这一步是会发起tcp请求,完成三次握手
 connection.connect();
 //获取相应,底层是调用getInputStream()获取输入流,这一步才是发起http请求的
 int responseCode = connection.getResponseCode();

第四步获取响应,在调用getInputStream()方法时,返回一个输入流,用于从中读取服务器对于HTTP请求的返回信息

   //响应码是200才去获取响应
   if (responseCode == HttpURLConnection.HTTP_OK) { 
   		//从流中获取
        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        // print result
        System.out.println(response.toString());
    }

在调用connect()的时候会发钱tcp请求完成三次握手

在调用到connection.getResponseCode()时发起了http请求,这个方法的底层时调用了getInputStream()方法

也就是说获取流的时候才会去发起http请求

HttpURLConnection默认是长连接的,如果要关闭的话需要调用connection.disconnect();

如果没有开启长连接的话,当关闭流的时候就会断开连接

HttpURLConnection的功能相当简单,什么都没封装,如果想实现异步请求、或者想使用线程池来请求、获取cookie等功能的话就会比较麻烦

标签:分析,调用,请求,获取,connection,使用,HttpURLConnection,out
From: https://www.cnblogs.com/aruo/p/17165081.html

相关文章

  • phaser引擎使用记录
    初始化gamefunctiongameInit(){game=newPhaser.Game({type:Phaser.WEBGL,//游戏渲染方式---手机游戏请务必指定Phaser.CANVASWEBGL......
  • 使用 “apifm-wxapi” 快速开发小程序
    步骤一、安装apifm-wxapi1、npminit初始化项目先你需要检查一下你的小程序项目是否支持npm,判断标准很简单,你看一下你的小程序根目录下有没有“package.json”......
  • Fiddler工具的使用方法及常见的设置方式
    一. 使用fiddler工具抓包1.准备:通过ipconfig查看PC的IP地址。(快捷键“ctrl+r”,输入cmd,弹出黑框,然后输入ipconfig)或者直接在百度中搜索查询本机IP及端口号。2.启动Fiddle......
  • Xilinx URAM使用说明 UG573
    UltraRAMResourcesUltraRAMSummaryUltraRAM是单时钟、双端口、同步存储器,可用于UltraScale+™器件。由于UltraRAM与柱状(columnar)架构兼容,因此多个UltraRAM可......
  • vtk 鼠标截取数据 使用 vtkClipPolyData 裁剪删除选中的矩形区域
    vtkVolumeMapper类中提供了两种裁剪技术,分别为Cropping和Clipping按键盘R可以进行矩形区域裁剪,再按R返回正常状态效果:#include"InteractorStyle.hpp"#pragmaonce#includ......
  • C++使用curl库 以字节流方式 发送 https同步请求
     //在数据头设置 Content-Typeapplication/octet-stream否则可能会默认因为有字符&造成无法正确传输;//设置消息头curl_slist*header=NULL;header=curl......
  • protobuf使用(二)android ndk
    简介 1.  官方文档中提到一些protobuf的优点,protobuf灵活高效的结构化数据存储格式.方便用于序列化,适合做RPC的数据交换.2.  相比XML,protobuf比XML更小......
  • thinkphp6:使用session(thinkphp v6.0.10LTS)
    一,项目中启用session1,app/middleware.php添加如下一行//Session初始化\think\middleware\SessionInit::class2,注意给runtime目录加入写权限:例:liuhongd......
  • 直播搭建 -go - 使用go的轻量流媒体服务器livego
    golang的流媒体服务器livego的使用,livego是基于golang开发的简单高效的rtmp直播服务器。github地址:livego/README_cn.mdatmaster·gwuhaolin/livego(github.com)......
  • 使用 logrotate 切割nginx日志
    日志滚动logrotate能够自动完成日志的压缩、备份、删除和日志邮寄等工作。●logrotate默认的主配置文件是/etc/logrotate.conf。●/etc/logrotate.d的目录下的文件,这......