2015-11-29 40 views
0

我試圖從hashtag獲取推文。我得到以下錯誤Cross-Origin Request Blocked:同源策略不允許在https://api.twitter.com/oauth2/token處讀取遠程資源。 (原因:缺少CORS頭'Access-Control-Allow-Origin')。 跨域請求被阻止:相同來源策略不允許在https://api.twitter.com/1.1/search/tweets.json?f=tweets&q=%23shruthirajoli&src=typd?get=%5Bobject+Object%5D處讀取遠程資源。 (原因:CORS頭「訪問控制允許來源」失蹤)Twitter API獲取推文 - 返回CORS來源被阻止

下面是我的代碼: app.js

var app = angular.module('Twitter', ['ngResource']); 

app.controller('TwitterCtrl', function($scope,$http,$resource){ 
// Create Base64 Object 
    var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/=", 
    encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t}, 
    decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}} 

    var consumerKey = encodeURIComponent(''); 
    var consumerSecret = encodeURIComponent(''); 
    var credentials = Base64.encode(consumerKey + ':' + consumerSecret); 
    // Twitters OAuth service endpoint 
    var twitterOauthEndpoint = $http.post('https://api.twitter.com/oauth2/token', "grant_type=client_credentials" 
    , {headers: {'Authorization': 'Basic ' + credentials, 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'}}); 
    twitterOauthEndpoint.success(function (response) { 
       // a successful response will return 
       // the "bearer" token which is registered 
       // to the $httpProvider 
       console.log(twitterOauthEndpoint); 
    app.$httpProvider.defaults.headers.common['Authorization'] = "Bearer " + response.access_token}) 
    .error(function (response) { 
        // error handling to some meaningful extent 
       }); 
    $scope.twitter = $resource('https://api.twitter.com/1.1/search/tweets.json?f=tweets&q=%23shruthirajoli&src=typd', 
     // {action: 'search.json', q:'angularjs', callback:'JSON_CALLBACK'}, 
     {get:{method:'JSONP'}}); 

    $scope.twitterResult = $scope.twitter.get(); 
}); 


app.config(function ($httpProvider) { 
    app.$httpProvider = $httpProvider 
}); 

html 
<!doctype html> 
<html ng-app="Twitter"> 
<head> 
    <script src="http://code.angularjs.org/angular-1.0.0rc4.min.js"></script> 
    <script src="http://code.angularjs.org/angular-resource-1.0.0rc4.min.js"></script> 
    <script src="app.js"></script> 
    <link rel="stylesheet" href="http://twitter.github.com/bootstrap/1.4.0/bootstrap.min.css"> 

</head> 
<body> 
<div ng-controller="TwitterCtrl"> 
    <table class="table table-striped"> 
     <tr ng-repeat="tweet in twitterResult.results"> 
      <td>{{tweet.text}}</td> 
     </tr> 
    </table> 
</div> 
</body> 
</html> 

我在本地主機上運行此:8000,我跟着歇後語的說明解決這個問題。如果我犯了什麼錯誤,有人能讓我知道嗎?謝謝。

+0

您需要查看PRE-FLIGHT請求和響應中的標題。我懷疑他們缺少access-control-allow-headers標頭。當您設置和/或讀取非標準標題值時,需要使用該特定標題。這是服務器告訴瀏覽器讓跨域頁面看到自定義標題的方式。 – allenru

+0

當心CORS的本地主機測試:http://stackoverflow.com/questions/10883211/deadly-cors-when-http-localhost-is-the-origin – allenru

+0

如果/當你解決本地主機問題,張貼的頭請求和響應(如果使用Chrome,請在開發人員工具網絡選項卡中提供)。然後我們可以進一步調試。 – allenru

回答

2

你得到這個錯誤的原因是你通過瀏覽器發出請求。瀏覽器不允許跨域請求,因爲像下面評論中提到的@allenru:服務器需要根據CORS規範進行響應,以便瀏覽器可以繼續處理請求。

您可以瞭解更多有關在這裏: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

獲取鳴叫將作出對服務器的呼叫和服務器給你取的鳴叫的正確方法。

這也看起來像一個越野車呼叫。
https://api.twitter.com/1.1/search/tweets.json?f=tweets&q=%23shruthirajoli&src=typd?get=%5Bobject+Object%5D。 請求中有[object + object]這是不正常的。它看起來像一個沒有被串化的對象。

+0

這是不正確的。瀏覽器強制實施CORS協議,並允許跨域請求。 – allenru

+0

@allenru如果用戶禁用瀏覽器的安全性,瀏覽器將會提出CORS請求,但我不認爲他在問如何覆蓋瀏覽器安全。 – mbejda

+2

瀏覽器執行您鏈接的CORS規範。在這種情況下,他正在設置一個自定義標題(授權),它將觸發預先請求(HTTP OPTIONS請求)。如果服務器沒有按照CORS規範進行響應,瀏覽器將不會繼續處理主要請求。這是瀏覽器的默認行爲。沒有安全覆蓋是必要的。 – allenru