2

PhoneGapを使用してモバイル アプリケーションを開発しており、別のプロジェクトからいくつかのサービスにアクセスする必要があります。jquery-2.0.0.jsjquery-mobile-1.3.2.jsを使用しています。

$.ajax({
            url: 'http://localhost:62465/api/account?email=johndoe@yahoo.com',
            dataType: 'json',
            success: function (data) {
                alert(data.Name);
            },
            error: function (xhr, type) {
                alert("Failed to load data");
                alert(xhr + " " + type);
            }
});

この ajax 呼び出しは毎回失敗します。config.xmlには、次の行があります。<access origin="*" />

私が間違っているかもしれない場所!

4

6 に答える 6

9

問題は、phonegap アプリケーションが Web サーバーではないものからローカル ファイルを要求していることです。ローカル ファイルは HTTP ヘッダーなしで配信されます。つまり、「200 OK」ヘッダーも「404 Not Found」エラーもありません。したがって、ステータス コードは 0 と見なされます。

単純な JavaScript XHR は、ステータスを無視し、readystate == 4 (終了して準備完了) でアクションを実行する必要があります。このような:

    var myrequest = new XMLHttpRequest();
    myrequest.open('GET','localfile.html');
    myrequest.onreadystatechange = function(){
        if(myrequest.readyState == 4) {
            var result = myrequest.responseText;
        }
    }
    myrequest.send();

MooTools では、変更されたステータス テストを Request クラスに実装するのは比較的簡単な作業です。戻りコード テストを変更して、0 を true として受け入れるようにします。このような:

Request.implement({
    isSuccess: function(){
        var status = this.status;
        return ((status >= 200 && status < 300) || status === 0);
    }
});

jQuery.... jQuery について言いたいことがいくつかあります。

status == 0 の jQuery を準備するには、success イベントの代わりに always イベントを使用する必要があります。そこでステータス コードをテストできます。

$.ajax({
   url: '/echo/html/',
   type: 'PUT',
   data: "email=a@b.com"
 }).always(function(data, textStatus, jqXHR){
   switch(textStatus) {
     case 200:
         case 0:
         alert('Success.');
             break;
         case 404:
             alert('oops');
             break;
   }
 });

Cordova/Phonegap での Ajax - イェーイ!

于 2013-10-21T15:20:32.517 に答える
2

クエリの URL はlocalhostです。つまり、同じデバイス(Android エミュレーターまたは物理) です。これはあなたの問題だと確信しています。API json サーバーの IP (またはドメイン) を使用する必要があります。おそらく 192.168.1.1 (ネットワーク構成によって異なります)

于 2013-07-31T08:25:43.880 に答える
0

url: 'http://localhost:62465/api/account?email=johndoe@yahoo.com'携帯電話から にアクセスできない場合は、非常に便利な方法があります。

ではwww.ngrok.com、インターネット ドメインをローカルで到達できないポートに割り当てることができます。

サインアップしてアクセストークンを取得するだけで、次を使用できます。 ngrok -authtoken myauthtoken -subdomain=mysubdomainname 62465

そして、URLを使用してコンピューターにアクセスできますhttp://mysubdomainname.ngrok.com/api/account?email=johndoe@yahoo.com

于 2014-05-22T09:30:51.657 に答える
0

(同様の問題を抱えている人向け) ajax エラーを使用して、何が問題なのかを確認します。

    error: function(jqXHR, exception){          
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        console.log(msg);
    }
于 2016-02-14T16:39:47.653 に答える
0

物理デバイスまたはエミュレータを使用していますか? iOS ? アンドロイド?

私が間違っているかもしれませんが、モバイル デバイスでアプリを実行している場合は、ローカルホストにアクセスできません。

于 2013-07-31T08:12:48.287 に答える