2012-07-12 46 views
1
"fnServerData": function(sUrl, aoData, fnCallback, oSettings) { 
      oSettings.jqXHR = $.ajax({ 
       "url": sUrl, 
       "data": aoData, 
       "success": fnCallback, 
       "error":function(msg){ 
        alert(msg); 
       }, 
       "dataType": "jsonp", 
       "cache": false 
      }); 
     }, 

當我提出這個請求時,服務器給出了這個響應。爲什麼jQuery ajax jsonp請求給出錯誤?

Status Code: 200 OK 
Cache-Control: max-age=0 
Content-Language: en 
Content-Type: application/javascript 
Expires: Thu, 12 Jul 2012 06:23:18 GMT 
Last-Modified: Thu, 12 Jul 2012 06:23:18 GMT 
Vary: Accept-Language, Cookie 

還有一個json數據在Response body中。

但ajax代碼說它有一個錯誤,並進入「錯誤」代碼塊。

爲什麼在狀態爲200時發生錯誤?

UPDATE:

在Django的服務器代碼:

  response_dict = {}     
      response_dict.update({'aaData': aaData}) 
      response_dict.update({'sEcho': sEcho, 'iTotalRecords': iTotalRecords, 'iTotalDisplayRecords':iTotalDisplayRecords, 'sColumns':sColumns}) 
      response = HttpResponse(simplejson.dumps(response_dict), mimetype='application/javascript') 
+0

你能展示sUrl的真正價值嗎? – 2012-07-12 07:00:15

+0

/category/list/is sUrl。 – Burak 2012-07-12 07:08:47

+0

@Burak,我已更新我的答案,檢查它是否適用於您 – 2012-07-13 05:13:34

回答

3

服務器是否響應包含JSON與填充?

你看,有兩種方法可以接收來自不同領域的數據:

  1. CORS是新的,但需要一個單獨的Access-Control-Allow-Origin頭從服務器發送。瀏覽器的支持也有所限制。

  2. JSONP不依賴於服務器頭,而是要求其與所謂的「填充」發回JSON數據:

    callback('{"your": ["json", "data"}') 
    

    你的JavaScript庫(jQuery的在這種情況下)是然後將其封裝到新的script標籤中,以欺騙您的瀏覽器進行評估。在callback函數內部,jQuery解析JSON數據並將其發送到您的fnCallback。之後,它將從頁面中刪除不必要的script標籤。總的來說,這是一個非常脆弱的解決方案,但它在實踐中起作用。例如,如果服務器不墊JSON數據,你會用script標記中下面的代碼結束:

    '{"your": ["json", "data"}' 
    

    請注意,這只是一個字符串,什麼都不做。所以,檢查服務器是否發送包裝的JSON而不是原始的JSON。我之前遇到過相同的問題,並且幫助了我。


編輯:既然你發佈你的服務器端的代碼,我認爲你可以修改它。我從來沒有使用Django播放,但我會盡力給你提示:

  1. 您收到應該有一個叫callback參數request內部 - 這就是jQuery的發送給你,你應該使用什麼填充。把它放在什麼地方:

    # Like I said I don't know the exact API but you get the idea 
    callback = request.GET["callback"] 
    
  2. 您的響應後把它發送到客戶端之前:

    response = HttpResponse(# Put callback name before the actual JSON 
           callback + "(" + simplejson.dumps(response_dict) + ");", 
           mimetype='application/javascript') 
    

這應該工作。

+0

Last-Modified:Thu,12 Jul 2012 07:30:54 GMT 過期時間:2012年7月12日星期四07:30:54 GMT Content-類型:application/javascript Cache-Control:max-age = 0 {「sColumns」:「id,name,description,image_path,sort_order,parent,」iTotalRecords「:12,」aaData「:...是來自服務器的響應。 – Burak 2012-07-12 07:32:44

+0

嗯,你看這裏:'... {「sColumns」:...'_no-padding_在服務器響應數據之前:(如果它是你的服務器,那麼你應該修改服務器端代碼來支持填充,如果它不是你的,試試CORS,或者要求他們添加JSONP支持,或者使用一些服務器端的查詢解決方案[見我的回答關於後面](http://stackoverflow.com/questions/10580765#10581382)。 – 2012-07-12 07:48:06