我试图通过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
完全为空。
我错过了什么?
答案 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; ......}没有附加调度的东西