Lambda+API Gatewayで画像を返す時に気をつけるべきx+1個のこと
この記事のおかげでやりたいことができた…のだが、
CloudFront以外全部押さえたのにレスポンスがバイナリで返ってこない!と4時間ぐらいハマったのであと1つの重要ポイントを書いておく。
CloudFrontかませないで、APIGWに直接アクセスしに行くケースの話です。
クライアントのAcceptヘッダはワイルドカード指定不可、明示必要
と指定すれば通ると思い込んでたんですよ。
でも返ってくるのはBASE64のテキスト。
マジで分からなくて組み合わせを試していった結果、クライアントからのワイルドカード指定はNGなんだとわかりました。タイプ明示する必要がある。
実験結果
実験はPostmanで実施しました。
APIからのレスポンスに含めているContent-Type | APIGWバイナリメディアタイプ指定 | クライアントAcceptヘッダ | 結果 |
image/jpeg | image/* | */* | NG |
image/jpeg | image/jpeg | */* | NG |
image/jpeg | image/* | image/jpeg | OK |
image/jpeg | image/* | image/png, image/jpeg | OK |
image/jpeg | image/* | image/jpeg, image/* | OK |
image/jpeg | image/* | image/png, image/* | OK(!?) |
image/jpeg | image/* | image/*, image/jpeg | NG |
image/jpeg | image/* | image/* | NG (!!) |
image/jpeg | image/* | (none) | NG |
image/jpeg | image/* | image/png | OK (!?) |
image/jpeg | image/jpeg | image/png | OK (!?) |
image/jpeg | image/jpeg | image/* | NG |
image/jpeg | image/png | image/* | NG |
image/jpeg | image/png | image/png | OK (!?) |
image/jpeg | image/png | image/jpeg | OK (!?) |
image/jpeg | image/png | image/png, image/jpeg | OK (!?) |
image/jpeg | image/png | (none) | NG |
この結果から言えることは、
- APIGW側バイナリメディアタイプはタイプ明示でもワイルドカードでもよいが、クライアントAcceptヘッダのワイルドカード指定はNG。受け付けてくれない
- Acceptヘッダにワイルドカードよりも高い優先順位にタイプ明示があれば、それは正常に扱われる
- jpegとpng、指定が食い違うケースでもなぜかバイナリ変換されて返ってくる謎。
ちとよくわからない挙動もありつつ、
Acceptヘッダは*/*とかにせず、image/jpegとか明示が必要ということは確かな模様。