2

アクティビティの onCreate() メソッドで loadUrl() メソッドを使用して、コンテンツを外部 Web サーバーから Web ビューにロードしています (アドロイド アプリを作成しています)。

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 のソース コードを調べたところ、(CordovaWebView.java の) loadUrl() メソッドが最終的に (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 によって送信されたヘッダーをオーバーライドできないことがわかりました。もしそうなら、ADTドキュメントがここに言うように、それらはWebViewのデフォルト値によってオーバーライドされます(メソッドloadUrl、パラメーターadditionalHttpHeadersを参照):

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

このマップに、この WebView によってデフォルトで設定されているヘッダー (キャッシングを制御するヘッダー、受け入れタイプ、またはユーザー エージェントなど) が含まれている場合、それらの値は、この WebView のデフォルトによってオーバーライドされる可能性があることに注意してください。

ドキュメントが 2 週間前 (タイムスタンプは 2012 年 9 月 13 日) のものであったかどうかはわかりません。回避策として、*MYAPP_ACCEPT* のようなカスタム HTTP ヘッダーをサーバー側で評価できる "text/html" に設定しようとしています。ただし、この追加の HTTP ヘッダーを追加するには、自己コンパイルした cordova lib を使用する必要があります。

于 2012-09-17T15:19:16.507 に答える