コンテンツタイプがアプリケーション/JSONである場合、JSONでラック出力を自動的にエンコードします
-
26-09-2019 - |
質問
モジュラーシナトラアプリを手に入れました。コンテンツタイプが指示するときに、JSONとして出力をエンコードしたいと思います。現時点では、私は自分のルートで手動でそうしています:
get 'someroute' do
# content-type is actually set with a before filter
# included only for clarity
content_type 'application/json', :charset => 'utf-8'
# .. #
{:success=>true}.to_json
end
私はそれが次のようになることを望んでいます:
get 'someroute' do
content_type 'application/json', :charset => 'utf-8'
# .. #
{:success=>true}
end
また、ラックミドルウェアを使用して、適切なコンテンツタイプを検出した場合はエンコードを行いたいと思います。
私は以下を動作させようとしてきましたが、役に立たない(コンテンツの長さがボークになっている - JSONエンコードされたコンテンツではなく、オリジナルコンテンツのコンテンツレングスを返します):
require 'init'
module Rack
class JSON
def initialize app
@app = app
end
def call env
@status, @headers, @body = @app.call env
if json_response?
@body = @body.to_json
end
[@status, @headers, @body]
end
def json_response?
@headers['Content-Type'] == 'application/json'
end
end
end
use Rack::JSON
MyApp.set :run, false
MyApp.set :environment, ENV['RACK_ENV'].to_sym
run MyApp
私を軌道に乗せるためのポインターはありますか?
解決
あなたはすべてを正しく持っていますが、一つのこと:ラックは体が応答するオブジェクトであることを期待しています each
しかし、文字列ではありません。あなたの体を配列内に置くだけです。
おそらく必要ではありませんが、コンテンツの長さを手で設定する場合は、ヘッダーに追加するだけです。
if json_response?
@body = [@body.to_json]
@headers["Content-Length"] = @body[0].size.to_s
end
所属していません StackOverflow