0

私は、html5、css、js、および jQuery Mobile を使用して phonegap アプリを開発しています。既に完了し、完全に機能している Web サービスに接続する必要があります。問題は、Access Control Allow Origin と Cross Domain です。さらに、Web サービスへの接続に不可欠な認証についても考えなければなりません。私はすでに調査を行い、多くの記事を読み、多くの解決策を試しましたが、そのうちのいくつかは、最も近いものに見えるjsonPを使用していました。問題は、私はこれが初めてで、見栄えの良いチュートリアルがないため、ここの誰かが私を導いてくれることを願っています. webService は asp.net で構築されており、必要に応じて完全にアクセスできます。AJAX を使用して「呼び出し」を行っていますが、ForeFront 認証を渡すことができません。

JS+AJAX コードは次のとおりです。

function conteudoProg() {
    var webMethod = "myURL";
    var credentials = {
      username : "myUser",
      password : "myPass"
  };

$.ajax({
    type : "GET",
    url : webMethod,
    //data: credentials,
    contentType : "application/json; charset=utf-8",
    dataType : "jsonp",
    success : function(msg) {
        alert(msg);
    },
    error : function(e) {
        alert(e.status + " " + e.statusText );
    }
});
}

dataType を jsonp から json に変更すると、次のエラーが発生します。

OPTIONS https://myURL 440 (Login Timeout) 
XMLHttpRequest cannot load https://myURL Origin http://127.0.0.1:8020 is not allowed by Access-Control-Allow-Origin.

jsonp の場合、エラーは次のようになります。

Resource interpreted as Script but transferred with MIME type text/html: "https://myURL/CookieAuth.dll?GetLogon?curl=Z2FWSInqueritosZ2FServ…1820135927463_1359737732559Z26_Z3D1359737732605&reason=0&formdir=3". jquery-1.8.2.min.js:2
Uncaught SyntaxError: Unexpected token <
4

2 に答える 2

0

別のドメインへのリクエストにより、プリフライトOPTIONSリクエストが発生し、リクエスト元のドメインがこのドメインを呼び出すことができるかどうかが確認されます。

受信側は正しいヘッダーを発行する必要があります。そうしないと、ブラウザーが要求をブロックし、投稿したエラーが表示されます。

mydomain.comからにリクエストしているとします。webservice.com

次にwebservice.com/api、これらのヘッダーを発行する必要があります。

Access-Control-Allow-Origin: http[s]://mydomain.com
Access-Control-Allow-Credentials: true                      # if you want cookies
Access-Control-Allow-Headers: Content-Type, X-Custom-Header # any extra headers you want to send

OPTIONSWeb サービスがリクエストを認識していることを確認してください。実際にはいくつかの CORS ヘッダーを発行する必要があるだけで、他に何もする必要はありません (API へのリクエストを処理するなど)。

AJAX ハンドラーを変更する必要はありません。他の要求として渡されます。Cookieが必要な場合は、必ず設定してくださいhttp_request.withCredentials = true;


HTTPS URL は HTTP ドメインとは異なるものと見なされることに注意してください。HTTPS 証明書が有効であることを確認してください。無効な場合、リクエストはサイレントに失敗する可能性があります。自己署名証明書を (テスト用に) 使用している場合は、それをブラウザーまたは OS のホワイトリストに追加します。 HTTP から HTTPS へのクロス ドメイン リクエストがすぐに中止される


互換性について。以前のバージョンの Internet Explorer (8 以前) は を使用してActiveXObjectおり、この API は CORS に非常に適していません。認証/Cookie またはカスタム ヘッダー ( などContent-Type: application/JSON) はサポートされていません。JSONpフォールバックをお勧めします。

于 2013-02-01T17:01:17.780 に答える
0

.ajax メソッドが dataType json を予期することを jQuery に伝えると、それが応答を解析しようとしているため、コードは機能しません。応答が html の場合は、dataType html を使用する必要があります (または何も使用せず、デフォルトのインテリジェントな推測を機能させます)。詳細については、 jQuery.ajax() dataTypeを参照してください。

于 2013-02-01T17:03:22.537 に答える