Reputation: 163
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
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
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