قم بتشفير إخراج الرف تلقائيًا مع JSON عندما يكون نوع المحتوى هو التطبيق/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

وأرغب في استخدام برامج الرف الوسيطة للقيام بالترميز إذا اكتشف نوع المحتوى المناسب.

لقد كنت أحاول الحصول على ما يلي للعمل ، ولكن دون جدوى (يتم الحصول على طول المحتوى-إرجاع طول المحتوى الأصلي للمحتوى الأصلي وليس المحتوى المشفر 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

أي مؤشرات لإعادتي إلى المسار الصحيح؟

هل كانت مفيدة؟

المحلول

لديك كل شيء بشكل صحيح ولكن شيء واحد: Rack يتوقع أن يكون الجسم كائنًا يستجيب إليه each ولكن ليست سلسلة. فقط ضع جسمك داخل صفيف.

ربما لا يكون ذلك ضروريًا ، ولكن إذا كنت ترغب في ضبط طول المحتوى باليد ، فما عليك سوى إضافته إلى الرؤوس.

if json_response?
  @body = [@body.to_json]
  @headers["Content-Length"] = @body[0].size.to_s
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top