关于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






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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 傅里叶变换(一)——认识傅里叶变换

    傅里叶变换(一)——认识傅里叶变换注:本文为博主参考书籍和他人文章并加上自己的理解所编,作为学习笔记使用并将其分享出去供大家学习。若涉及到引用您的文章内容请评论区告知!如有错误欢迎指正! 参考文章:https://zhuanlan.zhihu.com/p/19763358p.s.本文无论是cos还是sin,都统一用“正弦波”(SineWave)一词来代表简谐波。一、什么是傅里叶变换 时域及频域    在讲…

    2022年7月17日
    27
  • jmeter ip欺骗_jmeter支持的协议

    jmeter ip欺骗_jmeter支持的协议由于服务器出于安全考虑会对同一IP地址做过滤,所以如果想要达到正常的压测效果,我们需要在发请求时伪造出不同的IP地址。主要步骤分为以下3步:第一步:在负载机上绑定IP地址。第二步:在要欺骗的http请求中,修改Implementation为httpclient模式。第三步:在要欺骗的http请求中,修改SourceIPAddress,指定请求要用到的本地地址(参数化)。首先打开负载机上的

    2025年6月1日
    3
  • Dreamweaver 2020安装教程[通俗易懂]

    Dreamweaver 2020安装教程[通俗易懂]装前先关闭杀毒软件和360卫士,注意安装路径不能有中文,安装包路径也不要有中文。1.鼠标右击【Dreamweaver2020】压缩包选择【解压到Dreamweaver2020】。2.双击打开解压后的【Dreamweaver2020】文件夹。3.双击打开【setup】文件夹。4.鼠标右击【Set-up】选择【以管理员身份运行】。5.点击【继续】。6.点击文件夹图标,然后点击【更改位置】更改安装路径。7.建议安装在除…

    2022年5月25日
    40
  • 谱图理论(spectral graph theory)

    谱图理论(spectral graph theory)介绍如何理解特征值和特征向量此部分参考了马同学的文章:如何理解矩阵特征值和特征向量?我们知道一个矩阵可以看做是线性变换又或者是某种运动,可以将一个向量进行旋转,平移等等操作,正常来说,对于一个向量vvv,并对其乘上一个A会出现下图的情况:可以看到乘了A之后v发生了一些旋转。然而所有向量中存在一种稳定的向量,他不会发生旋转,平移,只会使得向量变长或变短,而这种稳定的向量正是矩阵的特征向…

    2025年6月6日
    1
  • kl1083_显示器dpi是什么意思

    kl1083_显示器dpi是什么意思Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数。Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多少个 Windy 数?输入格式共一行,包含两个整数 A 和 B。输出格式输出一个整数,表示答案。数据范围1≤A≤B≤2×109输入样例1:1 10输出样例1:9输入样例2:25 50输出样例2:20#include<bits/stdc++.h>using namespace std;

    2022年8月9日
    8
  • openwrt旁路由 ipv6上网配置[通俗易懂]

    openwrt旁路由 ipv6上网配置[通俗易懂]openwrt旁路由ipv6上网配置路由器:小米AX3600旁路由:openwrt配置路由端配置上网方式选择:路由器拨号选Native,光猫拨号选NAT6,校园网一般选NAT6打开成功后,上网信息会显示ipv6信息软路由配置DHCP/DNS配置:网络-接口配置:测试IPv6测试…

    2022年5月8日
    426

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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