关于UrlHttpConnection.setRequestProperty()的调用顺序问题的验证「建议收藏」

关于UrlHttpConnection.setRequestProperty()的调用顺序问题的验证「建议收藏」因为在项目中使用到了HttpURLConnection请求资源,对于其中的方法setRequestProperty()

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在Android项目中使用到了HttpURLConnection请求资源,对于其中的方法setRequestProperty()的调用顺序有些疑惑。

API注释如下所示:

关于UrlHttpConnection.setRequestProperty()的调用顺序问题的验证「建议收藏」

即:这个方法只能够在连接建立之前调用。

也就是说,该方法只能在连接建立之前调用才能使得设置的相应参数生效。


我的问题是:如果调用了setRequestProperty(name,value)之后没有明确调用connect()方法,那设置的参数是否会生效呢?

第一直觉是如果调用了setRequestProperty(name,value)之后没有明确调用connect()方法,那么设置的对应参数是不会生效的!

为了验证我的想法,做了如下验证:

实验一:在调用setRequestProperty(name,value)之后,调用getInputStream()之前没有明确调用connect()方法,代码如下所示:

String resource = “http://www.blogjava.net/supercrsky/articles/247449.html”;
URL url = new URL(resource);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestProperty(“Content-Type”, “text/plain; charset=utf-8”);
//conn.connect();
InputStream is = conn.getInputStream();

byte[] buffer = new byte[1024];
int count = -1;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((count = is.read(buffer)) > 0) {

      bos.write(buffer, 0, count);
}
buffer = bos.toByteArray();
System.out.println(new String(buffer,”UTF-8″));
conn.disconnect();

运行程序,抓包结果:

GET /supercrsky/articles/247449.html HTTP/1.1
Content-Type: text/plain; charset=utf-8   // 显然,设置的属性生效了!
User-Agent: Java/1.6.0_21
Host: www.blogjava.net
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive


实验二:在调用setRequestProperty(name,value)之后,调用getInputStream()之前明确调用connect()方法,代码如下所示:

String resource = “http://www.blogjava.net/supercrsky/articles/247449.html”;
URL url = new URL(resource);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestProperty(“Content-Type”, “text/plain; charset=utf-8”);
conn.connect();
InputStream is = conn.getInputStream();

byte[] buffer = new byte[1024];
int count = -1;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((count = is.read(buffer)) > 0) {

      bos.write(buffer, 0, count);
}
buffer = bos.toByteArray();
System.out.println(new String(buffer,”UTF-8″));
conn.disconnect();

运行程序,抓包结果:

GET /supercrsky/articles/247449.html HTTP/1.1
Content-Type: text/plain; charset=utf-8   // 显然,设置的属性也生效了!
User-Agent: Java/1.6.0_21
Host: www.blogjava.net
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive


结论:

1. 很显然,不论是否明确调用connect()方法,通过setRequestProperty(name,value)设置的属性都生效了,那这是为什么呢?

经过一番查证,原来是在调用getInputStream()方法中会检查连接是否已经建立,如果没有建立,则会调用connect()方法,所以疑惑解开了!

原来是在调用getInputStream()的时候会做连接是否建立的检查!


2. 那么,在写代码的时候是否需要明确调用connect()呢?

个人建议还是明确调用一些比较好,因为这样对于程序员自己来说是一个明确的控制,否则埋藏一些隐性的BUG,难以察觉。


相关资料:

(1)参考:http://www.blogjava.net/supercrsky/articles/247449.html

(2)HttpURLConnection源码:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/net/www/protocol/http/HttpURLConnection.java#HttpURLConnection.plainConnect%28%29






版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195388.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • thinkphp浏览历史功能实现方法

    thinkphp浏览历史功能实现方法

    2021年10月30日
  • python进阶(13)装饰器[通俗易懂]

    python进阶(13)装饰器[通俗易懂]装饰器装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上。和这个函数绑定在一起。在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,

  • CubieBoard 简单入门

    CubieBoard 简单入门大约一个月之前折腾的部分记录,当时没有完全完成,就着手其他事情了,这是存在LiveWriter中的草稿,先发出来吧,后来花了一段时间移植Qt,一直遇到了点问题,并没有完全跑通,后续估计也没有时间再继

  • 16 岁高中生成功将 Linux 移植到 iPhone,并贴出详细指南[通俗易懂]

    16 岁高中生成功将 Linux 移植到 iPhone,并贴出详细指南[通俗易懂]本文转载自InfoQ,作者李俊辰如果你的旧iPhone已经无法支持你日常使用了,你会怎么处理这部iPhone呢?卖掉还是留起来收藏呢?近日,国外一名16岁的小开发者在YouTube上发布了一则视频,展示了自己是如何将Linux移植到一部无法使用的iPhone7。2020年3月,Corellium提出了ProjectSandcastle,通过使用checkra1n越狱程序在iPhone上成功运行Android,激发了开发者对那些旧型号的iPhone.

  • java tess4j ddl_tess4j jna dll报错,求助

    java tess4j ddl_tess4j jna dll报错,求助使用最新的tess4j3.3.0包,这个版本的dll文件应该是集成在jar包里面的,环境是win10,vc环境健全,使用eclips代码:importjava.io.File;importnet.sourceforge.tess4j.ITesseract;importnet.sourceforge.tess4j.Tesseract;importnet.sourceforge.tess4j…

  • atcoder它A Mountaineer

    atcoder它A Mountaineer

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号