19

Android 用の PhoneGap アプリを作成しています。(リモート) サーバーからデータを取得するには、jQuery の $.ajax() 関数を使用して REST 呼び出しを行います。知っておくべきことがいくつかあります。

  • 呼び出しのタイプは POST でなければなりません
  • サーバーは JSON データ (少なくともユーザー名とパスワード) を想定しています。
  • サーバーは JSON データを返します

コード:

function makeCall(){
    var url = "http://remote/server/rest/call";

    var jsonData ='{"username":"'+$('#username').val()+'","password":"'+$('#password').val()+'"}';

    $.ajax({
            headers: {"Content-Type":"application/json; charset=UTF-8"},
            type: "POST",
            url: url,
            data: jsonData,
            dataType: "json",
            success: succesFunction,
            error: errorFunction
    });
}

しかし、これはうまくいきません。Firebug を使用してサーバーの応答を確認すると、何も表示されません。TcpTrace を使用すると、リクエストのヘッダーを確認できます。予想される POST メソッドの代わりに、いくつかの奇妙なヘッダーが追加された OPTIONS メソッドがあります。

OPTIONS /remote/server/rest/call HTTP/1.1
Host: localhost:8081
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: nl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: null
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache

クロスドメインリクエストを行うことに関係があることは知っていますが、問題を解決する方法がわかりません. 私はそれを修正するためにいくつかのことを試みましたが、結果はありませんでした:

この問題は同じオリジン ポリシーにも関係していますが、これは、PhoneGap がローカルの html ファイルをロードするために使用している file:// プロトコルには当てはまりません。

私の AndroidManifest.xml ファイルでは、オプション

<uses-permission android:name="android.permission.INTERNET" />

が設定されています。

これを2日間修正しようとしていますが、今のところ結果はありません。これは可能ですか?先に進むためのヒントはありますか?

前もって感謝します!

4

5 に答える 5

10

外部ドメインをホワイトリストに登録する必要があります。xcode で phonegap / cordova plist ファイルに移動して新しいエントリを追加し、その値を * にすると、そこにある任意の Web サイトにアクセスできます。

また、これはブラウザでは機能しないことも知っておいてください。phonegap やモバイル デバイスではなく、ブラウザーにクロスドメインの問題があります。

于 2012-04-16T15:49:47.740 に答える
8

私は自分で問題を解決しました。問題はURLにあり、ドメインを追加する必要があります。私が変更され

var url = "http://remote/server/rest/call";

var url = "http://remote.mydomain.com/server/rest/call";

そしてそれは動作します!

最初のURLは、まったく同じURLと設定のiPhoneアプリで機能するため、機能するはずだと思いました。また、Windowsファイアウォールをシャットダウンする二重ファイアウォール(WindowsおよびESETファイアウォール)とも関係があります。

とにかく、あなたの答えに感謝します!

于 2012-04-17T10:41:30.757 に答える
3

これを config.xml に追加すると、私は救われました

<gap:plugin name="com.indigoway.cordova.whitelist.whitelistplugin" version="1.1.1" />
<access origin="*" />
<allow-navigation href="*" />
<allow-intent href="*" />

Google マップやリモート デバッグ ツールでさえも、外部リソースがロードされなかった理由に困惑しました。これで救われました!

于 2016-01-20T20:57:15.000 に答える
1

dataType:jsonp設定して設定してみてくださいcrossDomain:true クロスドメインのajaxリクエストにはjsonpを使用できます。 http://api.jquery.com/jQuery.ajax/

または、callback=? を追加できます。あなたのURLに。

于 2012-04-16T13:11:27.410 に答える
1

JQueryの設定:$.support.cors = true;

于 2013-05-03T06:29:26.583 に答える