今天早上幫助同學看了一個AngularJS的問題,主要是請求中出現了跨域訪問,請求被阻止。
下面是她給我的代碼:
<html lang="en" ng-app="myApp"> <head> <meta charset="UTF-8"> <title>Title</title> <!--<script src="../js/jquery-1.11.0.js"></script>--> <script src="angular.min.js"></script> <script> angular.module("myApp",[]).controller("test",["$scope","$http",function($scope,$http){ $http.get("http://datainfo.duapp.com/shopdata/getGoods.php?classID=1") .success(function(response){ $scope.myarr = response.sites; }) }]) </script> </head> <body> <div ng-controller="test"> <ul> <li ng-repeat="data in myarr"> <img src="{{data.goodsListImg}}"/> <p>名稱:<span>{{data.goodsName}}</span></p> <p>價格:<span>{{data.price|currency:"¥"}}</span></p> </li> </ul> </div> </body> </html>
我們可以看到他是通過$http的get方式訪問URL,一直訪問不了,我將具體的response打印到控制台上面,也使出現了問題。
這個是浏覽器的跨域造成的,之前的學習中我也不是很清楚這個,只是知道由於不是在同一個域名下面訪問的此域名下的資源就會造成跨域。其實之前看到這個是以為請求的格式有問題,返回的json數據到不了。
下面是json格式返回的數據。
按照她給我的URL,我發現在json數據前面有一個callback,這個是php中的回調函數,結果網上一搜發現get請求對於這種回調函數是沒有作用的。
必須使用下面的這種辦法來處理這種有callback的jsonp格式的數據。
<script> var myApp = angular.module("App", []); myApp.controller("test", function($scope, $http) { // 回調函數用法 myUrl = "http://datainfo.duapp.com/shopdata/getGoods.php?callback=JSON_CALLBACK"; $http.jsonp(myUrl).success(function(response) { console.log(response); }); }); </script>
注意兩點:
這樣就可以正常的訪問數據。其實對於json個格式的數據我們要是想知道那裡有錯誤,有一種辦法是將其打印到浏覽器的控制台中,這樣我們就可以看到具體的流程和結果。
<!DOCTYPE html> <html ng-app="App"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="angular.min.js"></script> <script> var myApp = angular.module("App", []); myApp.controller("test", function($scope, $http) { // 回調函數用法 myUrl = "http://datainfo.duapp.com/shopdata/getGoods.php?callback=JSON_CALLBACK"; $http.jsonp(myUrl).success(function(response) { console.log(response); $scope.myarr = response; }); }); </script> </head> <body> <div ng-controller="test"> <ul> <li ng-repeat="data in myarr"> <!--scr裡面的angularJS不可以這樣寫--> <img src="{{data.goodsListImg}}" /> <p>名稱:<span>{{data.goodsName}}</span></p> <p>價格:<span>{{data.price|currency:"¥"}}</span></p> </li> </ul> </div> </body>
自動將我們的JSON_CALLBACK替換成了下面的字符,這應該是AngularJS替換的。
跨域是如何解決的:
通過json來傳遞數據,靠jsonp來跨域,json是一種數據交換格式,而jsonp是一種靠開發人員的聰明才智創造的一種非官方跨域數據交互協議;
JSONP是如何產生的:
AngularJS中處理jsonp數據
浏覽器是存在同源策略的,在全局層面禁止了頁面加載或執行與自身來源不同的域的任何腳本;JSONP是一種可以繞過浏覽器的安全限制,從不同的域請求數據的方法;
這個解釋足以理解跨域問題和為什麼需要使用JSONP?
上善若水:http://www.cnblogs.com/dengzy/p/5388357.html
BestMe:http://www.cnblogs.com/BestMePeng/p/AngularJS_JSON.html
segmentfault:https://segmentfault.com/q/1010000002407111