我正在使用 JSON 响应的旧版 rails 1.2.6 应用程序中构建 Web 服务,并且我试图使其也接受 JSON,而不是 URL 编码参数。
我把它放在我的控制器中:
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 上是如何工作的,因为从我的角度来看,它几乎与 mime_type.rb 相同?