在项目中遇到各种版本的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. [转帖]DOCKER默认网段和主机网段冲突解决

    https://www.cnblogs.com/yinliang/p/13189334.html 一. docker默认网卡docker0 172.17.0.0可能会与主机冲突,这时候需要修改dock ...

  2. ARM下KVM虚拟化的损耗验证--redis

    ARM下KVM虚拟化的损耗验证 摘要 看Windows 上面的 Workstation的虚拟机的 网络层的延迟特别高. 突然想之前统计都是直接在本地验证的, 只考虑了虚拟化CPU的性能损耗 没有考虑虚 ...

  3. [转帖]CPU的制造和概念

    https://plantegg.github.io/2021/06/01/CPU%E7%9A%84%E5%88%B6%E9%80%A0%E5%92%8C%E6%A6%82%E5%BF%B5/ 为了让 ...

  4. Grafana 监控 PG数据库的操作过程

    Grafana 监控 PG数据库的操作过程 容器化运行 postgres-exporter 进行处理 1. 镜像运行 exporter docker run -p 9187:9187 -e DATA_ ...

  5. Booking.com如何在毫秒内搜索数百万个地点

    译自:How Booking.com Searches Through Millions of Locations in Milliseconds Booking.com是一家与酒店.旅馆.度假租赁等 ...

  6. git日志输出相关命令

    git log 默认输出所有的日志 git log 默认输出所有的日志 git 日志输出--只看最近的两条或者三条 有些时候我们可能只需要看最近的2或者3条日志 git log -2 日志输出--只看 ...

  7. zap自定义日志级别

    简介 zap是有uber开发的一款日志库. zap提供了三个快速创建Logger方法: NewProduction: 以JSON格式记录Info级别及以上的标准错误日志 NewDevelopment: ...

  8. gin启动https支持

    gin是一个使用Go语言开发的Web框架,具有运行速度快,分组的路由器,良好的崩溃捕获和错误处理,支持中间件等. 在工作中有时候需要支持https服务,gin可以通过中间件的方式来提供对https的支 ...

  9. Gorm 数据库表迁移与表模型定义

    目录 一.Docker快速创建MySQL实例 1.1 创建 1.3 创建数据库 二.AutoMigrate介绍与使用 2.1 AutoMigrate介绍 2.2 AutoMigrate 基本使用 三. ...

  10. 我为什么从Windows转到Linux?

    本文来自读者投稿! 大家好!我是 Guide 哥,Java 后端开发.一个会一点前端,喜欢烹饪的自由少年. 如果文章有任何需要改善和完善的地方,欢迎在评论区指出,共同进步! 喔,看到这个标题千万不要以 ...