2013-04-14 80 views
0

我無法從JQuery調用Web服務。無法使用JQuery調用Web服務

我正在訪問的網址是:http://www.deeptraining.com/webservices/weather.asmx?WSDL,它有一個名爲GetWeather的操作。 我使用Firefox和我得到以下信息:

火狐控制檯:[19:43:29.849] OPTIONS http://www.deeptraining.com/webservices/weather.asmx?op=GetWeather [HTTP/1.1 200 OK 371ms]

提醒:未定義parsererror

如果獲得代碼,這意味着請求已成功發送? 我在做什麼錯?什麼是提出請求的正確方法? 謝謝!

這裏是我的代碼:

<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> 
+0

你們的這個HTML,你在'HTTP服務器部署? – acdcjunior

回答

1

(請回答以下假設,因爲它似乎,你是不是在http://www.deeptraining.com/部署這個HTML文件)。

您的代碼實際上是試圖使一個CORS請求,而不是普通的POST。

現代瀏覽器將只允許對作爲源HTML頁面的相同域中的頁面進行Ajax調用。

換句話說,每當試圖發出Ajax請求的HTML頁面與目標URL(在您的情況下,www.deeptraining.com)不在同一個域中時,瀏覽器將不會發出呼叫(如您所願期望)。相反,它會嘗試提出CORS請求。

CORS請求? !@#$¨&是嗎?

Wikipedia says跨源資源共享(CORS)是一種機制,允許網頁製作XMLHttpRequests到另一個域。由於same origin security policy,這種「跨域」請求將被網頁瀏覽器禁止。

說得很快,執行CORS請求時,您的瀏覽器:

  • 會首先發一個OPTION請求發送到目標URL

  • 然後只有服務器響應到OPTION包含adequate headers允許CORS請求,瀏覽將執行調用(幾乎完全的方式,它會如果HTML頁面是在相同的域名)。

    • 如果預期的標題沒有出現,瀏覽器就會放棄(就像它對你做的那樣)。

如何解決呢?

不幸的是,除了在位於http://www.deeptraining.com/的服務器上部署該HTML文件外,您無能爲力。

如何JSONP?

要在這種情況下使用JSONP,你必須改變服務通過GET返回信息,因爲你不能發佈使用JSONP。 (This answer指向一些黑客,但我認爲這太過分了。)

哦,男人,沒有解決方法呢?

沒有乾淨的解決辦法,真的。您可以設置每一個TCP/IP請求轉發給http://www.deeptraining.com/,然後一個愚弄你的瀏覽器的應用程序(在您的HTML文件的同一個域)。或者您可以在您的域中設置該Web服務的鏡像。你看,從這一點來看,這一切都變得很骯髒,所以祝你好運。 // www.deeptraining.com /`測試時:

+0

感謝您的回答。我是新的Ajax問題,但如果我理解正確的話,將放在同一臺服務器上更容易的方式我有我的Web服務部署的Ajax調用的HTML。 所以,我可以做從客戶端窗體調用這將被放置在服務器的HMTL然後Ajax調用將在同一個域作爲我的Web服務,正確的? – aartor

+0

是的,正確的!或者...您可以更改Web服務代碼以允許CORS(它只涉及設置一些http頭文件 - 但在REST Web服務中設置它比基於SOAP的服務更容易)。 – acdcjunior

+0

這是怎麼回事? – acdcjunior