Laravel4のjson系メソッドで取り込めない場合
LaravelではJSON形式のデーターが簡単に取り扱えるように、サポートされています。
先日、AWSのSNSをLaravelから使用した時に、まる一日はまったのが、Input::json()で取り込めないことでした。なにせ、SNSを本格使用するのは初めてなので、原因を追求するとき、遠回りをしてしまいました。
LaravelのInput::json()では、コンテンツタイプがplain/json
かどうかのチェックがあります。SNSからのJSONリクエストは、plain/text
のため、チェックで弾かれ、空配列が戻ってきていました。(多分、Laravelのチェックが厳密すぎるのでしょう。)
こういう時は、リクエストの本文を直接取り込めるRequest::getContent()が使用できます。
$result = json_decode( Request::getContent(), true );
SNSは他のサービスやこちらから送った内容(メッセージ)を指定場所へ通知してくれる仕組みです。今回は、SESのバウンスメールの通知を転送するために使用しました。SNSのJSON形式に含まれている、Messageアイテムから、SESが通知してきたJSON形式のメッセージを再度取り出す必要がありました。
$message = json_decode( array_get( $result, 'Message' ), true );
分かってしまえば、なんてこと無いんですが、SNSやLaravel内部の実装は、できればブラックボックスのまま使用したいもので、先に調べていませんでした。(正確に言えば、簡単には見つからないため、諦めていました。)