2

我在活动的 onCreate() 方法中使用 loadUrl() 方法将内容从外部 Web 服务器加载到 Web 视图中(我正在构建一个 Android 应用程序)。

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  super.loadUrl("http://server-name/path/to/my/server/app/");
}

在服务器上,我检查 ACCEPT HTTP 标头以决定将哪种数据格式传递给客户端。

现在的问题是:loadUrl() 方法似乎总是发送 ACCEPT 标头值“application/xml,...”,这将导致我的服务器传递的数据不是布局良好的 html(这就是我想要的 webview ),而是作为纯 xml(这对于某些 Web 服务客户端来说是很好的)。

所以我想做的是将 ACCEPT HTTP 标头设置为“text/html”,但 loadUrl() 方法不允许我这样做。

我查看了 cordova/android 的源代码,发现 loadUrl() 方法(在 CordovaWebView.java 中)最终调用了(android sdk)WebView 的 loadUrl() 方法,该方法被重载以获取一些额外的 http 标头。但是我无法通过正常的科尔多瓦使用访问该 loadUrl 方法。

所以我编辑了 CordovaWebView 的 loadUrlNow() 方法,该方法调用了 WebView 的 loadUrl() 方法并硬编码了一个额外的标头:

void loadUrlNow(String url) {
  ...
  Map<String, String> extraHeaders = new HashMap<String, String>();
  extraHeaders.put("ACCEPT", "text/html");
  super.loadUrl(url, extraHeaders);
}

然后编译它,用我自己的替换原来的 cordova.jar 并重建我的 android 应用程序。但是,如果我现在启动应用程序并检查服务器端的 ACCEPT HTTP 标头,则 ACCEPT 标头没有改变。它的值与硬编码额外标头之前的值相同;看来我无法更改该标题。

那么,在调用 loadUrl() 方法时,有什么方法可以设置 ACCEPT http 标头吗?

4

1 回答 1

1

好的,我自己找到了答案。我发现,我无法覆盖 WebView 发送的标头;如果我这样做了,它们会被 WebView 的默认值覆盖,正如 ADT 文档在此处所说的那样(请参阅方法loadUrl,参数additionalHttpHeaders):

http://developer.android.com/reference/android/webkit/WebView.html#loadUrl(java.lang.String , java.util.Map)

请注意,如果此映射包含此 WebView 默认设置的任何标头,例如控制缓存、接受类型或用户代理的标头,则它们的值可能会被此 WebView 的默认值覆盖。

我不确定两周前的文档是否清晰(时间戳为 2012 年 9 月 13 日)。作为一种解决方法,我正在尝试将 *MYAPP_ACCEPT* 之类的自定义 HTTP 标头设置为“text/html”,我可以在服务器端对其进行评估。不过,要添加这个额外的 HTTP 标头,我需要使用我自己编译的 cordova 库。

于 2012-09-17T15:19:16.507 回答