无法使用JQuery调用Web服务

时间:2013-04-14 17:52:32

标签: jquery web-services cors

我在从JQuery调用Web服务时遇到了麻烦。

我正在访问的网址是: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]

     

警告:未定义的parsererror

如果获取代码 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>

1 个答案:

答案 0 :(得分:1)

(下面的答案假设,您似乎没有在http://www.deeptraining.com/中部署此HTML文件。)

您的代码实际上是在尝试发出CORS请求,而不是普通的POST。

现代浏览器只允许Ajax调用同一域中的页面作为源HTML页面。

换句话说,每当尝试发出Ajax请求的HTML页面与目标URL(在您的情况下为www.deeptraining.com)不在同一个域中时,浏览器就不会进行调用(如你期待的)。相反,它会尝试发出CORS请求。

CORS请求? !@#$¨&安培;那是吗?

Wikipedia says跨域资源共享(CORS)是一种允许网页将XMLHttpRequests发送到另一个域的机制。由于 same origin security policy ,网络浏览器会禁止此类“跨域”请求。

简而言之,要执行CORS请求,请使用浏览器:

  • 首先会向目标网址发送OPTION个请求

  • 然后仅当服务器对该OPTION的响应包含允许CORS请求的adequate headers时,浏览才会执行调用(几乎完全是如果HTML页面位于同一个域,那就会这样。)

    • 如果没有预期的标题,浏览器就会放弃(就像它对你做的那样)。

如何解决?

不幸的是,除了在位于http://www.deeptraining.com/的服务器中部署该HTML文件之外,您无能为力。

JSONP怎么样?

要在此方案中使用JSONP,您必须更改服务以通过GET返回信息,因为您无法使用JSONP进行POST。 (This answer指向一些黑客,但我认为这太过分了。)

哦,伙计,没有解决方法呢?

确实没有干净的解决方法。您可以设置一个应用程序(在HTML文件的同一个域中)将每个TCP / IP请求转发到http://www.deeptraining.com/,然后愚弄您的浏览器。或者,您可以在您的域中设置该Web服务的镜像。你知道,从现在开始这一切都变得太脏了,祝你好运。