Автоматически кодирует вывод стойки с JSON, когда тип Content является приложением / JSON

StackOverflow https://stackoverflow.com/questions/3423905

Вопрос

У меня есть модульное приложение 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top