2017-01-02 62 views
0

我已經設置了非常簡單的PHP頁面,其中返回從MySQL操作的行。在本地主機上我的jQuery的頁面是如何讀取從JSNOP返回的數據jQuery.ajax全部

$.ajax({ 
     url: "http://abcd.com/cccbsapp/test.php", 

     // Tell jQuery we're expecting JSONP 
     dataType: "jsonp", 

     complete:function(data){ 
      console.log(data) 
     }   
    }) 

但執行console.log顯示

enter image description here

我沒能得到我的PHP頁面返回的實際JSON陣列。但控制檯/網絡選項卡顯示返回的數據。 enter image description here

所以我知道數據從遠程服務器返回,但我怎麼能得到它在$ .ajax。

當我使用dataType:「JSON」時,它給出了CORS錯誤,所以我使用JSNOP。我對此並不是很有經驗。

+0

一點谷歌將採取一個遠 - http://stackoverflow.com/questions/3839966/can-anyone -explain-what-jsonp-in-layman-terms https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS HNY! – tiblu

+0

@Rafael,我已經試過這些鏈接,問題是,當我給dataType:'jsonp'時,成功事件永遠不會被解僱。任何建議。 – raju

回答

1

這裏的問題是,爲了使用JSONP,服務器需要以特殊方式回覆,而不僅僅是以JSON格式打印數據。

當使用jsonp時,jQuery向URL中的callback=someFunctionName發送請求。在這種情況下,服務器的響應應該是

someFunctionName(HERE THE DATA) 

此外,complete回調獲得的第一個參數總是jqXHR對象,而不是返回的數據,因爲complete是jQuery的兩個叫 - 請求成功和錯誤 - 場景。更好地使用success回調獲取數據,error處理錯誤,甚至使用Promise接口(.done().fail()方法)。

$.ajax({ 
    url: "http://abcd.com/cccbsapp/test.php", 
    // Tell jQuery we're expecting JSONP 
    dataType: "jsonp"   
}).done(function (data) { 
    console.log(data); 
}).fail(function() { 
    console.log("An error occured"); 
}); 

作爲使用JSONP的替代方法,您可以堅持正常的JSON請求。爲了使跨域請求起作用,服務器需要在響應中包括Access-Control-Allow-Origin標題,例如,

header('Access-Control-Allow-Origin: *'); 

(而不是被允許查詢該API的*你可以列出域)

+0

我已添加標題('Access-Control-Allow-Origin:*');現在它可以工作。但是我想知道我已經將它添加到.htaccess標頭集Access-Control-Allow-Origin「*」中,但它不起作用。你能幫我理解PHP訪問與.htaccess訪問。 – raju

+0

@raju只是猜測,但如果你的服務器上的PHP運行fastcgi,也許這個問題與此有關:stackoverflow.com/a/38159002/80720 – Rafael