JSON で応答するレガシー Rails 1.2.6 アプリで Web サービスを構築しています。URL エンコードされたパラメーターではなく、JSON も受け入れるようにしようとしています。
これをコントローラーに入れました:
param_parsers[Mime::JSON] = lambda { |data| JSON.parse(data) }
正常に動作する残りのクライアントが送信するため、これは機能しません。
Content-Type: application/json; charset=utf-8
ご覧のとおり、文字エンコーディングは Content-Type ヘッダーに追加されますが、Rails 1.2 は "Content-Type" ヘッダー全体で単純な文字列比較を行い、"charset=utf-8" 部分によって破棄されます。
rails-1.2/gems/gems/actionpack-1.13.6/lib/action_controller/request.rb
def content_type
@content_type ||=
begin
content_type = @env['CONTENT_TYPE'].to_s.downcase
if x_post_format = @env['HTTP_X_POST_DATA_FORMAT']
case x_post_format.to_s.downcase
when 'yaml'
content_type = 'application/x-yaml'
when 'xml'
content_type = 'application/xml'
end
end
Mime::Type.lookup(content_type)
end
end
rails-1.2/gems/gems/actionpack-1.13.6/lib/action_controller/mime_type.rb
def lookup(string)
LOOKUP[string]
end
mime_type.rb ファイルの下部:
LOOKUP["application/json"] = JSON
LOOKUP["text/x-json"] = JSON
@env['CONTENT_TYPE'] は "application/json; charset=utf-8" です
Mime::Type.lookup(content_type) は単に LOOKUP[content_type] を返しますが、これは一致しません。これは、その時点でコンテンツ タイプにまだ「; charset=utf-8」が追加されているためです。
content_type から charset=utf-8 を取り除く必要があるのはどこですか? これをどのように修正しますか?Rails3 ではどのように動作するのでしょうか?