2014-10-03 199 views
1

我無法獲得此請求,無法執行除失敗之外的任何操作。我使用curl和web開發者工具欄來檢查創建的URL,WD總是說響應可以正確地返回爲200.我嘗試將內容類型改爲文本,八位字節流和註釋。我也採用了JSON響應並使用JSONLint對其進行了驗證。Jquery .ajax獲取請求始終失敗

我正在使用的代碼是這樣的;

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html;charset=utf-8"> 
    <link rel="stylesheet" type="text/css" href="css/testing.css"> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" ></script> 
    <script type="text/javascript"> 
    $(function(){ 
     $("body").append("<p>Testing.....</p>"); 
     var test= {latitude:"37.0205",longitude:"-7.969141667",startDate:"09-01-2014",endDate:"09-02-2014"}; 
     var url="<hidden>"; 

     $.ajax({ 
      url : url, 
      type: "GET", 
      data : test, 
      dataType:"json", 
      contentType:"application/json", 
      success: function(data,status) 
      { 
       $("body").append("<p>Success"+JSON.stringify(data)+"</p>"); 
       $("body").append("<p>Success"+status+"</p>"); 
      }, 
      error: function (jqXhr,textStatus,errorThrown) 
      { 
       $("body").append("<p>Failure " + JSON.stringify(jqXhr)+"----- "+ textStatus+ "----- "+ errorThrown+"</p>"); 
      } 
     }); 
     $("body").append("<p>input"+JSON.stringify(test)+"</p>"); 
    }); 
    </script> 
</head> 
<body> 
    <h1>Weather test</h1> 

</body> 
</html> 

從錯誤中功能網頁瀏覽器的輸出是 「失敗{」 readyState的 「0」,responseText的 「:」」, 「狀態」:0, 「狀態文本」: 「錯誤」} - ---錯誤-----「

頭的形式爲,

HTTP/1.1 200 OK的Cache-Control:私人,最大年齡= 0服務器: 微軟IIS/7.5 X-ASPNET-版本:4.0.30319 X供電,通過:ASP.NET 日期:星期五,2014年10月3日11時57分47秒GMT的Content-Length:25328

並且使用curl -ivs -raw將URL採集到所有合適的get參數。在這之後直接跟隨有效的JSON。我擔心沒有內容類型可能會引發這種情況。

我知道有很多像這樣的其他問題,但我想先通過他們和應用經驗教訓。如果您有任何其他建議,我將非常感激。

感謝,

+0

什麼'url'的值?特別是,它是用於不同的來源(例如,不同的域),您正在運行該腳本的頁面? – apsillers 2014-10-03 13:16:25

+0

剛剛嘗試過,沒有改變,但謝謝。 – James 2014-10-03 13:16:32

+0

@實際上'數據:測試''將使用'$ .param'將'test'對象轉換爲URL參數。這是正常的行爲。 – Regent 2014-10-03 13:16:33

回答

7

正如你寫,I'm running the web-page on a server on my home machine and the url is for a different, external server not under my control.

這通常意味着Same origin policy規則在這裏工作。

它不允許你發送cross-domain ajax request那麼容易。

如果您確實需要發送跨域ajax請求,請查看JSONPCORS

+1

除此之外,您可以使用firefox中的螢火蟲檢查跨域通知。它顯示提示如何使用跨域ajax /請求 – 2014-10-13 19:27:31

+0

要解決問題,如果原因是@BogdanBurim建議的,您應該將http頭部Access-Control-Allow-Origin與值*添加到url操作的響應中。 – 2014-10-14 07:00:49

1

如果您能夠使用curl檢索url,但是您的ajax調用在您的瀏覽器中返回錯誤,這意味着url不支持CORS(Cross-origin resource sharing)並返回一個沒有Allow-Control-Allow-Origin權限的響應頭爲您的域名。

的URL是不是你的控制下的不同,外部服務器,您不能啓用允許控制允許-Origin標,因此你不能正常在客戶機/解決這個問題的JavaScript水平。

然而,解決方法很簡單,如果你可以在服務器上創建一個PHP腳本,使用捲曲檢索外部URL,並修改你的Ajax調用一個PHP腳本來代替。通過這種方式,你的ajax調用一個本地url,並且沒有更多的跨域問題。

您可以創建的PHP腳本,並將它命名爲 'local.php',用你的網址替換 'your_external_url':

<?php 
$url = 'your_external_url'; 
$ch = curl_init($url.'?'.$_SERVER['QUERY_STRING']); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec($ch); 
echo $result; 
?> 

並修改您的AJAX網址爲 'local.php':

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html;charset=utf-8"> 
    <link rel="stylesheet" type="text/css" href="css/testing.css"> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" ></script> 
    <script type="text/javascript"> 
    $(function(){ 
     $("body").append("<p>Testing.....</p>"); 
     var test= {latitude:"37.0205",longitude:"-7.969141667",startDate:"09-01-2014",endDate:"09-02-2014"}; 
     var url="local.php"; 

     $.ajax({ 
      url : url, 
      type: "GET", 
      data : test, 
      dataType:"json", 
      contentType:"application/json", 
      success: function(data,status) 
      { 
       $("body").append("<p>Success"+JSON.stringify(data)+"</p>"); 
       $("body").append("<p>Success"+status+"</p>"); 
      }, 
      error: function (jqXhr,textStatus,errorThrown) 
      { 
       $("body").append("<p>Failure " + JSON.stringify(jqXhr)+"----- "+ textStatus+ "----- "+ errorThrown+"</p>"); 
      } 
     }); 
     $("body").append("<p>input"+JSON.stringify(test)+"</p>"); 
    }); 
    </script> 
</head> 
<body> 
    <h1>Weather test</h1> 

</body> 
</html>