قم بتشفير إخراج الرف تلقائيًا مع JSON عندما يكون نوع المحتوى هو التطبيق/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
وأرغب في استخدام برامج الرف الوسيطة للقيام بالترميز إذا اكتشف نوع المحتوى المناسب.
لقد كنت أحاول الحصول على ما يلي للعمل ، ولكن دون جدوى (يتم الحصول على طول المحتوى-إرجاع طول المحتوى الأصلي للمحتوى الأصلي وليس المحتوى المشفر 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
لا تنتمي إلى StackOverflow