我使用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
答案 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"}
它现在似乎没有阻碍功能,所以我不会失去任何睡眠。