2013-07-03 72 views
0

遠程URL http://remote-server/json-data.php包含此格式的數據:爲什麼我的跨域JSON調用不起作用?

[{"id":"1","partname":"R1","date":"10/12/2012"},{"id":"2","partname":"R2","date":"10/10/2012"},{"id":"3","partname":"R3","date":"07/12/2012"},{"id":"4","partname":"R4","date":"14/06/2012"}] 

這是我的jQuery是應該讀出上述數據,並在HTML或PHP文件中顯示它。這是目前沒有工作:

$(document).ready(function() { 
var url = "http://remote-server/json-data.php"; 

var success = function(data){ 
    data = $.parseJSON(data); 
    $.each(data, function(index, element) { 
     $('div.outerBox').append('<div>'+element.partname+'/'+element.date+'</div>'); 
    }); 
} 


$.ajax({ 
    type: 'GET', 
    url: url, 
    dataType: "jsonp", 
    crossDomain: true,   
    cache:false, 
    success: success, 
    error:function(jqXHR, textStatus, errorThrown){ 
     alert(errorThrown); 
    } 
}); 
}); 

當我刷新頁面,我得到的JavaScript警告框的錯誤信息,像這樣:Error: jQuery142452552225_55355545554 was not called

我試圖把這個遠程文件放到我的本地服務器,它似乎與$.getJSON()功能正常工作。不知道我在這裏做錯了什麼。

+0

@ Mahesh.D那麼我該如何解決這個問題?我改爲'dataType:「json」'但仍然無法工作。 – user1448031

+0

問題是http://這是不正確的。不能是外部網址。 –

回答

2

如果服務器不準備處理JSONP請求,它將不起作用。

JSONP是不嚴格的數據的客戶端側的操作,它涉及服務器交互

當使用JSONP應封閉在javascript函數的響應。

所以爲了使事情變得簡單,比如說你有一個空的JSON對象,服務器將返回給你。即{}

爲了使該對象的標準要求,你會怎麼做

$.ajax({ 
    type: 'GET', 
    url: url, 
    dataType: "json", 
    success: function(data) { 
     alert("Retrieved : " + JSON.stringify(data); 
    }, 
    error:function(jq, st, error){ 
     alert(error); 
    } 
}); 

所有這一切確實是做一個標準的HTTP請求和相應網址獲取空的對象。

如果你想使用JSONP具有相同的URL,你嘗試像

$.ajax({ 
    type: 'GET', 
    url: url, 
    dataType: "jsonp", 
    crossDomain: true, 
    success: function(data) { 
     alert("Retrieved : " + JSON.stringify(data); 
    }, 
    error:function(jq, st, error){ 
     alert(error); 
    } 
}); 

這樣做是需要你有一個追加?callback={Some Random jQuery function}的URL。在你的情況下,隨機jQuery函數是jQuery142452552225_55355545554。服務器必須把這個空的JSON對象包裝在回調中,所以它不應該返回{},而應該返回jQuery142452552225_55355545554({})和application/json的HTTP內容類型頭。

這是一個對coderwall的JSON請求的小提琴,它失敗了,然後嘗試了一個成功工作的JSONP請求。 JSONP Example

+0

你的小提琴是完美的。我嘗試了你的小提琴,並用我的coderwall網址替換,我仍然收到錯誤。那麼這是否意味着我的json腳本託管的服務器有問題?如果是,可能是服務器的問題? – user1448031

+1

您的服務器需要在回調中包裝響應,就像我上面所說的,如果您的服務器只是返回JSON對象,它將不起作用。服務器需要在URL中搜索回調參數,如果存在,它應該將對象包裝在回調函數中。 服務器將需要一些代碼來實現這一點。你不能拿我做的小提琴,只是交換網址。 – Alex

1

遠程URL http://remote-server/json-data.php在 包含數據的格式爲:

[{ 「ID」: 「1」, 「零件名稱」: 「R1」, 「日期」:「2012年10月12日「},{」 ID 「:」 2" , 「零件名稱」: 「R2」, 「日期」: 「2012年10月10日」},{ 「ID」: 「3」, 「零件名稱」: 「R3」, 「date」:「07/12/2012」},{「id」:「4」,「partname」:「R4」,「date」:「14/06/2012」}]

, 那就是問題所在。您的遠程網址正在返回JSON,而不是JSONP。這就是爲什麼你不能使用它。遠程服務器應該返回JSONP:

callbackFunctionName([ 
    { 
     "id": "1", 
     "partname": "R1", 
     "date": "10/12/2012" 
    }, 
    { 
     "id": "2", 
     "partname": "R2", 
     "date": "10/10/2012" 
    }, 
    { 
     "id": "3", 
     "partname": "R3", 
     "date": "07/12/2012" 
    }, 
    { 
     "id": "4", 
     "partname": "R4", 
     "date": "14/06/2012" 
    } 
]); 

其中callbackFunctionName應該通過傳遞一個參數到你的服務器動態指定。像這樣:

http://remote-server/json-data.php?callback=callbackFunctionName 

當你調用這個url時,你應該返回一個JSONP響應。