0

我想用chrome dev console來調試我的角度應用程序。我想從角度向本地服務器發送一個get請求。我已經試過如下:如何使這個Angular http獲取請求(與基本認證)工作?

$http = angular.element($0).injector().get('$http'); 
$base64 = angular.element($0).injector().get('$base64'); 

var auth = $base64.encode("user:passwd"); 
var authHeaders = {"Authorization": "Basic " + auth,"Access-Control-Allow-Origin":"*"}; 

$http.get("url",{headers:authHeaders,method:"GET"}) 

閱讀這個答案後: https://stackoverflow.com/a/30296149/1496826

我想自定義標題是問題。所以,我試圖把授權頭在身:

$http.get("url",{data: {"Authorization": "Basic " + auth,"Access-Control-Allow-Origin":"*"},method:"GET"}) 

但我仍然得到同樣的錯誤:

XMLHttpRequest cannot load "url". No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 401.

此相同的GET請求工作正常,從郵差:

var settings = { 
    "async": true, 
    "crossDomain": true, 
    "url": "url", 
    "method": "GET", 
    "headers": { 
    "authorization": "Basic bWdhcasdasd", 
    "cache-control": "no-cache", 
    "postman-token": "XXXXXX-XXXXXX-xXXXX-xXXXX" 
    } 
} 

我已經嘗試了幾個其他的變化像 - $ http default/common header等,但一切都失敗了。請幫忙。

+0

您是否嘗試過無需驗證的簡單請求以查看其是否有效?像:$ http({method:'GET',url:'/ someUrl' })。(函數successCallback(response){0},函數errorCallback(response){}); – ukn

回答

0

這是一個CORS問題。

CORS頭文件必須處理服務器端,我沒有在這裏看到你的服務器端代碼,但爲了讓這個錯誤消失,你必須指定哪個域可以請求資源。

該異常是由攔截服務器響應的瀏覽器檢查頭並且如果找不到Allow-Control-Allow-Origin頭,它將不會將響應轉發到您的代碼(這僅發生在跨源請求)。

這就是爲什麼郵差讓你看到迴應,因爲它不做什麼鉻做的,不作任何檢查。

正如我說的是正確的解決方法是修復你的服務器端代碼,並指定Allow-Control-Allow-Origin header,或者快速而暫時的解決辦法是安裝this插件Chrome瀏覽器將攔截服務器響應,並添加Allow-Control-Allow-Origin*(指域名)這個技巧會愚弄鉻,讓你看到迴應。

+0

我沒有訪問服務器端代碼。這是由別人維護的django應用程序。插件解決方案不可行,因爲我不能要求每個用戶都安裝它。請建議一些替代方案,可以從客戶端執行 – Mohit

+0

不幸的是,沒有解決方案。您必須聯繫服務器端manteiner,並要求他在標題中爲您的域添加通配符。如果您在整個網絡中查找與cors相關的問題,您會發現經常會遇到這個主題,但解決方案是在響應中設置正確的標題,這只是服務器端完成的。 – Karim