HttpURLConnection使用分析
在项目中遇到各种版本的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使用分析的更多相关文章
- Android HttpURLConnection源代码分析
Android HttpURLConnection源代码分析 之前写过HttpURLConnection与HttpClient的差别及选择.后来又分析了Volley的源代码. 近期又遇到了问题,想在V ...
- Android 4.4以上使用HttpURLConnection底层使用OkHttp实现的源码分析
研究了一下HttpURLConnection的源码: 在使用的时候都是通过URL.openConnection()来获取HttpURLConnection对象,然后调用其connect方法进行链接,所 ...
- java http工具类和HttpUrlConnection上传文件分析
利用java中的HttpUrlConnection上传文件,我们其实只要知道Http协议上传文件的标准格式.那么就可以用任何一门语言来模拟浏览器上传文件.下面有几篇文章从http协议入手介绍了java ...
- JDK下sun.net.www.protocol.http.HttpURLConnection类-----Http客户端实现类的实现分析
HttpClient类是进行TCP连接的实现类, package sun.net.www.http; import java.io.*; import java.net.*; import java. ...
- HttpUrlConnection底层实现和关于java host绑定ip即时生效的设置及分析
最近有个需求需要对于获取URL页面进行host绑定并且立即生效,在java里面实现可以用代理服务器来实现:因为在测试环境下可能需要通过绑定来访问测试环境的应用实现代码如下: public static ...
- spring remoting源码分析--Hessian分析
1. Caucho 1.1 概况 spring-remoting代码的情况如下: 本节近分析caucho模块. 1.2 分类 其中以hession为例,Hessian远程服务调用过程: Hessian ...
- Android ANR 分析解决方法
一:什么是ANR ANR:Application Not Responding,即应用无响应 二:ANR的类型 ANR一般有三种类型: 1. KeyDispatchTimeout(5 seconds) ...
- Android探索之HttpURLConnection网络请求
前言: 最近一直想着学习一下比较好的开源网络框架okhttp,想着学习之前还是先总结一下Android原生提供的网络请求.之前一直在使用HttpClient,但是android 6.0(api 23) ...
- Spring源码分析——资源访问利器Resource之实现类分析
今天来分析Spring的资源接口Resource的各个实现类.关于它的接口和抽象类,参见上一篇博文——Spring源码分析——资源访问利器Resource之接口和抽象类分析 一.文件系统资源 File ...
- Spring源码分析——资源访问利器Resource之接口和抽象类分析
从今天开始,一步步走上源码分析的路.刚开始肯定要从简单着手.我们先从Java发展史上最强大的框架——Spring...旗下的资源抽象接口Resource开始吧. 我看了好多分析Spring源码的,每每 ...
随机推荐
- [转帖]数据可视化之redash(支持43种数据源) (转自https://anjia0532.github.io/2019/07/08/redash/)
https://www.cnblogs.com/a00ium/p/13177272.html 人类都是视觉动物,讲究一图胜千言.如果没了可视化,那么你在跟领导汇报工作时,很大程度会鸡同鸭讲.其实 ex ...
- [转帖]Kubernetes-17:Kubernets包管理工具—>Helm介绍与使用
https://www.cnblogs.com/v-fan/p/13949025.html Kubernets包管理工具->Helm 什么是Helm? 我们都知道,Linux系统各发行版都有自己 ...
- 飞腾2000+银河麒麟v10安装redis的注意事项
先说一下结论 无法复用ubuntu上面编译的二进制文件 无法直接使用docker官网下面的arm64的镜像运行 无法直接使用redis6.0.10最新版本编译运行 可以使用redis5.0.4 进行编 ...
- CDP技术系列(三):百万级QPS的人群命中服务接口性能优化指南
一.背景介绍 CDP系统提供了强大的标签和群体的构建能力,面对海量数据的标签和群体,我们采用了Bitmap+ClickHouse的存储与计算方案.详细内容可以参考之前文章. 有了群体之后,它们被广泛的 ...
- RedisSyncer同步引擎的设计与实现
RedisSyncer一款通过replication协议模拟slave来获取源Redis节点数据并写入目标Redis从而实现数据同步的Redis同步中间件. 该项目主要包括以下子项目: redis 同 ...
- RabbitMQ原理详解
RabbitMQ:我们通常谈到消息队列,就会联想到这其中的三者:生产者.消费者和消息队列,生产者将消息发送到消息队列,消费者从消息队列中获取消息进行处理.对于RabbitMQ,它在此基础上做了一层抽象 ...
- 为mac搭建开发环境的笔记
公司的游戏项目需要出ios包上架到app store,由我负责接入ios的sdk,这里记录一下为mac搭建开发环境的笔记,大多是软件和编程习惯相关的内容. 常用软件 解压缩软件:bandizip在ma ...
- 搭建mongo的replica set
搭建mongo的replica set 前言 安装 构建副本集 加入认证 备份数据 备份数据到本地 数据恢复 搭建mongo的replica set 前言 准备三台机器,相互可以访问的.处理思路,先构 ...
- 1.7 完善自定位ShellCode
在之前的文章中,我们实现了一个正向的匿名管道ShellCode后门,为了保证文章的简洁易懂并没有增加针对调用函数的动态定位功能,此类方法在更换系统后则由于地址变化导致我们的后门无法正常使用,接下来将实 ...
- 9.0 Python 内置模块应用
Python 是一种高级.面向对象.通用的编程语言,由Guido van Rossum发明,于1991年首次发布.Python 的设计哲学强调代码的可读性和简洁性,同时也非常适合于大型项目的开发.Py ...