PIYO - Tech & Life -

Grapeで独自のレスポンスヘッダーを追加する

JSON API Grape Rails

先日こんなエントリーを書いた。

Grapeを使ったAPIで独自のエラーコードも一緒に返す工夫 - ぴよログ

その後色々調べているうちに、エラーコードはレスポンスヘッダーに入れたらいいよ~という話を見かけたので、その方針を採るかどうかは別として実現方法を調べてみた。

YappoLogs: 2014年に向けた JSON API の実装の方向性と X-JSON-Status 改め X-API-Status header のご提案

調べたところによるとgem、GrapeにはHTTPヘッダーを追加するインターフェースが用意されているらしい。エラー時にヘッダーを追加するには

error! 'Unauthorized', 401, 'X-Error-Detail' => 'Invalid token.'

と、こんな風に書けばいいそうだ。

以前の続きから

先ほどリンクを貼った自分のエントリーではエラーフォーマッターをカスタマイズした上でヘルパーを使ってJSONのレスポンスを返す感じにしていた。

Grapeを使ったAPIで独自のエラーコードも一緒に返す工夫 - ぴよログ

HTTPヘッダーに項目を追加するためにはヘルパーメソッドをちょちょっと変更してあげるだけで済みそうだ。

before

def my_error!(error)
  error!({message: error.message, code: error.code}, error.status)
end

after

def my_error!(error)
  error!({message: error.message, code: error.code}, error.status,
  "X-API-Status" => error.code.to_s,
  "X-API-Error-Message" => error.message)
end

とまあ、大体こんな感じ。1つ目の引数と内容的にはダブっているし、ヘッダーのフィールド名?っていうのかな?それも適当なのでもうちょっとブラッシュアップする必要がりそうだが、一応レスポンスヘッダーにエラー詳細情報を載せることはできそうだ。

このAPIを呼び出すクライアントを実装するのであればレスポンスヘッダーを解析して、HTTPのStatusとこのX-API-Statusを見て処理を分岐すればいいんだと思う。確かにJSONのパースは不要になるからこちらのほうが(レスポンスBodyにJSONとしてエラー詳細を含めるよりも)いい気がしなくもない。

クライアントの実装も自分でやることになるので、サーバー側の実装はどちらの手段も提供するようにしておいてあとから決めることにしよう。