Flopn
Flopn

Reputation: 195

RESTful put id and body

I need to have my Java server receive a PUT request to create a new user from an id and a json body, the URI needs to be like:

/usermanagement/user/$id { "name":john, "type":admin }

Given that I've made a simple Java class and can later convert the JSON to a POJO using Jackson, here's my problem: How do I specify the PUT request to accept both the id and the JSON body as parameters? So far I've got:

 @PUT
    @Path("{id}")
    @Consumes(MediaType.APPLICATION_JSON) 
    public String createUser(@PathParam("id") int id){
        User user = new User();  
        User.setId(id);

        return SUCCESS_MSG;
    }

And this works, but I've had no luck adding the JSON body and having the function parse it. I've tried:

public String createUser(@PathParam("id") int id, String body){
     return body;
}

It should return the same input JSON when testing in Postman, however it always returns a "resource not available" error.

I feel there's something obvious that I'm missing here?

Upvotes: 4

Views: 5336

Answers (2)

so-random-dude
so-random-dude

Reputation: 16465

Instead of Using String body, use a Class with Member variables name and Type Like this.

public class User {
    private String name;
    private String type;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

(This works in Spring Boot Web out-of-box. incase of Spring MVC, you might need to add Jackson dependency): On your Controller , Add @RequestBody Annotation, then Jackson will take care of the deserializing of JSON String to User Object.

public String createUser(@PathParam("id") int id, @RequestBody User user){

Upvotes: 1

Mopparthy Ravindranath
Mopparthy Ravindranath

Reputation: 3308

As per REST API conventions, a POST method on a uri like /usermanagement/users is what is needed. PUT method is used for updating an existing resource. You can go through this wonderful article on how to design pragmatic RESTful API. http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api.

If you are trying to create a new user, why give it an ID? You have to POST the data such as user name, lastname, email, ... and let the backend generate an ID (like an auto-incremented id, or some UUUID) for this new resource.

For example, in my app, I use a json body for a POST request like below:

  {
    "loginId":    "ravi.sharma",
    "firstName":  "Ravi",
    "lastName":   "Sharma",
    "email":      "[email protected]",
    "contactNo":  "919100000001",
    "..." : ".."
  }

Moreover, your response should return HTTP-201, after successful creation, and it should contain a location header, pointing to the newly created resource.

Upvotes: 1

Related Questions