0

UPDATE 3エンドポイントhttp://httpbin.org/user-agentを打つ、要求が正常に返さAndroidの組み込みのWebViewからの呼び出しに応答しませんでした。だから、私のHaskell Warp + WAIアプリケーションサーバで何かが間違っています。ハスケルWARP/WAIサーバは、AJAXが

ほとんどのブラウザでサーバAPIコールを動作させることはできますが、Android WebViewではできません。


明確にするために、私ははどのドメイン間のリクエストも行っていません。ここでは何百もの質問がありますが、私のAJAXリクエストはWebViewがロードしたのと同じドメインにあります。

代わりにjQueryのUPDATE 2私はそうのような、より基本的なXHRメソッドを使用:

function pingServer() 
{ 
    var xhr = new XMLHttpRequest(); 
    xhr.open('get', URL + 'ping'); 

    // Track the state changes of the request. 
    xhr.onreadystatechange = function() 
    { 
    var DONE = 4; // readyState 4 means the request is done. 
    var OK = 200; // status 200 is a successful return. 

    if (xhr.readyState === DONE) 
    { 
     if (xhr.status === OK) 
     { 
     $('#submitDialog p').text(xhr.responseText + ' : ' + xhr.status); 
     } 
     else 
     { 
     $('#submitDialog p').text(xhr.responseText + ' : ' + xhr.status); 
     } 
    } 
    }; 
    xhr.send(null); 
} 

まだ運。 xhr.responseTextは空白で、xhr.statusは、何かが私のサーバーに問題がある場合、私は思ったんだけど0

のですか?私は、WAIでHaskellベースのWARPである普通ではないサーバーを使用しています。 ...しかし、他のすべてのブラウザですべてうまく動作するのはなぜですか?


UPDATE私はいくつかのデバッグを行なったし、これは、私は、以下に示すAJAXコール(基本的には 'サーバーのアップです?' GETクエリ)に取得していますエラーです:

error: NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load ' http://www.example.net:2753/ping '

言うまでもなく、正確なURL(例ではなく、私が使っている実際のURL)は、モバイルやデスクトップのブラウザで正常に読み込まれます - Android WebViewだけがこの問題を抱えています!


私は単純なAndroidアプリを持っています。リモートURL(ローカルリソースではありません)をロードするWebViewだけです。私のAJAX呼び出しのすべてがすぐにエラーコールバックを呼び出すことを除いて、正常に動作します。私はサムスンギャラクシーS6でテストしていて、SDK 21にアプリケーションをビルドしています。

ここで私の最初のAJAX呼び出し(失敗)は次のようになります。その他は同じプロパティを使用:

$.ajax(
{ 
    url: URL + 'ping', 
    cache: false, 
    async: false, 
    timeout: 5000, 
    error: fail, 
    success: transmitScore 
}); 
もちろん

transmitScore()は(失敗)が他の場所でスコープ内で定義されています。間違って何が起こっているか

import android.app.Activity; 
import android.content.pm.ActivityInfo; 
import android.os.Bundle; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

import java.util.Locale; 

public class Example extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
     setContentView(R.layout.main); 

     WebView wv = (WebView) findViewById(R.id.webview); 

     wv.setWebViewClient(new WebViewClient() 
     { 
      public void onPageFinished(WebView v, String s) 
      { 
       v.loadUrl("javascript: setLang('" + 
        Locale.getDefault().getLanguage() + "')"); 
      } 
     }); 
     wv.getSettings().setJavaScriptEnabled(true); 
     wv.loadUrl("http://example_url_for_privacy:2753/application"); 
    } 
} 

任意のアイデア:ここ

は私のWebViewの設定がどのように見えるのですか? AJAXの呼び出しは、デスクトップChromeとAndroid Chromeでうまく動作します。

AJAXのローカルリソースファイルのクロスドメイン権限が必要ですが、ここでは多くの質問がありましたが、それは私の状況ではありません。すべてのリソースはリモートサーバー上にあり、すべてのAJAX呼び出しがそのリソースに移動します。

私もWebChromeClientを使用するように私ののWebViewを設定しようとしましたが、それは何の違いが行われていません。私は今、それがWebViewsのデフォルトであると信じています。。 AJAX呼び出しでは、私は非同期キャッシュの4つの可能な組み合わせを試してみました。なし。

+0

@Sacheieは、エラーを警告すべきである 'onerror'イベントハンドラを追加してみてください。そして、私に知らせてください –

+0

@SagarV、私はonerror()が余分なエラー情報を提供しているのかどうかはわかりません - コールバックのように見えますので、xhrプロパティをチェックしてエラーを検出する必要はありません。私は、xhr.responseTextが空白で、xhr.statusが0であるという事実よりも詳細なエラー情報をどのように受け取るのか分かりません。 – sacheie

+0

@Ryad URLはSSLを使用していません。それがあれば、なぜデスクトップブラウザ(とAndroid用Chrome)でリクエストが機能するのでしょうか。 私はマニフェスト(?そうでなければ、なぜページでも読み込みます)のインターネットアクセス許可を持っている - *私はAJAXのために必要な別の権限があります* – sacheie

答えて

1

WebViewがIPアドレスでページを読み込んでいたのに対し、JavaScriptはドメイン名で参照されていました。私が知っているすべてのために、それをしないのが常識かもしれません。しかし、方法が非WebViewクライアントがそれを処理OK私は可能な問題として早期にそれを排除させた。

+0

そうでない特別な理由がない限り、通常、常にドメイン名を使用してください。あなたのケースの問題はおそらく、リクエストヘッダーにHostフィールドがないか間違っていたことでしょう。 – Cubic