2017-10-07

awsのlambdaとAPI Gatewayを使って、ちょっとはまったこと

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ほとんど使っている人はいないのですが、
barcotterというバーコードから、そのバーコードに対応するamazonのリンクを作成するandroidアプリを作っています。
これのバーコードからamazonのリンクを生成する部分は、サーバを用意して、このサーバ側で行っています。

最初は、サーバは
Google App Engine(python)
で作っていたのですが、なんかのサポートが切れることをきっかけに
Open Shift(Ruby on Rails)
に乗り換えたのですが、こちらも最近サポートが切れる部分があったので、これをきっかけに、今回サーバ側を
aws lambda(python)
に乗り換えてみました。

今回、lambdaに乗り換えて、いざアプリを利用してみると
type java.lang.String cannot be converted to JSONObject
というエラーが出てjsonのパースができない状態になりました。

原因は、すごく些細でlamdbaでjsonを返すには
handler内で辞書オブジェクトをreturnしてやればよかったのに、
わざわざ辞書オブジェクトをjson.dumpsして文字列にしたものをreturnしてしまって、
これが原因でパースできなかったというものでした。

普通に辞書オブジェクトでreturnすると、ちゃんとbodyに以下のようにjsonが
{ 'aaa': 'bbb', 'ccc': 'ddd'}
となるのですが、文字列で返すとbodyに
"{ 'aaa': 'bbb', 'ccc': 'ddd'}"
とダブルコーテーションがついてしまって、これのせいでパースに失敗していました。

これに気づくまで、無駄に時間がかかってしまいました。

あと、結果的には関係ないのかもしれませんが
パースできないのが、文字コードがうまく処理できないのかと思い、
API Gatewayのメソッドレスポンスの
HTTP のステータス200 の
レスポンス本文のコンテンツタイプが
application/json
だったものを
application/json;charset=UTF-8
とcharsetを追加しました。

とりあえず無事に移行できました。