在Rails控制器中处理JSON数据(将JSON请求体映射到params散列)

时间:2011-10-10 22:10:11

标签: ruby-on-rails json

我试图通过params哈希访问数据来处理发布到Rails(3.1.0)控制器的JSON数据。不幸的是,Rails似乎并没有自动处理数据(正如StackOverflow上的文档和其他问题所示)。

控制器看起来像:

class Api::EventsController < ApplicationController
  skip_before_filter :verify_authenticity_token

  def create
    unless params['event']['timestamp'].nil?
      ...
    end
    ...

    render :json => { :status => :success }
  end
end

HTTP请求看起来像这样(使用tcpdump捕获):

POST /api/locations/1/events HTTP/1.1
Date: Mon, 10 Oct 2011 21:57:22 GMT+00:00
Content-Type: application/json; charset=UTF-8
Accept: application/json
Host: 10.0.2.2:3000
User-Agent: Restlet-Framework/2.1rc1
Authorization: Basic ...
Transfer-Encoding: chunked
Connection: Keep-Alive

4e
{"event":{"data_source":"ANDROID","timestamp":1318283841768,"type":"LEAVING"}}
0

在上面的示例中,params['event']始终为nil。使用ActiveSupport::JSON.decode(request.body)解析JSON数据有效,但我想自动将请求体映射到参数。

修改: request.params只包含路由信息,request.request_parameters完全为空。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

您确定要发送正确的请求吗?响应RFC 2616,你的最后一个块应该是空的,告诉接收器传输的结束。只需采用你的要求:

...
4e CRLF
{"event":{"data_source":"ANDROID","timestamp":1318283841768,"type":"LEAVING"}} CRLF
0 CRLF
CRLF

您可能会考虑从Transfer-Encoding切换到Content-Length。

传输编码适用于流式传输数据。您可以在不事先知道其大小的情况下发送几个数据块。您必须发送一个空块以声明传输已完成。

Content-Length 只是指定您要发送的数据的长度,以便接收方知道传输何时到达结束。


以防万一你忘记粘贴最后一个块:

<强>重写吗

您是否意外覆盖了某些参数,参数,request_parameters,请求?为什么不试试

  • request.params获取相同的值或

  • request.request_parameters了解实际内容哈希{:event =&gt; ......}没有附加调度的东西