2014-02-13 62 views
0

我想執行下列AJAX調用(跨域):跨域AJAX調用來獲取JSON響應錯誤失敗,JSON格式正確

$.ajax({ 
     type: 'GET', 
     url: url + "?callback=?", 
     contentType: 'application/json', 
     async: false, 
     jsonp: "callback", 
     dataType: 'jsonp',   
     success: function (json) { 
      alert("ok" + JSON.stringify(json)); 
     }, 
     error: function (json) { 
      alert("err" + JSON.stringify(json)); 
     } 
    }); 

而且我得到這個警報消息:

這意味着代碼以錯誤方法結束。

如果我在Firefox或Chrome中檢查請求,則響應的JSON部分可用且格式明確。 是否有可能在錯誤方法中獲得JSON響應?或者你有什麼想法,爲什麼成功的方法沒有命中?

不幸的是,這不是我的服務器,所以我無法在服務器端實現任何更改。我使用http://jsonlint.com/來驗證JSON輸出,它是有效的。在瀏覽器中輸入相同的URL會正確返回JSON內容。

感謝很多提前, 我嘗試了幾種不同的方法,但仍然失敗上的錯誤方法,

[編輯]

所以,我用不同的方法打,始終得到同樣的錯誤。如果我將調用的錯誤部分改成這樣:

error: function (jqXHR, textStatus, ex) { 
      console.log(arguments); 
      alert(textStatus + "," + ex + "," + jqXHR.responseText); 
     } 

然後我收到以下錯誤:

http://i.stack.imgur.com/ck6Sd.png

錯誤的複製粘貼的搜索引擎:

0: Object 1: "parsererror" 2: Error message: "jQuery11020553141210693866_1392367304225 was not called" stack: (...) get stack: function() { [native code] } set stack: function() { [native code] } proto: d callee: function (jqXHR, textStatus, ex) { length: 3 proto: Object

同樣的東西適用於上面,響應在瀏覽器中是可讀的,沒有問題。

EDIT2

我最後做的JSON調用舊的方式,將其嵌入到頁面:

script = document.createElement("script"); 
    script.type = "text/javascript"; 
    script.id = "resultJSON"; 
    script.src = url; 

    $(".resultsOutput").append(script); 

但我有麻煩檢索數據,腳本標籤似乎是空的。

未捕獲的SyntaxError:我的JSON得到一個錯誤的意外標記:

任何人能幫助我們嗎?我開始對這個問題感到絕望。看來問題在於JASON沒有使用方法封裝來返回。

[最後編輯]

所以,原來的服務器不支持CORS和返回的JSON不裹在一個JS的功能,所以這種做法是行不通的。我將不得不使用其他方法來檢索數據..感謝大家閱讀

安迪

回答

1

是否有什麼特別的原因:

  • 覆蓋隨機回調名jQuery的原因呢?
  • 將數據類型設置爲application/json?

第二個可能會導致錯誤。如果我是正確的,服務器會返回application/javascript mime-type,因爲它應該返回你正在查找的JSON包裝到一個回調函數中,一旦請求完成後就會調用它。事情是這樣的:

function callback() { 
    return {"a","b"} //the JSON you are looking for 
} 

這一切是通過創建一個標籤「腳本」,以避免跨域瀏覽器限制,所以您不能直接處理JSON內部處理的,它需要被包裝成JavaScript代碼。因此,contentType可能是錯誤的。

嘗試刪除ajax選項上的contenType屬性,並查看jQuery如何運行(它應該從服務器的響應頭中解釋內容類型)。

+0

看起來我倒過來了。服務器不會返回封裝到函數中的響應,而是調用函數本身,並且jQuery將在響應到達時調用瀏覽器內存中的函數。看到這個線程:http://stackoverflow.com/questions/3506208/jquery-ajax-cross-domain?rq=1 –

+0

我試過你的第一個建議,刪除contentType屬性,但代碼行爲相同。對於你的其他問題,我只是嘗試了不同的方法,現在,這是我得到的最遠(否則由於我的問題的跨域部分,我得到了各種錯誤)。我會檢查你建議的線索,並讓你知道它是否有幫助。非常感謝你的時間,非常感謝。 – user3307231

+0

我檢查了提到的鏈接,但是我找不到任何能幫助我的東西。自從嘗試了其他方法後,我看到了更新後的問題。 – user3307231