4

この 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

たぶんこれが役立ちます。

4

2 に答える 2

0

どのバージョンのシナトラを使用していましたか? Sinatra の最近の変更ログを見ると、1.4.x リリースに 2 つのエントリがあり、関連していると思われます。

  • before フィルターまたはルートで停止を使用すると、after フィルターでステータス、ヘッダー、および本文が正しく設定されます。(コンスタンチン・ハーセ)

  • エラー ハンドラーでステータス コードを 404 に設定しても、not_found ハンドラーがトリガーされなくなりました。(コンスタンチン・ハーセ)

于 2013-07-03T06:29:07.627 に答える
0

出力が何であるか正確に理解できないかもしれませんが、404 をオーバーライドしようとしている場合は、代わりに以下のようにする必要があります。error 404 do

not_found do
    # Set content
    {"bang" => "bong"}
end
于 2013-03-28T06:29:06.583 に答える