2016-07-31 3 views
3

мне нужно, чтобы мой Java-сервер получает запрос на PUT для создания нового пользователя с идентификатором и телом JSon, то URI должен быть как:RESTful положить идентификатор и тело

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

Учитывая, что я ve создал простой Java-класс и позже может преобразовать JSON в POJO с помощью Jackson, вот моя проблема: Как указать запрос PUT для приема как id, так и тела JSON в качестве параметров? До сих пор я получил:

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

     return SUCCESS_MSG; 
    } 

И это работает, но у меня не было никакой удачи, добавив тело JSON и имеющий функцию синтаксического анализа. Я пробовал:

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

Он должен возвращать один и тот же вход JSON при тестировании в Почтальон, однако он всегда возвращает «ресурс не доступен» ошибка.

Я чувствую, что есть что-то очевидное, что я здесь отсутствует?

+0

Я думаю, вам нужно добавить неуказанный параметр, чтобы получить ваше тело. 'public String createUser (@PathParam (" id ") int id, String body)' – Tibrogargan

+0

Это первое, что я пробовал, он всегда дает мне ошибку «Ресурс недоступен» при выполнении запроса. – Flopn

+0

Звучит скорее как проблема с библиотекой, чем ваш код, но я предполагаю - извините – Tibrogargan

ответ

1

Согласно правилам API REST, метод POST для uri like/usermanagement/users - это то, что необходимо. Метод PUT используется для обновления существующего ресурса. Вы можете ознакомиться с этой замечательной статьей о том, как разработать прагматичный API RESTful. http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api.

Если вы пытаетесь создать нового пользователя, то зачем придать ему идентификатор? Вы должны POST-данные, такие как имя пользователя, фамилия, адрес электронной почты, ... и позвольте серверу генерировать идентификатор (например, идентификатор с автоматическим увеличением или некоторый UUUID) для этого нового ресурса.

Например, в моем приложении, я использую JSon тело запроса POST, как показано ниже:

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

Кроме того, ваш ответ должен возвращать HTTP-201, после успешного создания, и она должна содержать местоположение заголовок, указывающий на вновь созданный ресурс.

+0

Спасибо за ответ, но спецификация неявно сказала использовать PUT для создания. Кроме того, ему необходимо вернуть предварительно определенный JSON, который я жестко закодировал как статические переменные. – Flopn

+0

@Flopn Если вы используете PUT для создания новых ресурсов, вы неявно разрешаете клиентам владеть пространством URI. Это может стать проблематичным с течением времени, особенно если вы когда-либо захотите каким-либо образом изменить структуру URI, поэтому POST - лучшая операция для создания новых ресурсов. Вы уверены, что хотите использовать PUT, а не задавать спецификацию? – sisyphus

0

Вместо использования тела String используйте имя класса с переменными-членами и тип Like Like.

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

(Это работает в Спринг загрузки Web вне коробки упаковывают Spring MVC, вы, возможно, потребуется добавить Джексона зависимость.): На геймпаде Добавить @RequestBody аннотацию, то Джексон будет заботиться о un-marshaling JSON String для пользовательского объекта.

public String createUser(@PathParam("id") int id, @RequestBody User user){ 
Смежные вопросы