Ruby on rails 为什么Rails(当前的4.0)无法解释嵌套的JSON(来自HTTP POST)?
我正在用Ruby(客户端)和Rails(服务器)编写一个简单的客户机-服务器应用程序(仅使用JSONAPI) 尝试从客户端创建游戏时,我使用:Ruby on rails 为什么Rails(当前的4.0)无法解释嵌套的JSON(来自HTTP POST)?,ruby-on-rails,ruby,json,post,nested,Ruby On Rails,Ruby,Json,Post,Nested,我正在用Ruby(客户端)和Rails(服务器)编写一个简单的客户机-服务器应用程序(仅使用JSONAPI) 尝试从客户端创建游戏时,我使用: uri = URI.parse(url) http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Post.new(uri.request_uri) request.set_form_data({"tttgame" => {"name" =>
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data({"tttgame" => {"name" => "Marius"}})
resp = http.request(request)
在服务器端(tttgames_controller.rb),我有:
服务器上的日志包括:
Started POST "/tttgames.json" for 127.0.0.1 at 2013-10-05 12:58:44 +0300
Processing by TttgamesController#create as JSON
Parameters: {"tttgame"=>"{\"name\"=>\"Marius\"}"}
Completed 500 Internal Server Error in 0ms
NoMethodError (undefined method `stringify_keys' for "{\"name\"=>\"Marius\"}":String):
app/controllers/tttgames_controller.rb:33:in `create'
我怎样才能解决这个问题?所有来自互联网的例子看起来都是一样的。谢谢 更新:此外,您的字符串不是有效的JSON。它需要是
“{\”name\:\“Marius\”}”
您需要解析该响应,因为现在它是一个字符串(“{\”name\”=>“Marius\”}
),但实际上您需要一个散列({“name”=>“Marius”}
)
因此,#stringify_keys
失败,因为它是一种在散列上运行的方法
a也是这样:
@tttgame = Tttgame.new(JSON.parse(tttgame_params))
相反。这将把序列化的JSON响应从字符串
转换为哈希
,您可能需要这样做。它甚至更紧凑
uri = URI.parse(url)
resp = Net::HTTP.post_form(uri, "tttgame" => {"name" => "Marius"})
从开始,两种方法set\u form\u data
和post\u form
都使用x-www-form-urlencoded格式对数据进行编码。检查。
提供的示例不包含嵌套哈希
我在REST方法部分找到了一个很好的例子
因此,为了在服务器上获得具有嵌套哈希的有效结构,客户端应使用方括号:
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data({"tttgame[name]" => “Marius”)
resp = http.request(request)
或者更简单:
uri = URI.parse(url)
resp = Net::HTTP.post_form(uri, {"tttgame[name]" => “Marius”})
这将在服务器上生成
Parameters: {"tttgame"=>{"name"=>"Marius"}}
通过执行您建议的操作,我得到了以下错误:JSON::ParserError(757:在“{”name“=>“Marius”}”处出现意外标记):app/controllers/tttgames_controller.rb:31:“create”中看起来像是JSON.parse无法解释火箭符号(=>),因为它不是JSON的有效标记document@marius_gu是的,我忽略了这个。更新了我的答案,没错!然后问题是:客户端应该如何格式化消息,以便服务器以有效的JSON格式获取消息,如“{\'name\:\'Marius\'}”
?@Marius\u gu客户端应该只关心发送有效的JSON请求。如果是这样,后端将正确处理它(即解析它)。请在我的例子中给出一个例子,因为在客户端上放置请求。设置表单数据({“tttgame”=>{“name”=>“Marius”}})
不会作为有效的JSON到达服务器,它具有与Net::HTTP::Post.set\u表单数据相同的效果
Parameters: {"tttgame"=>{"name"=>"Marius"}}