关于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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpringBoot—–SpringBoot序列化Long转String「建议收藏」

    SpringBoot—–SpringBoot序列化Long转String「建议收藏」

    2022年5月14日
    41
  • vue转json串_vue中怎么声明一个数组

    vue转json串_vue中怎么声明一个数组一些常用更多方法介绍文章目录前言一、vue对象转数组?二、JSON数据转换1、JSON.parse2、JSON.stringify2.1、JSON.stringify高级使用总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、vue对象转数组?示例:工作中我们经常会因为和接口收到数据类型不一致,这个时候需要我们自己手动转换.

    2022年9月10日
    0
  • XLSTransformer 导出Excel数据[通俗易懂]

    XLSTransformer 导出Excel数据[通俗易懂]先上代码:packagecn.export.util;importjava.io.FileInputStream;importjava.net.URLEncoder;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.servlet.ServletOutp

    2022年7月24日
    4
  • vue引入js文件并使用_css引入js

    vue引入js文件并使用_css引入js1.处理js文件,注意格式,一定要export,否则获取到的为null2.在Vue中引入jsimportallinfofrom”../../../../static/js/allinfo.js”;3.使用js中的数据vardata=allinfo.属性名称;

    2022年10月8日
    0
  • 独立成分分析(Independent Component Analysis,ICA)原理及代码实现

    独立成分分析(Independent Component Analysis,ICA)原理及代码实现过程监控中会用到很多中方法,如主成分分析(PCA)、慢特征分析(SFA)、概率MVA方法或独立成分分析(ICA)等为主流算法。其中PCA主要多用于降维及特征提取,且只对正太分布(高斯分布)数据样本有效;SFA被用来学习过程监控的时间相关表示,SFA不仅可以通过监测稳态分布来检测与运行条件的偏差,还可以根据时间分布来识别过程的动态异常,多用于分类分析;概率MVA方法,多以解决动力学、时变、非线性等问题。今天要介绍的是独立成分分析(ICA),由浅入深,细细道来。此外文末还附有ICA可实现的代码哟~不要错过

    2022年5月17日
    45
  • ajax请求状态码是0_常见错误状态码

    ajax请求状态码是0_常见错误状态码会出现这个HTTP请求状态码400,说明这个请求是无效的,并没有进入后台服务器(控制器)里。通常的原因:前端提交的字段名称或者字段类型和后台的实体类不一样,或者前端提交的参数跟后台需要的参数个数不一致,导致无法封装。比如在SprimgMVC的控制器方法中使用了@RequestParam修饰了一个yanggb参数,但是前端在请求的时候并没有带上yanggb参数或yanggb参数为空值,就会出现这种情况;再比如前端提交到后台的数据应该是JSON字符串类型,而前端没有将对象转化为字符串类型,也会返回HTTP请

    2025年7月4日
    0

发表回复

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

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