我正在使用activity的onCreate()方法中的loadUrl()方法将内容从外部Web服务器加载到webview中(我正在构建一个adroid应用程序)。
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头。但我无法通过正常的cordova使用来访问该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标头?
答案 0 :(得分:1)
好的,我自己找到了答案。我发现,我无法覆盖WebView发送的标头;如果我这样做,它们会被WebView的默认值覆盖,如此处的ADT文档所述(请参阅方法 loadUrl ,参数 additionalHttpHeaders ):
http://developer.android.com/reference/android/webkit/WebView.html#loadUrl(java.lang.String,java.util.Map)
请注意,如果此地图包含此WebView默认设置的任何标题,例如控制缓存,接受类型或User-Agent的标题,则此值可能会被此WebView的默认值覆盖。
我不确定,两周前文件是否清晰(时间戳是2012年9月13日)。作为一种解决方法,我尝试将自定义HTTP标头设置为* MYAPP_ACCEPT *至&#34; text / html&#34;我可以在服务器端评估。要添加这个额外的HTTP头,我需要使用我自编的cordova lib。