android中的HttpURLConnection不会发送正确的User-Agent标头

时间:2009-09-15 22:37:20

标签: java android http-headers user-agent

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

为了进行测试,我正在使用一个回复服务器来回复它在请求中找到的标题。

当我连接浏览器时,我得到: 例如:用户代理: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。链路/ 6.3.1.20.06.3.1.20.0。

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

User-Agent:UNAVAILABLE。

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

修改

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

来自浏览器: browser

来自代码: code

谢谢,

2 个答案:

答案 0 :(得分:10)

HTTP specification表示所有客户端都应发送User-Agent标头。但是,它没有声明他们应该以服务器希望的方式识别客户端。因此Android符合规范,你可以做很多事情。

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

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

股票Android浏览器使用WebKit。如果要设置WebKit的用户代理字符串,则必须使用静态值,或者从WebKit读取用户代理字符串。我没有尝试过这个,但是通过getUserAgentString() method of the WebSettings class在Android中可以使用WebKit用户代理字符串。

答案 1 :(得分:-2)

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