1. 程式人生 > >[JS]JSONP跨域訪問百度地圖雲端儲存API

[JS]JSONP跨域訪問百度地圖雲端儲存API

最近在寫一個基於百度地圖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不觸及服務端程式碼時,這個方法十分有用。

參考:

JSONP 跨域訪問代理API-yahooapis實現程式碼_jquery