2016-05-23 70 views
0

還有其他問題涉及此錯誤,但它們正在尋找訪問查詢參數,這不是我的方案。API網關:「不能反序列化java.lang.String的實例超出START_OBJECT標記」

測試我簡單的GET請求失敗,並在errorMessage現場測試控制檯以下:

Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: [email protected]; line: 1, column: 1 

我的lambda函數是一個簡單的Java類的靜態方法get,它有一個參數:從一個id一個路徑參數。

例如,做一個GETmysite.com/resource/1應該通過1我的靜態類的get方法。

我還沒有爲此設置映射,因爲我沒有映射請求正文。 API網關文檔非常混亂,並且其示例涵蓋了類似的場景。

如何將路徑參數映射到我的lambda函數的參數?

回答

1

僅僅爲了背景,Lambda函數沒有任何「參數」的概念;一切都必須進入功能的請求有效載荷。因此,您需要使用集成上的映射模板將傳入的GET參數轉換爲可以提供給Lambda的JSON有效內容。

路徑參數在與查詢字符串參數相同的映射模板對象中可用,它是$ input.params([name]),其中[name]是參數的名稱。

所以你的模板應該是這樣的:

內容類型:應用程序/ JSON

模板:

{ 
    "resourceId" : "$input.params('your_name_here')" 
} 

我把JSON值引號,但如果該值是保證是一個你可以刪除它們的數字。無論如何,將它放在引號中可能更安全。

這裏是模板參考:http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

內容類型實際上是重要的,因爲這裏API網關會檢查傳入的請求的Content-Type頭,以確定要使用的映射模板。通常在GET請求中沒有Content-Type頭,所以API網關假定你想要'application/json',所以如果你的模板被映射到除application/json之外的其他內容類型,它將無法按預期工作。


編輯:在λ整合

+0

是否'$ input.params'罩通路參數太多的背景?我試過這個,仍然遇到同樣的問題。 –

+0

是的。 有可能參數設置不正確?所以資源路徑是「/ resource/{foo}」,然後有一個名爲'foo'的路徑參數是正確的?在這種情況下,我粘貼上面的模板應該完美地工作,如果你使用 { 「resourceId」:「$ input.params('foo')」 } –

+0

內容類型使我困惑在這裏,因爲你說它是一個GET請求。響應實際上只是一個字符串,而java中的處理程序方法只是'public static String get(String id){...}'。對我部署的版本的GET請求應該只是調用'get(pathParameter)',但我似乎得到了同樣的錯誤信息。此外,根據您的建議將內容類型設置爲application/json並將其映射爲這樣,我仍然會得到該錯誤。莫名其妙。 –

相關問題