2017-12-18 236 views
1

我有一個Api網關端點設置爲HTTP_PROXY,並且它按預期工作 - 只要您不提供Accept-Encoding: gzip標頭即可。然後它失敗了。看來,Api Gateway對響應做了「某些事情」,這使得它在接收端無法解讀。AWS Api代理壓縮「無效塊類型」

這是我所看到的:

  • 直接將請求發送到代理服務器後端按預期工作(例如curl --compressed成功完成)。
  • 通過Api Gateway以curl --compressed(以及其他方式)發送請求會導致「無效塊類型」。
  • 來自代理服務器的響應是17514字節,而通過Api網關,它已被炸至31506字節。這反映在Content-Length標題中。
  • Api網關包括x-amzn-Remapped-Content-Length標題與舊(正確)值,所以它似乎知道它做了東西到響應。

的API方法被配置爲HTTP代理,並且看起來是這樣的:

aws apigateway get-method --rest-api-id xxxxx --resource-id yyyyy --http-method POST 

{ 
    "requestModels": { 
    "application/json": "MyRequestModel" 
    }, 
    "authorizationType": "CUSTOM", 
    "apiKeyRequired": false, 
    "httpMethod": "POST", 
    "methodIntegration": { 
    "passthroughBehavior": "WHEN_NO_MATCH", 
    "cacheKeyParameters": [], 
    "requestParameters": {}, 
    "uri": "http://myproxy/api/v1/resource", 
    "httpMethod": "POST", 
    "requestTemplates": {}, 
    "cacheNamespace": "zzzzz", 
    "type": "HTTP_PROXY" 
    }, 
    "requestValidatorId": "xyxyxyxy", 
    "authorizerId": "zyzyzyzyz" 
} 

據我所知,沒有什麼在這裏表示代表API網關的任何映射。用戶界面也不會顯示任何響應映射。

測試API的,我看到以下內容:

  • 響應頭包括"Content-Length":"17514",這是預期值
  • 從中似乎像端點響應主體和方法響應主體是日誌同樣,儘管手動比較兩個gzip數據的亂碼ascii表示有點困難。兩個Content-Length標題都是一樣的。

測試期間,重新映射的內容長度值在任何地方都不可見,也不是x-amzn-Remapped-Content-Length標頭。這讓我懷疑這可能是由Cloudfront完成的?

我通過「execute-api」和這個API的自定義域映射獲得了相同的結果。

任何指針?

+0

我不相信CloudFront的做任何轉換,在這裏,但你可以把它完全脫離通過將API部署爲區域而不是邊緣優化來實現循環。有一點,API網關不支持'Transfer-Encoding:chunked'響應,當你看到'Accept-Encoding:gzip'時,你的起源可能會切換到這個響應,因爲分塊傳輸編碼會允許你的源流傳輸gzip響應而不是緩衝直到gzip響應的「Content-Length」已知。什麼是'無效塊類型' - 在實際響應體中,curl的控制檯錯誤或錯誤消息? –

+0

「無效塊類型」是當無法有效解壓縮響應時curl對「curl --compressed」所說的內容。將結果配置爲'gunzip'也不起作用。 –

+0

我認爲我之前確定的解決方法是在集成請求中設置「Accept-Encoding:identity」的靜態請求標頭,但我一直未能找到答案,我不確定當前狀態事務就像API網關和流式響應一樣。您所描述的行爲聽起來並不熟悉,即使這樣做達到了目的,也可能不是最佳解決方案,因爲事情可能已經改變。 –

回答

2

由於Michael在他的一個(非常有幫助的)評論中懷疑 - 這確實是API Gateway將我的gzip流視爲UTF-8編碼文本的情況,並對其進行了重新編碼。鑑於這是一個未設置集成響應映射的端點,API網關會以任何方式處理我的響應,但似乎非常不直觀,但在文檔中提到了它。

解決方案是告訴API網關,對於此REST API,application/json內容類型是「二進制數據」。這會導致API網關傳遞未處理的響應。指示REST API然而,隨着Cloudformation要做到這一點,是有點本身就是一個兔子洞,這裏的解決方案:

RestApi: 
    Type: 'AWS::ApiGateway::RestApi' 
    Properties: 
    Name: !Sub 'agraNcdx${Environment}' 
    BinaryMediaTypes: 
     - 'application~1json' 
+0

>「但它在文檔中提到」。你能把我指向那個文檔頁面嗎?我想我遇到了同樣的問題 – spg

+0

實際上,我不確定它的特色有多顯着 - 它們只是提到「默認情況下,RestApi只支持utf-8文本」作爲binaryMediaTypes文檔的旁註,例如: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings.html和https://docs.aws.amazon.com/apigateway/api-reference/resource/rest- api /(搜索「UTF-8編碼文本」) –