在项目中遇到各种版本的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等功能的话就会比较麻烦

HttpURLConnection使用分析的更多相关文章

  1. Android HttpURLConnection源代码分析

    Android HttpURLConnection源代码分析 之前写过HttpURLConnection与HttpClient的差别及选择.后来又分析了Volley的源代码. 近期又遇到了问题,想在V ...

  2. Android 4.4以上使用HttpURLConnection底层使用OkHttp实现的源码分析

    研究了一下HttpURLConnection的源码: 在使用的时候都是通过URL.openConnection()来获取HttpURLConnection对象,然后调用其connect方法进行链接,所 ...

  3. java http工具类和HttpUrlConnection上传文件分析

    利用java中的HttpUrlConnection上传文件,我们其实只要知道Http协议上传文件的标准格式.那么就可以用任何一门语言来模拟浏览器上传文件.下面有几篇文章从http协议入手介绍了java ...

  4. JDK下sun.net.www.protocol.http.HttpURLConnection类-----Http客户端实现类的实现分析

    HttpClient类是进行TCP连接的实现类, package sun.net.www.http; import java.io.*; import java.net.*; import java. ...

  5. HttpUrlConnection底层实现和关于java host绑定ip即时生效的设置及分析

    最近有个需求需要对于获取URL页面进行host绑定并且立即生效,在java里面实现可以用代理服务器来实现:因为在测试环境下可能需要通过绑定来访问测试环境的应用实现代码如下: public static ...

  6. spring remoting源码分析--Hessian分析

    1. Caucho 1.1 概况 spring-remoting代码的情况如下: 本节近分析caucho模块. 1.2 分类 其中以hession为例,Hessian远程服务调用过程: Hessian ...

  7. Android ANR 分析解决方法

    一:什么是ANR ANR:Application Not Responding,即应用无响应 二:ANR的类型 ANR一般有三种类型: 1. KeyDispatchTimeout(5 seconds) ...

  8. Android探索之HttpURLConnection网络请求

    前言: 最近一直想着学习一下比较好的开源网络框架okhttp,想着学习之前还是先总结一下Android原生提供的网络请求.之前一直在使用HttpClient,但是android 6.0(api 23) ...

  9. Spring源码分析——资源访问利器Resource之实现类分析

    今天来分析Spring的资源接口Resource的各个实现类.关于它的接口和抽象类,参见上一篇博文——Spring源码分析——资源访问利器Resource之接口和抽象类分析 一.文件系统资源 File ...

  10. Spring源码分析——资源访问利器Resource之接口和抽象类分析

    从今天开始,一步步走上源码分析的路.刚开始肯定要从简单着手.我们先从Java发展史上最强大的框架——Spring...旗下的资源抽象接口Resource开始吧. 我看了好多分析Spring源码的,每每 ...

随机推荐

  1. [转帖]PostgreSQL配置文件--WAL

    2022-12-23 3.1 Settings 3.1.1 fsync 字符串 默认: fsync = on 开启后强制把数据同步更新到磁盘,可以保证数据库将在OS或者硬件崩溃的后恢复到一个一致的状态 ...

  2. go多版本管理

    在日常开发工作过程中,很多时候我们都需要在自己的机器上安装多个go版本,像是go1.16引入的embed,go1.18引入了泛型:又或是自己本地使用的是最新版,但公司的项目中使用的go1.14.go1 ...

  3. 从零开始配置 vim(12)——主题配置

    在我们进一步增强vim的功能之前,我们先为vim准备一个漂亮的主题,毕竟对着一个丑陋原始的界面多少有点提不起劲来进行编程.长时间对着丑陋的界面多多少少会产生抑郁情绪的.下面推荐几款我觉得还不错的主题插 ...

  4. TienChin 渠道管理-渠道导入

    ChannelController @PostMapping("/importTemplate") void importTemplate(HttpServletResponse ...

  5. paddle之visualDL工具使用,可视化利器。

    相关链接: [一]AI Studio 项目详解[(一)VisualDL工具.环境使用说明.脚本任务.图形化任务.在线部署及预测]PARL_汀.的博客-CSDN博客 isualDL 是一个面向深度学习任 ...

  6. Prompt learning 教学基础篇:prompt基本原则以及使用场景技巧助力你更好使用chatgpt,得到你想要的答案

    Prompt learning 教学[基础篇]:prompt基本原则以及使用场景技巧助力你更好使用chatgpt,得到你想要的答案 如果你想系统学习 如果你对 AI 和 Prompt Engineer ...

  7. STM32CubeMX教程29 USB_HOST - 使用FatFs文件系统读写U盘

    1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 ...

  8. Leetcode刷题第一天-贪心

    455-分饼干 链接:455. 分发饼干 - 力扣(LeetCode) 优先使用最小饼干满足最小胃口,一个娃只能分一个饼干T_T不能加 1 class Solution: 2 def findCont ...

  9. PHP中GD库

    PHP中GD库 一.GD库的介绍 1.GD库是什么? Graphic Device,图像工具库,gd库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成 ...

  10. 关于大数乘法的数组类型问题(int 还是char)

    可以知道在处理高精度乘法的时候,我们是不考虑当场进位的,在所有位数都模拟完竖式乘法后才进行逐位进位,这就要求存储每个位的数组保证不会爆掉溢出 众所周知char类型最多只能存储到255,非常非常容易溢出 ...