この JSON API の開発には Sinatra を使用しています。私が設計した方法では、エラー メッセージも特定の形式の JSON で配信されます。唯一の違いは、応答に 2xx または 3xx ではなく 4xx ステータス コードがあることです。今、私が遭遇した問題:
応答のコンテンツ タイプを設定する一般的なフィルターを定義しました。このような:
before { content_type :json }
問題は、停止を呼び出すたびに、この設定が考慮されないことです。非常に醜い、より冗長でエラーが発生しやすい方法で、停止呼び出しで自分で設定する必要があります。
halt [404, {"Content-Type" => "application/json;charset=utf-8"}]
これを行う別の方法はありますか?
私を最も悩ませている問題は、404 エラー (以下を参照)、JSON コンテンツ タイプ、および json ボディをキャッチした後にコード 404 で停止すると、奇妙なことに、ボディが取得されず、ブラウザもカールも取得されないことです。どうして?
error 404 do halt [404...{"bang" => "bong"....}] end
アップデート
最後の問題に関しては、curl を使用して 404 エラー ブロックに入る呼び出しをトリガーすると、次のようになります。
curl http://faulty_url
# curl log:
curl: (52) Empty reply from server
# sinatra log:
!! Unexpected error while processing request: Content-Length header was 221, but should be 227
127.0.0.1 - - [28/Mar/2013 11:28:47] "GET / HTTP/1.1" 404 221 0.0664
たぶんこれが役立ちます。