如何修改HttpUrlConnection的头部

26

我正在尝试改进Java Html文档,但在使用HttpUrlConnection时遇到了问题。其中一个问题是,如果用户代理是Java VM,某些服务器会阻止请求。另一个问题是,HttpUrlConnection不会设置ReferrerLocation标头字段。由于一些网站使用这些字段来验证内容是否从他们自己的网站访问,因此我在这里被阻止了。据我所见,唯一的解决方法是替换HTTP协议的URL处理程序。或者是否有任何修改默认HTTP处理程序的方法?

3个回答

42

使用URL.openConnection打开URL。可选地将其转换为HttpURLConnection。调用 URLConnection.setRequestProperty/addRequestProperty

默认的User-Agent头值是从"http.agent"系统属性设置的。PlugIn和WebStart允许您设置此属性。


11
请注意区分 addRequestProperty 和 setRequestProperty 的不同用法。set 方法会覆盖相同键名的任何现有请求头信息,而 add 方法会在原有请求头信息的基础上增加一个额外的同名信息。 - laz
addRequestProperty 方法会添加一个新行(换行符),也就是请求将包含两个具有相同键的行,而不是在现有行后面追加逗号和新值。 - Pacerier
@leoger 实际上,addRequestProperty 方法会添加键,即使该键已经存在,因此如果您调用 addRequestProperty("User-Agent", "A") 然后调用 addRequestProperty("User-Agent", "B"),则标头将包括 "User-Agent: A" 和 "User-Agent: B"。laz 的答案是正确的。最好的方法是使用 Wireshark 自己捕获数据包并查看标头。 - Daniel Chow
实际上,使用http://httpbin.org可能比使用wireshark更好。 - Jonathan
1
我尝试过,但有时候不起作用。我使用了Apache HttpClient。它非常好用。 - Kyung Hwan Min

2
如果您使用Apache HttpClient来管理程序化HTTP连接,您将获得一个非常有用的API,它可以轻松创建连接(并在失败时进行可选的自动重新连接),设置标头,区分POST和GET请求,方便地检索返回的内容等等。

12
我知道这篇帖子旧了,但如果有人看到它:现在HttpURLConnection比HttpClient更受欢迎,请查看此博客文章(http://android-developers.blogspot.com/2011/09/androids-http-clients.html)获取详细信息。 - kamituel

0

我解决了我的问题。我们可以将头文件发送到 application/json,并将正文作为 json 对象传递。这简单地解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接