Java android中的HttpURLConnection没有';无法发送正确的用户代理标头

Java android中的HttpURLConnection没有';无法发送正确的用户代理标头,java,android,http-headers,user-agent,Java,Android,Http Headers,User Agent,我发现了一个问题。我有一个服务器,它使用用户代理头来标识连接到它的设备。但是当我使用HttpURLConnection连接到服务器时,我没有得到用户代理头,但是当我连接到浏览器时,它会发送正确的用户代理 为了进行测试,我使用了一个echo服务器,它使用在请求中找到的头进行回复 当我连接到浏览器时,我得到: 例如:用户代理:Mozilla/5.0(Linux;U;Android 1.5;en-fr;HTC Hero Build/CUPCAKE)AppleWebKit/528.5+(KHTML,比如

我发现了一个问题。我有一个服务器,它使用用户代理头来标识连接到它的设备。但是当我使用HttpURLConnection连接到服务器时,我没有得到用户代理头,但是当我连接到浏览器时,它会发送正确的用户代理

为了进行测试,我使用了一个echo服务器,它使用在请求中找到的头进行回复

当我连接到浏览器时,我得到: 例如:用户代理:Mozilla/5.0(Linux;U;Android 1.5;en-fr;HTC Hero Build/CUPCAKE)AppleWebKit/528.5+(KHTML,比如Gecko)版本/3.1.2 Mobile Safari/525.20.1 Up.Link/6.3.1.20.06.3.1.20.0

但当我使用UrlConnection通过代码连接时,我得到:

用户代理:不可用

有人知道我们有不同的行为吗?如何以浏览器的相同方式连接

编辑:

我真正需要的不仅仅是User-Agent头,我还需要一些特殊的头(实际上是x-up-subno)。此标头由操作员的APN添加,但由于某种原因,当我通过代码连接时,标头不会添加到请求中

从浏览器:

从代码:

谢谢,

声明所有客户端都应该发送用户代理头。但是,它并没有说明它们应该以服务器希望的方式标识客户机。因此,Android符合该规范,您对此无能为力

您所能做的最好的事情就是使用该方法尝试在请求中获得更可取的用户代理值。目前还不能保证它会起作用,但很有可能。需要以以下方式调用该方法:

connection.setRequestProperty("User-Agent","MyAppName/1.0");

股票Android浏览器使用WebKit。如果要设置WebKit的用户代理字符串,则必须使用静态值,或从WebKit读取用户代理字符串。我没有尝试过这样做,但是WebKit用户代理字符串在Android中通过提供。

如果HttpURLConnection伪造了浏览器的用户代理,那就错了。它毕竟不是浏览器。如果它能发送更多的信息就好了,比如“Java/1.6(MacOS 10.5…”等等。

我想你会发现大多数HTTP连接库本身并不发送用户代理,但确实提供了向请求添加头的方法,以便你可以添加自己有意义的头。嗅探用户代理确实不是一个好主意,未知和撒谎的代理、阻塞软件、代理和d缓存。如果你能找到任何其他方式来表示你想要一个面向Android的特殊页面,那么就这样做。我知道这一点,但我如何才能使用浏览器正在使用的相同类型的连接字符串?我不想自己硬处理用户代理,我想使用设备用户代理。我已经更新了答案,以包括一个可能的解决方案@答:HTTP规范使用了“应该”而不是“必须”这个词。这表示这会很好,但你不是“应该”收件人。@Lucas S:当您不是浏览器时,为什么要将自己标识为浏览器?很高兴知道。我不知道有单独的RFC用于此目的。我需要这样做,以便我的服务器可以识别发送请求的设备。我附加了一些图片,其中包含连接到浏览器时获得的输出,并通过代码进行了验证。结果是什么3年后回复的原因。@JeffreyBlattman这是一个问答网站,不是论坛。只有在您有有用的信息可以添加时,才可以发布答案。当您被要求在提交问题之前对问题数据库进行搜索以确定您的问题是否曾经被问过时,该网站实际上是一个论坛.