0

JQuery から Web サービスを呼び出すことができません。

私がアクセスしている URL は次http://www.deeptraining.com/webservices/weather.asmx?WSDLのとおりですGetWeather。Firefox を使用していますが、次のメッセージが表示されます。

Firefox コンソール: [19:43:29.849] オプション http://www.deeptraining.com/webservices/weather.asmx?op=GetWeather [HTTP/1.1 200 OK 371ms]

アラート: 未定義のパーサー エラー

コード200を取得した場合、リクエストが正常に送信されたことを意味しますか? 私は何を間違っていますか?リクエストを行う正しい方法は何ですか?ありがとう!!

これが私のコードです:

<html>
    <head>
        <title>Calling Web Service from jQuery</title>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
        <script type="text/javascript">
        $(document).ready(function () {
        $("#btnCallWebService").click(function (event) {
            var wsUrl = "http://www.deeptraining.com/webservices/weather.asmx?op=GetWeather";

            var soapRequest ='<?xml version="1.0" encoding="utf-8"?> \
                                <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" \
                                    xmlns:xsd="http://www.w3.org/2001/XMLSchema" \
                                    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> \
                                  <soap:Body> \
                                    <GetWeather xmlns="http://litwinconsulting.com/webservices/"> \
                                      <City>new york</City> \
                                    </GetWeather> \
                                  </soap:Body> \
                                </soap:Envelope>';

            $.ajax({
                type: "POST",
                url: wsUrl,
                contentType: "text/xml",
                dataType: "xml",
                data: soapRequest,
                success: processSuccess,
                error: processError
            });

        });
    });
    function processSuccess(data, status, req) {
        if (status == "success")
            alert('SUCCESS');
    }

    function processError(data, status, req) {
        alert(req.responseText + " " + status);
    }
    </script>
    </head>
    <body>
        <h3>
            Calling Web Services with jQuery/AJAX
        </h3>
        <input id="btnCallWebService" value="Call web service" type="button" />
        <div id="response" />
    </body>
</html>
4

1 に答える 1

1

(以下の回答では、この HTML ファイルをhttp://www.deeptraining.com/にデプロイしていないように思われます。)

あなたのコードは、通常の POST ではなく、実際に CORS リクエストを作成しようとしています。

最新のブラウザーでは、ソース HTML ページと同じドメイン内のページへの Ajax 呼び出しのみが許可されます。

つまり、Ajax リクエストを作成しようとする HTML ページがターゲット URL (この場合はwww.deeptraining.com) と同じドメインにない場合、ブラウザーは (ご想像のとおり) 呼び出しを行いません。代わりに、CORS リクエストを作成しようとします。

CORSリクエスト?!@#$¨& あれ?

ウィキペディアの説明: Cross-Origin Resource Sharing (CORS)は、Web ページをXMLHttpRequests別のドメインに作成できるようにするメカニズムです。このような「クロスドメイン」リクエストは、同一オリジン セキュリティ ポリシーにより、Web ブラウザによって禁止されます。

簡単に言うと、CORS リクエストを実行するには、ブラウザで次のことを行います。

  • 最初にOPTIONターゲット URL にリクエストを送信します

  • そして、それに対するサーバーの応答に、CORS 要求を許可する適切なヘッダーが含まれている場合にのみ、ブラウズが呼び出しを実行します (HTML ページが同じドメインにある場合とほぼ同じ方法で)。OPTION

    • 期待されるヘッダーが来ない場合、ブラウザーは単純にあきらめます (あなたがそうしたように)。

それを解決する方法は?

残念ながら、その HTML ファイルをhttp://www.deeptraining.com/にあるサーバーにデプロイする以外にできることはありません。

JSONPはどうですか?

このシナリオで JSONP を使用するには、JSONP を使用して POST できないため、GET を介して情報を返すようにサービスを変更する必要があります。(この回答はいくつかのハックを指していますが、それは行き過ぎだと思います。)

ああ、回避策はありませんか?

本当に、明確な回避策はありません。すべての TCP/IP リクエストをhttp://www.deeptraining.com/に転送するアプリケーションを (HTML ファイルの同じドメインで) セットアップして、ブラウザーを欺くことができます。または、ドメイン内にその Web サービスのミラーをセットアップすることもできます。ほら、この時点からすべてが汚くなりすぎるので、頑張ってください。

于 2013-04-15T03:42:27.317 に答える