user1174995
user1174995

Reputation: 163

Rails/Devise - Unprocessable Entity

I am trying to use a post request (JSON) to create a user. The example with curl works fine. Here is the curl command:

curl -X POST -H "Content-Type: application/json" 'http://localhost:3000/users.json' -d '{ "user": {"email": "[email protected]", "password": "foobar", "password_confirmation": "foobar"}}'

curl output:

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"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}}

but when I try a request with http libraries in java I get an error:

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\":\"[email protected]\"}"}
Completed 422 Unprocessable Entity in 73ms (Views: 3.0ms | ActiveRecord: 0.0ms)

The code for creating the request:

            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();
               }
            }
        }

Here is the function that is called for execute:

    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;

Upvotes: 3

Views: 1886

Answers (2)

carbonr
carbonr

Reputation: 6067

For me the same issue was from some error in RegistrationsController so I will share mine with you and you can make necessary changes to suit your needs

class RegistrationsController < Devise::RegistrationsController
  skip_before_filter :verify_authenticity_token,
                     :if => Proc.new { |c| c.request.format == 'application/json' }

  respond_to :json

  def create
    build_resource
    resource = User.new(params[:user])
    if resource.save
      sign_in resource
      render :status => 200,
           :json => { :success => true,
                      :info => "Registered",
                      :data => { :user => resource,
                                 :auth_token => current_user.authentication_token } }
    else
      logger.info("current user passed from json: #{resource.to_yaml}")
      render :status => :unprocessable_entity,
             :json => { :success => false,
                        :info => resource.errors,
                        :data => {} }
    end
  end
end

Upvotes: 0

zippy
zippy

Reputation: 1258

If you look at the log for the request from the Java libraries you see that the contents of the user are just one big escaped string rather than being nested hash.

When you look at the your code for creating a request you have:

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

I'm guessing that if you changed it to:

jsonUserObj.put("user", jObj);

It would work, because then it would be associating the hash which is the jObj with "user" rather than associating a string of that object with "user"

Upvotes: 0

Related Questions