"
1.问题描述
Java HttpURLConnection类发送Http请求链接外网返回ResponseCode为411,对方为.NET服务器,网上查明原因可能来自以下:
1、可能是没有传http中的content-length参数,这个一般都有。
2、可能是因为请求方式错误的,本来只是获取数据,应该使用GET的方式;但是你使用的是POST的方式。
首先第一个方法:
conn.setRequestProperty(""Content-Length"", """"+info.getBytes().length);
设置后还是411错误
第二个方法:将请求方式改为GET, 成功。
但联调方反馈请求方式没有变,依然为POST,很纳闷.....下班后,用浏览器Http在线测试工具试了一下,发现添加参数Content-Length后,POST方式也能请求成功。
反过来,打印日志,发现属性""Content-Length""为NULL...也就是HTTPURLConnection调用setRequestProperty无效。所以这里也提醒自己,自测万无一失能避免沟通浪费。
这里推荐http测试用fiddler。定位到问题就好查了。
这个人总结的很好,自己也去看了源码。
?12345678910111213141516171819202122232425private static final Set restrictedHeaderSet; private static final String【】 restrictedHeaders = { / Restricted by XMLHttpRequest2 / //""Accept-Charset"", //""Accept-Encoding"", ""Access-Control-Request-Headers"", ""Access-Control-Request-Method"", ""Connection"", / close is allowed / ""Content-Length"", //""Cookie"", //""Cookie2"", //代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg0MTUwMA==.html
""Content-Transfer-Encoding"", //""Date"", ""Expect"", ""Host"", ""Keep-Alive"", ""Origin"", // ""Referer"", // ""TE"", ""Trailer"", ""Transfer-Encoding"", ""Upgrade"", //""User-Agent"", ""Via"" };在静态初始化代码中发现allowRestrictedHeaders是由安全管理器的返回值决定的。
restrictedHeaderSet的内容是由restrictedHeaders数组决定的。
大概原因就是出于安全考虑,这些字段尽量不要被改动。sun就做了这一套安全机制。
解决方法是在JVM启动时加入sun.NET.http.allowRestrictedHeaders属性为true。
?12First, the order of the headers is irrelevant.Second, in order to manually override the host header you need to set sun.net.http.allowRestrictedHeaders=trueeither in code
直接在程序里面加下面代码。然后就OK了。
?1System.setProperty(""sun.net.http.allowRestrictedHeaders"", ""true"");
HttpURLConnection接口
2. DoOutput和DoInput说明
httpUrlConnection.setDoOutput(true)
httpUrlConnection.setDoInput(true)
这两个方法在develope的httpUrlConnection方法中找不到的。
get请求用不到conn.getOutputStream(),因为参数直接追加在地址后面,因此默认是false。
post请求(比如:文件上传)需要往服务区传输大量的数据,这些数据是放在http的body里面的,因此需//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg0MzA3Ng==.html
要在建立连接以后,往服务端写数据。因为总是使用conn.getInputStream()获取服务端的响应,因此默认值是true。
坚持不懈
"
