java - Rails/Devise - 不可处理的实体

标签 java android ruby-on-rails

我正在尝试使用发布请求 (JSON) 创建用户。 curl 的示例工作正常。这是 curl 命令:

curl -X POST -H "Content-Type: application/json" 'http://localhost:3000/users.json' -d '{ "user": {"email": "e@f.com", "password": "foobar", "password_confirmation": "foobar"}}'

curl 输出:

Started POST "/users.json" for 127.0.0.1 at 2012-01-28 16:19:10 -0800
  Processing by Devise::RegistrationsController#create as JSON
  Parameters: {"user"=>{"email"=>"e@f.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}}

但是当我尝试使用 java 中的 http 库发出请求时,出现错误:

Started POST "/users.json" for 192.168.1.88 at 2012-01-28 16:47:56 -0800
  Processing by Devise::RegistrationsController#create as JSON
  Parameters: {"user"=>"{\"password_confirmation\":\"secret\",\"password\":\"secret\",\"email\":\"a@foo.com\"}"}
Completed 422 Unprocessable Entity in 73ms (Views: 3.0ms | ActiveRecord: 0.0ms)

创建请求的代码:

            RestClient client = new RestClient(SIGNUP_URL);
            JSONObject jObj = new JSONObject();
            JSONObject jsonUserObj = new JSONObject();

            try {
                jObj.put("email", txtUserName.getText().toString());
                jObj.put("password", txtPassword.getText().toString());
                jObj.put("password_confirmation", txtPassword.getText().toString());

                jsonUserObj.put("user", jObj.toString());
            } catch (JSONException e1) {
                e1.printStackTrace();
            }

            client.setJSONParams(jsonUserObj);
            try {
                client.Execute(RequestMethod.JSON_POST);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                    e.printStackTrace();
            } catch (Exception e) {
                    e.printStackTrace();
            }   
            if (client.getResponseCode() == HttpStatus.SC_OK) {
               // Good response
               try {
                   jObj = new JSONObject(client.getResponse());
                   System.out.println("Signup Successful");
               } catch (JSONException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
               }
            }
        }

这是为执行调用的函数:

    HttpPost request = new HttpPost(url);
            request.addHeader("Content-Type", "application/json");
            request.addHeader("Accept", "application/json");
            StringEntity s = new StringEntity(jsonParams.toString(), HTTP.UTF_8);
            s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
            request.setEntity(s);
            executeRequest(request, url);
            break;

最佳答案

如果您查看来自 Java 库的请求日志,您会发现用户的内容只是一个大的转义字符串,而不是嵌套哈希。

当您查看创建请求的代码时:

jsonUserObj.put("user", jObj.toString());

我猜如果你把它改成:

jsonUserObj.put("user", jObj);

它会起作用,因为那样的话它会将作为 jObj 的散列与“用户”相关联,而不是将该对象的字符串与“用户”相关联

关于java - Rails/Devise - 不可处理的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9050101/

相关文章:

Java 条件语句/初始化变量

java - Gson:java.util.Map转换所有键值对

java - 如何打印我的 Java 对象而不得到 "SomeType@2f92e0f4"?

android - Flutter & Firestore : app. INotificationSideChannel$Stub$Proxy 错误

java - 如何正确使用回调接口(interface)从 onDataChange 获取 RecyclerView 的值列表?

android - 如何绘制具有透明度的位图

android - 如何更改 MPAndroidchart 中 Y 轴标签的间距?

ruby-on-rails - 如何在单个查询中获取另一个特定父对象的子对象的父对象

ruby-on-rails - Postgres 适配器

ruby-on-rails - 从 heroku slugs 中排除 gems 中的文件(使用 .slugignore、heroku)