提交到Rails时JSON导致不可处理的实体(错误422)

时间:2015-06-23 19:02:46

标签: android ruby-on-rails json mongodb

我使用Android应用程序提交到一个带有Heroku上托管的Mongo后端的Rails应用程序。我可以使用在线表单将新项目提交到mongo数据库,但是当我尝试从Android应用程序提交JSON时,我得到:

{"error":"Unprocessable Entity","status":"422"}

我认为这可能与我提交时的JSON顺序有关,因为它似乎已按照a past SO question按顺序混淆了。但是,这个问题的解决方案对我不起作用。

以下是我的Android应用程序中JSONObject的构造:

 JSONObject jsonObject = new JSONObject();
        jsonObject.put("ph", 2);
        jsonObject.put("chlorine", 2.0);
        jsonObject.put("magnified_Link", url);//URLEncoder.encode(encodedImage, "UTF-8"));
        jsonObject.put("taste", "yucky");
        jsonObject.put("odor", "smelly");
        jsonObject.put("temperature", "77.0");
        jsonObject.put("mercury", 234);
        jsonObject.put("hardness", 9.0);
        jsonObject.put("lat", latitude);
        jsonObject.put("long", longitude);

        String json = jsonObject.toString(); // Output to string
        Log.d(TAG, json);

        StringEntity se = new StringEntity(json);
        // put json string into server
        httpPost.setEntity(se);

        //httpPost.setHeader("Authorization", "Client-ID " +API_KEY);
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");

当我在提交之前记录JSON时,这就是我的Android应用程序中出现的方式:

{"chlorine":2,"odor":"smelly","magnified_Link":"http:\/\/i.imgur.com\/JnbuUwy.jpg","long":0,"hardness":9,"ph":2,"taste":"yucky","lat":0,"mercury":234,"temperature":"77.0"}

这是我的我的JSON页面在我的rails应用程序上的样子,并通过在线rails应用程序成功提交到该应用程序:

[{"id":{"$oid":"558766f26633380003000000"},"ph":1.0,"chlorine":2.0,"magnified_Link":"3","taste":"4","odor":"5","temperature":6.0,"mercury":7.0,"hardness":8.0,"lat":40.7127,"long":-74.0059,"url":"https://distributed-health.herokuapp.com/distributed_healths/558766f26633380003000000.json"}]

最后,这是" DistributedHealth"的模型。 (我的对象)在我的rails应用程序中:

class DistributedHealth
  include Mongoid::Document
  field :ph, type: Float
  field :chlorine, type: Float
  field :magnified_Link, type: String
  field :taste, type: String
  field :odor, type: String
  field :temperature, type: Float
  field :mercury, type: Float
  field :hardness, type: Float
  field :lat, type: Float
  field :long, type: Float
end 

我可以包含任何其他相关代码,并会在我继续尝试解决此问题时对此帖进行编辑。

谢谢,

克莱顿。

编辑:我有来自myoku服务器的错误消息

2015-06-23T21:29:34.382730+00:00 heroku[router]: at=info method=POST path="/distributed_healths.json" host=distributed-health.herokuapp.com request_id=2dcde4a4-3dcc-4381-98ba-6ca399400a6d fwd="128.54.58.245" dyno=web.1 connect=3ms service=14ms status=422 bytes=328

1 个答案:

答案 0 :(得分:2)

该问题最终成为Rails的一方,并没有与提交的JSON的顺序有关。我在Controller中class DistributedHealthsController < ApplicationController之后使用了该行,需要一个CSRF令牌:

skip_before_action :verify_authenticity_token

这不是推荐的,因为它是一种解决安全问题的方法,但如果您想要排除某些方法,this post会告诉您如何操作。

可以找到关于该主题的更多讨论here,并且可以找到关于该主题的一些文档here

即使我现在能够对我的rails应用程序进行POST,我仍然在Android Studio日志中收到错误500,如下所示:

{"error":"Internal Server Error","status":"500"}

它现在似乎没有阻碍功能,所以我不会失去任何睡眠。