Ruby on Rails中如何保留POST提交的原始XML数据?
如何在Rails中直接获取原始XML请求体,跳过自动解析成params哈希
没问题,我刚好处理过类似的需求,有几种实用的方法可以帮你直接拿到原始XML字符串,不用走Rails自动解析那一套:
方法一:直接读取请求的原始Body(最推荐)
这是最简单直接的方式,不管Rails有没有自动解析,你都能拿到最原始的XML内容。在你的控制器动作里直接用request.raw_post就行:
def submit_xml raw_xml = request.raw_post # 这里直接处理raw_xml字符串就好,不用再转来转去 # 比如传给Nokogiri解析,或者直接存储等 end
如果想用request.body.read的话也可以,但要注意:调用read之后,请求体的指针会移到末尾,后续如果还要读取body内容的话,需要先调用request.body.rewind重置指针,比如:
raw_xml = request.body.read request.body.rewind # 可选,如果你之后还要用到request.body的话
方法二:针对特定接口禁用XML解析
如果你希望某个接口完全跳过Rails的XML解析逻辑,可以通过控制器回调实现。比如在控制器里添加一个前置动作,手动阻止解析:
class XmlSubmissionsController < ApplicationController before_action :skip_xml_parsing, only: [:submit] def submit raw_xml = request.body.read # 处理逻辑... end private def skip_xml_parsing # 阻止Rails解析XML请求体 request.parameters request.env['action_dispatch.request.request_parameters'] = {} end end
方法三:全局禁用XML解析(不推荐,除非必要)
如果你的整个应用都不需要Rails自动解析XML,可以在config/application.rb里移除对应的中间件,但这样会同时影响JSON等其他格式的自动解析,所以只适合特殊场景:
# config/application.rb module YourApp class Application < Rails::Application # 移除ParamsParser中间件,禁用所有请求体自动解析 config.middleware.delete ActionDispatch::ParamsParser end end
小提示
Rails只会在请求头的Content-Type为application/xml或text/xml时才会自动解析XML,所以如果客户端能调整请求头的话,也可以暂时改成其他类型(比如text/plain),但这种方式对客户端不友好,还是优先用方法一最稳妥。
内容的提问来源于stack exchange,提问作者mstrom
相关产品推荐
相关产品推荐

