如何修改 HttpUrlConnection 的标头

Posted

技术标签:

【中文标题】如何修改 HttpUrlConnection 的标头【英文标题】:How to modify the header of a HttpUrlConnection 【发布时间】:2010-10-03 13:39:48 【问题描述】:

我正在尝试稍微改进 Java html 文档,但我遇到了HttpUrlConntion 的问题。一件事是,如果用户代理是 Java VM,某些服务器会阻止请求。另一个问题是HttpUrlConnection 没有设置ReferrerLocation 头字段。由于几个站点使用这些字段来验证内容是从他们自己的站点访问的,因此我也被阻止在这里。据我所知,唯一的解决方案是替换 HTTP 协议的 URL 处理程序。或者有什么办法可以修改默认的HTTP Handler?

【问题讨论】:

【参考方案1】:

URL.openConnection 打开URL。可选择转换为HttpURLConnection。致电URLConnection.setRequestProperty/addRequestProperty

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

【讨论】:

一定要在适当的地方区分 addRequestProperty 和 setRequestProperty。 set 变体用相同的键覆盖任何现有的标头。如果已经存在,则添加变体会添加标题的附加实例。 addRequestProperty 是否添加了新行(换句话说,请求将有 2 行带有 identical 键的行)还是将逗号和新值附加到现有线路? @leoger 感谢您的帮助 =D @leoger 实际上 addRequestProperty 会添加密钥,即使密钥已经存在,所以如果你调用 addRequestProperty("User-Agent", "A") 然后调用 addRequestProperty("User-Agent", " B"),标题将包括“User-Agent:A”和“User-Agent:B”。 laz 的答案是正确的。最好的办法是自己用Wireshark抓包,看看包头是怎样的。 我试过了,但有时它不起作用..我使用了 Apache HttpClient。它就像一个魅力。【参考方案2】:

如果您使用Apache HttpClient 来管理您的编程 HTTP 连接,您将获得一个非常有用的 API,它可以创建连接(以及在失败时可选的自动重新连接)、设置标题、发布与获取、检索返回内容的便捷方法还有更多。

【讨论】:

我知道这篇文章很旧,但如果有人读到它:HttpURLConnection 现在比 HttpClient 更受欢迎,请参阅this blog post 了解信息。【参考方案3】:

我解决了我的问题。我们可以将标头发送到 application/json 并将正文作为 json 对象传递。这样就解决了问题。

【讨论】:

以上是关于如何修改 HttpUrlConnection 的标头的主要内容,如果未能解决你的问题,请参考以下文章

如何从 HttpURLConnection 实例获取 HTTP 请求字符串

如何重用 HttpUrlConnection? [复制]

如何使用 HttpURLConnection 在请求正文中发送数据?

如何从 HttpURLConnection 读取 json 数据

使用 HTTPUrlConnection 时如何保留 cookie?

如何使用 HttpURLConnection 发布数据