我一直在看这个一段时间,目前不知所措。我已将问题缩小到与 JSON 相关,并且 JSON 似乎没有以清晰的格式发送。
我们之前使用的是 Rails 3.0.7(我要描述的问题不存在)。我们需要升级 Rails 以利用一些新功能 - 但现在出现了这个问题。在这一点上,我几乎可以肯定这是一个简单的配置或其他东西,但我需要更多的关注它。
我们正在使用 ActiveResource 对象,并且在设置对象的值并保存它(从而进行 PUT)时,我们得到从远程 Web 服务返回的 ab 403:Forbidden。这在 Web 服务层上不是问题。
在创建一个新对象并进行 POST 时,我们得到一个 409:Conflict 返回,因为它试图用默认值更新数据库——这意味着 json 数据没有到达服务——或者不清晰。
我的问题是这在 Rails 3.0.7 中有效,在 3.2.3(或我也尝试过的 3.1.3)中不再有效。我对 JSON 数据以外的建议持开放态度,但我很确定这就是问题所在。
我的 ActiveResource 模型有
self.format = :json
我的初始化程序文件之一中有以下内容:
ActiveResource::Base.include_root_in_json = false
ActiveSupport::JSON.backend = "json_gem"
感谢您的任何建议!
更新
我一直在用 curl 进行测试,并通过以下方式使其工作:
curl -H "Content-Type: application/json" -d "{\"userID\":\"xxx\", \"label\":\"doc.test.test\", \"value\":\"1,19\", \"id\":\"-1\"}" -v -X POST http://host:port/usermanagement/users/xxx/prefs
我得到了它的工作,但是
似乎必须明确设置 Content-Type 标头,否则会导致 415:Media Unrecognized 错误
如果我在 ActiveResource 对象中设置 Content-Type 标头,我仍然会收到 409:Conflict 错误 - 这让我相信 JSON 仍然没有正确形成。
编辑(再次)
我已经弄清楚 JSON 的问题出在哪里——Rails 将根保留在 JSON 中。因此,而不是将资源作为
{"name":"value", "name":"value"}
它正在发送
{"ResourceName": {"name":"value", "name":"value"}}
但是,我已设置include_root_in_json
为 false - 我在初始化程序文件中以及直接在模型本身中都尝试了这个,并且没有更改。