Ruby on Rails和带内容类型的POST:text / plain

时间:2014-08-28 04:48:42

标签: ruby-on-rails curl

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)

此外,如果我评估请求对象,我无法看到有关我所追求的内容。我是以错误的方式接近这个,还是我完全错过了什么?谢谢你们!

1 个答案:

答案 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