我有一個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的自定義域映射獲得了相同的結果。
任何指針?
我不相信CloudFront的做任何轉換,在這裏,但你可以把它完全脫離通過將API部署爲區域而不是邊緣優化來實現循環。有一點,API網關不支持'Transfer-Encoding:chunked'響應,當你看到'Accept-Encoding:gzip'時,你的起源可能會切換到這個響應,因爲分塊傳輸編碼會允許你的源流傳輸gzip響應而不是緩衝直到gzip響應的「Content-Length」已知。什麼是'無效塊類型' - 在實際響應體中,curl的控制檯錯誤或錯誤消息? –
「無效塊類型」是當無法有效解壓縮響應時curl對「curl --compressed」所說的內容。將結果配置爲'gunzip'也不起作用。 –
我認爲我之前確定的解決方法是在集成請求中設置「Accept-Encoding:identity」的靜態請求標頭,但我一直未能找到答案,我不確定當前狀態事務就像API網關和流式響應一樣。您所描述的行爲聽起來並不熟悉,即使這樣做達到了目的,也可能不是最佳解決方案,因爲事情可能已經改變。 –