2016-11-27 68 views
10

我在API網關的問題上停滯不前,並且我已經通過了所有其他關於此問題的答案,AWS論壇並已通過其文件,但仍然沒有喜悅。AWS API網關否存在'Access-Control-Allow-Origin'標頭

我正在嘗試使用AWS API網關設置API,該API調用一個讀/寫DynamoDB中的表的Lambda函數。

DynamoDB的Lambda函數正在工作。我在AWS中創建了一個API,併爲它創建了一個GET和OPTIONS方法。我讀AWS不強制只有GET/POST的OPTIONS,但當我沒有OPTIONS方法時,我在ajax調用中出現預檢錯誤,所以我添加了一個。

現在只是爲了取得進展,我沒有使用API​​密鑰或授權。 我可以使用POSTMAN成功調用GET方法,該方法返回DynamoDB表的內容。

但是當我嘗試使用jQuery的Ajax調用我得到

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 

我可以看到使用網絡選項卡下的Chrome瀏覽器開發工具,OPTIONS方法返回狀態200和GET返回狀態200,但與上述錯誤。

我已經嘗試在OPTIONS和GET方法上啓用CORS,在每次更改後都重新部署了API,嘗試了以下操作(http://enable-cors.org/server_awsapigateway.html),但始終在控制檯中獲取相同的錯誤。

我正在執行我的桌面上的文件的ajax調用,所以原點爲空,因爲頁面將部署到S3作爲它在JS中的單個網頁應用程序。

當我啓用CORS在我的GET和選項我可以看到,訪問控制,允許報頭是'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'和訪問控制允許來源*是'*'

我的Ajax調用看起來像下面。我也試着拷貝正確的頭郵差使用,它具有授權報頭組(這是我在AWS關閉現在),但我總是得到上述

var awsHeaders = {}; 
awsHeaders['X-Amz-Date'] = '20161127T171734'; 

$('#add, #cloud').click(function() { 

    $.ajax({ 

     type: 'GET', 
     headers: awsHeaders, 
     dataType : "json", 
     url: '...', 
     success: function (res) { 

      console.log('response in GET:'); 
      console.log(res); 

     }, 
     error: function(data) { 
      console.log('in error'); 
      console.log(data); 
     } 

    }); 

}); 

任何人都可以擺脫對我可能輕了同樣的錯誤失蹤?

非常感謝

更新下面關於我是如何解決這個按照DigitalKapteain評論 見答案 - 通過設置「訪問控制允許來源」:從我的LAMBDA響應「*」頭功能。我在AWS文檔中查找了這個,但是找不到它。此鏈接描述了Lambda和Lambda代理之間的區別,並解釋了使用CORS時要執行的操作。https://serverless.com/framework/docs/providers/aws/events/apigateway/

+0

它可能是你不缺少什麼,它可能是一個ISP緩存的問題,嘗試不同的網絡連接和新鮮的瀏覽器,如果沒有,那麼CORS可能是問題 – Waheedi

+0

感謝。我不認爲它是一個ISP問題,因爲我在不同的網絡連接(咖啡館,酒店等)上嘗試過這個問題。也清除了緩存等,並嘗試了不同的瀏覽器 – user12345

+0

然後它的CORS @ user12345我認爲你已經看過這個文檔,但是試着再次檢查你是否再次執行了這些步驟,http://docs.aws.amazon.com/apigateway/latest /developerguide/how-to-cors.html – Waheedi

回答

22

GET請求對Lambda函數的響應還必須包含Access-Control-Allow-Origin標頭。

+0

謝謝@Digitalkapitaen。查看從OPTIONS請求返回的響應頭,它包含訪問控制 - 允許 - 方法:GET,OPTIONS和Access-Control-Allow-Origin:*,但我沒有看到Access-Control-Allow-Origin響應頭GET請求。我已經將它設置在API網關的GET方法方法響應中,並重新部署了API,但是我沒有看到它返回。任何想法,這需要設置?非常感謝 – user12345

+2

@ user12345您是使用Lambda代理集成還是在API網關中手動配置lambda調用?如果您使用代理集成,則可以在Lambda函數代碼中設置標題。 – Digitalkapitaen

+3

我正在使用Lambda Proxy集成。所以我改變了Lambda函數以返回頭部'Access-Control-Allow-Origin':'*',並且訪問控制錯誤消失了。非常感謝您的幫助。因此,在使用代理集成時,頭文件是由Lambda函數設置的,而不是API網關中的方法響應文件? – user12345

6

Digitalkapitaen的回答是正確的;這裏是代碼,以節省別人的仰視how to set an HTTP response header in Lambda的麻煩:

exports.handler = function(event, context, callback) { 
    callback(null, { 
     "statusCode": 200, 
     "headers": { 
      "Access-Control-Allow-Origin": "*" 
     } 
    }); 
}; 
2

如果這仍然沒有工作給你,一定要JSON.stringify()如果​​你正在使用$阿賈克斯你的JSON對象。如果不是,您仍然會返回一個錯誤,聲稱是與CORS相關的錯誤。但是,如果使用Postman發送相同的json對象,請求將會成功。試試吧......

+0

這個。我看到狀態碼415,因爲我發佈的是表單數據而不是JSON。雖然它在控制檯中看起來像一個與CORS相關的問題,但問題在於此。 –