6

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

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

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

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

用户代理:不可用。

有谁知道我们有不同的行为?我怎样才能以与浏览器相同的方式连接?

编辑:

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

从浏览器: 浏览器

从代码: 代码

谢谢,

4

2 回答 2

10

HTTP 规范声明所有客户端都应该发送 User-Agent 标头。然而,它并没有说明他们应该以服务器希望的方式识别客户端。因此,Android 符合规范,您对此无能为力。

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

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

普通的 Android 浏览器使用 WebKit。如果你想设置 WebKit 的用户代理字符串,你要么必须使用静态值,要么从 WebKit 读取用户代理字符串。我没有尝试过,但是可以通过WebSettings 类的 getUserAgentString() 方法在 Android 中使用 WebKit 用户代理字符串。

于 2009-09-15T22:43:24.133 回答
-2

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

于 2009-10-23T03:51:19.557 回答