Hey Guys(长期潜伏者)
当我提交内容类型为text / plain的POST请求时,我有一个关于rails正在做什么的问题。
我的问题是我试图通过JQuery的AJAX(使用XDomainRequest强制文本/ plain的内容类型)在IE 8中提交一些内容但是rails没有提取提交的数据,这是一个示例Curl请求与rails即:
curl -i https://localhost:8080/v1/auth -H 'Content-Type: text/plain' -d 'login=test@example.com' -d 'password=testpassword123' --insecure
Started POST "/v1/auth" for 127.0.0.1 at 2014-08-28 14:09:21 +1000
Processing by V1::AuthController#create as */*
..
Completed 401 Unauthorized in 1ms (ActiveRecord: 0.2ms)
正如您所看到的,Rails没有提取登录名或密码。这是相同的curl请求,但内容类型设置为x-www-form-urlencoded。
curl -i https://localhost:8080/v1/auth -H 'Content-Type: application/x-www-form-urlencoded' -d 'login=test@example.com' -d 'password=testpassword123' --insecure
Started POST "/v1/auth" for 127.0.0.1 at 2014-08-28 14:42:46 +1000
Processing by V1::AuthController#create as */*
Parameters: {"login"=>"test@example.com", "password"=>"testpassword123"}
....
(0.8ms) commit transaction
Completed 200 OK in 1624ms (Views: 0.5ms | ActiveRecord: 3.3ms)
此外,如果我评估请求对象,我无法看到有关我所追求的内容。我是以错误的方式接近这个,还是我完全错过了什么?谢谢你们!
答案 0 :(得分:2)
正如您所提到的,XDomainRequests要么发送内容类型的“text / plain”,要么根本不发送内容类型的标头。 rails依赖于'x-www-form-urlencoded'内容类型标头来解析POST主体作为表单数据。要使用rails处理XDomainRequest发布请求,您可以手动解析原始POST主体。
这样做我创造了一个帮手:
# correctly parses data from an IE8/IE9 XDomainRequest POST, which doesn't have a
# content type.
def cross_origin_params
if request.content_type == 'text/plain' || request.content_type.blank?
parsed_post_body = Rack::Utils.parse_nested_query(request.raw_post)
parsed_post_body_params = ActionController::Parameters.new(parsed_post_body)
parsed_post_body_params.deep_merge(params)
else
params
end
end
我在访问请求数据时引用了cross_origin_params
而不是params
。