Отправка Json объекта в REST сервис JAX-RS

Задача
Отправить с web страницы JSON объект POST запросом и обработать его REST веб-сервисом на примере сервера JBoss7

Решение
Задача состоит из двух частей. Нужно реализовать обработку запроса на стороне сервера и отправить JSON объект со стороны клиента.

Создание и настройка базового REST сервиса на основе JAX-RS рассматривалось ранее в статье Создание веб-сервиса REST на JBoss 7

1. Обработка на стороне сервера.
Описываем класс сущность для передачи данных от клиента на сервер:
public class MyObj implements Serializable{

    private static final long serialVersionUID = -3393342801980571797L;

    private Long id;
    private String name;
    
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

Объявляем интефейс сервиса для сохранения объекта. Помечаем его как локальный (Local).
@Local
public interface MyObjService {

    MyObj save(MyObj obj);
}


Создаем реализацию сервиса как бин без сохранения состояния (Stateless):
@Stateless(name="MyObjServiceImpl")
@Path("/demo")
public class MyObjServiceImpl implements MyObjService{
     
    private List<MyObj> values = new ArrayList<MyObj>();
   
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Override
    public MyObj add(MyObj obj){
        System.out.println("ID: " + obj.getId());
        System.out.println("Name: " + obj.getName());
        
        values.add(obj);
        
        return obj;
    }
}


В методе обработчика сохранения объекта мы указываем, что это метод обрабывает POST запрос (помечен аннотацией @POST).

Так же мы указываем что метод получает данные в виде JSON объекта и в результате отправляет клиенту результат, так же в виде JSON объекта. Делается это с помощью аннотаций @Consumes и @Produces с указанием типа данных MediaType.APPLICATION_JSON.

Для простоты примера мы просто помещаем приходящий объект в список. В реальных случаях, скорее всего потребуется сохранение в базу данных или какая-то другая более сложная обработка объекта.

2. Отправка POST запроса со стороны клиента.
Напомним, как было указано в статье Создание веб-сервиса REST на JBoss 7
сервлет обработки REST запросов отображается на путь /rest. Соответственно т.к. наш контроллер обработки запросов отображается на путь @Path("/demo"), то итоговый путь отправки запросов будет rest/demo.

Для отправки ajax запроса используем библиотеку JQuery. Имеем следующую HTML страницу:
<body>
    <label for="id">ID:</label>
    <input id="id" type="text" />
    
    <label for="name">Name:</label>
    <input id="name" type="text" />    
    
    <input type="button" value="save" onclick="save();"/>
</body>

<script>
function save(){
    var val1 = $("#id").val();
    var val2 = $("#name").val();

    var data = {id: val1, name: val2};
    
    $.ajax({
          url: "rest/demo",
          type:"POST",
          data: JSON.stringify(data),
          contentType:"application/json; charset=utf-8",
          dataType:"json",
          success: function(result){
            alert("Success: " + result)
          }
    })
}
</script>


Здесь мы имеем два поля ввода  <input id="id" type="text" /> и <input id="name" type="text" />  для ввода идентификатора и наименования объекта, которые будут отправлены на сервер.

При нажатии кнопки у нас форимруется JSON объект с введенными значениями:
    var val1 = $("#id").val();
    var val2 = $("#name").val();

    var data = {id: val1, name: val2};


И далее выполняется отправка POST запроса с помощью функции отправки ajax запроса из библиотеку JQuery:
    $.ajax({
          url: "rest/demo",
          type:"POST",
          data: JSON.stringify(data),
          contentType:"application/json; charset=utf-8",
          dataType:"json",
          success: function(result){
            alert("Success: " + result)
          }
    })
comments powered by Disqus