[JS]JSONP跨域訪問百度地圖雲端儲存API
阿新 • • 發佈:2018-12-04
最近在寫一個基於百度地圖API實現的某旅遊村落電子地圖,在訪問百度地圖雲端儲存平臺上的資料表時出現了跨域問題,一開始我使用ajax獲取script,程式碼如下:
function showDataz(data) { console.log("收到資料"); } //查詢百度lbs雲中的資料表 $.ajax({ url: "http://api.map.baidu.com/geodata/v4/geotable/detail?ak=DTCvvn4nDAo0yFl3HpTw6O4bPSpk1btf&id=1000003116&jsoncallback=?", jsonpCallback:"showDataz", type:"GET", dataType:'script', jsonp:"showDataz",//重寫回調函式名字 cache:true,//快取得到的資料 success:function(data, textStatus, jqxhr) { $.each(data,function(index,content){ }) console.log(data); //data returned console.log(textStatus); //success console.log(jqxhr.status); //200 console.log('Load was performed.'); }, error:function(XMLHttpRequest, textStatus, errorThrown){ console.log("請求失敗,status:"+XMLHttpRequest.status); console.log("readystate:"+XMLHttpRequest.readyState); console.log("responseText:"+XMLHttpRequest.responseText); console.log("錯誤資訊:"+textStatus); } });
觸發了成功請求的函式,但是data是undefined。在除錯面板中也能看到返回的json:
如果把dataType改成jsonp,進入失敗事件,返回如下。然而狀態碼200和4明明意味著請求成功。
最後通過同學的幫助,她找到利用雅虎提供的jsonp代理來解析請求的json,完美解決了問題。
$(function(){ $.getJSON("http://query.yahooapis.com/v1/public/yql", { q: "select * from json where url=\"http://api.map.baidu.com/geodata/v4/geotable/detail?ak=DTCvvn4nDAo0yFl3HpTw6O4bPSpk1btf&id=1000003116\"", format: "json" }, function(data) { console.log(data); console.log(data['query']['results']['json']['geotable']['name']); }); });
十分感謝這個同學,也希望這篇部落格能幫助到大家。在訪問公網API不觸及服務端程式碼時,這個方法十分有用。
參考: