Автоматически кодирует вывод стойки с JSON, когда тип Content является приложением / JSON
-
26-09-2019 - |
Вопрос
У меня есть модульное приложение Sinatra, и я хотел бы кодировать вывод как 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
И я хотел бы использовать Stack Mardware, чтобы выполнить кодировку, если она обнаруживает соответствующий тип контента.
Я пытался сделать следующее на работу, но безрезультатно (длина содержимого получает Borked - возвращает длину содержимого контента, а не кодированный контент 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