|
|||||||
Вызов метода сервиса
Время создания: 03.12.2019 15:40
Раздел: INFO - Development - CUBA - REST
Запись: wwwlir/Tetra/master/base/1575358811c4us1zbibb/text.html на raw.githubusercontent.com
|
|||||||
|
|||||||
Предположим, в системе имеется сервис OrderService, реализация которого выглядит следующим образом: package com.company.sales.service;
import com.haulmont.cuba.core.EntityManager;
import com.haulmont.cuba.core.Persistence;
import com.haulmont.cuba.core.Transaction;
import org.springframework.stereotype.Service;
import javax.inject.Inject;
import java.math.BigDecimal;
@Service(OrderService.NAME)
public class OrderServiceBean implements OrderService {
@Inject
private Persistence persistence;
@Override
public BigDecimal calculatePrice(String orderNumber) {
BigDecimal orderPrice = null;
try (Transaction tx = persistence.createTransaction()) {
EntityManager em = persistence.getEntityManager();
orderPrice = (BigDecimal) em.createQuery("select sum(oi.price) from sales$OrderItem oi where oi.order.number = :orderNumber")
.setParameter("orderNumber", orderNumber)
.getSingleResult();
tx.commit();
}
return orderPrice;
}
}
Перед выполнением метода сервиса с помощью REST API необходимо разрешить его вызов в конфигурационном файле. В корневом пакете модуля web (например, com.company.sales) необходимо создать файл rest-services.xml. Затем этот файл объявляется в файле свойств приложения модуля web (web-app.properties): cuba.rest.servicesConfig = +com/company/sales/rest-services.xml
Содержимое файла rest-services.xml: <?xml version="1.0" encoding="UTF-8"?>
<services xmlns="http://schemas.haulmont.com/cuba/rest-services-v2.xsd">
<service name="sales_OrderService">
<method name="calculatePrice">
<param name="orderNumber"/>
</method>
</service>
</services>
Для вызова метода сервиса, необходимо выполнить GET http-запрос к REST API вида: http://localhost:8080/app/rest/v2/services/sales_OrderService/calculatePrice?orderNumber=00001 Части URL:
OAuth-токен должен быть передан в заголовке запроса Authorization с типом Bearer. Метод сервиса может вернуть как простой тип данных, так и сущность, коллекцию сущностей или произвольный POJO. В нашем случае метод возвращает BigDecimal, поэтому в теле ответа нам вернется число: 39.2
Вызов метода сервиса (POST) REST API позволяет выполнять методы сервисов, аргументами которых являются не только простые типы, но также:
Небольшой пример. Предположим, в сервис OrderService, созданный в предыдущем разделе, добавлен следующий метод: @Override
public OrderValidationResult validateOrder(Order order, Date validationDate){
OrderValidationResult result=new OrderValidationResult();
result.setSuccess(false);
result.setErrorMessage("Validation of order "+order.getNumber()+" failed. validationDate parameter is: "+validationDate);
return result;
}
Класс OrderValidationResult выглядит следующим образом: package com.company.sales.service;
import java.io.Serializable;
public class OrderValidationResult implements Serializable {
private boolean success;
private String errorMessage;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}
Новый метод сервиса принимает сущность Order в качестве первого аргумента и возвращает POJO. Перед вызовом данного метода с помощью REST API необходимо разрешить его, добавив запись в конфигурационный файл rest-services.xml (его создание было рассмотрено в Вызов метода сервиса (GET)): <?xml version="1.0" encoding="UTF-8"?>
<services xmlns="http://schemas.haulmont.com/cuba/rest-services-v2.xsd">
<service name="sales_OrderService">
<method name="calculatePrice">
<param name="orderNumber"/>
</method>
<method name="validateOrder">
<param name="order"/>
<param name="validationDate"/>
</method>
</service>
</services>
Метод validateOrder сервиса вызывается POST запросом по адресу: http://localhost:8080/app/rest/v2/services/sales_OrderService/validateOrder Параметры в случае POST передаются в теле запроса в JSON объекте. Каждое поле JSON объекта соответствует аргументу метода сервиса: {
"order" : {
"number": "00050",
"date" : "2016-01-01"
},
"validationDate": "2016-10-01"
}
OAuth-токен должен быть передан в заголовке запроса Authorization с типом Bearer. Метод вернет сериализованный POJO: {
"success": false,
"errorMessage": "Validation of order 00050 failed. validationDate parameter is: 2016-10-01"
} |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|