Простой (синхронный) эмулятор REST-сервиса c SoapUI

soapui
groovy
rest
Теги: #<Tag:0x00007fedbab7fe08> #<Tag:0x00007fedbab7fae8> #<Tag:0x00007fedbab7f958>

(rmerkushin) #1

В этой статье я покажу как можно реализовать простой, синхронный эмулятор REST-сервиса с помощью SoapUI. Для реализации REST-заглушки можно использовать множество других инструментов, но если у вас как и у меня уже есть куча эмуляторов SOAP-сервисов на SoapUI, то не вижу смысла плодить зоопарк :slight_smile: К тому же за счет встроенного groovy, SoapUI позволяет делать достаточно гибкие эмуляторы.

Создание проекта

Для реализации ниже описанного примера использовался SoapUI версии 5.1.3, но пример должен так же работать и в других версиях.

Запускаем SoapUI и создаем новый REST проект. В появившемся окне ничего не меняем и жмем ОК.


После того как создастся проект, переименовываем его во что нибудь внятное, например HelloWorld. Далее добавляем MockService, который и будет выступать в качестве нашего эмулятора. Нажимаем ⌘+R в Mac OS или через контекстное меню проекта выбираем пункт New REST MockService и указываем его имя, например “HelloWorldService”. Заходим в настройки созданного MockService и меняем параметр Host на localhost и по желанию меняем порт.

Логирование запросов\ответов

Научим наш эмулятор логированию. Открываем в нашем MockService раздел OnRequest Script и пишем следующий код:

// Получаем из запроса тип метода, параметры GET запроса (если они есть), заголовок запроса и его тело
def method = mockRequest.request.getMethod();
def uri = mockRequest.request.getUri();
def request = mockRequest.requestHeaders.toString() + "\n" + mockRequest.requestContent.toString();

log.info("Incoming ${method} request: ${uri}\n${request}");

Далее в разделе AfterRequest Script пишем:

// Получаем заголовок ответа, тело ответа и имя операции
def action = mockResult.getMockOperation().getName();
def headers = mockResult.getResponseHeaders().toString();
def message = mockResult.getResponseContent();

log.info("Outgoing ${action} response:\n${headers}\n${message}");

GET

Создадим эмуляцию ответа на GET запрос. Через контекстное меню MockService’а выбираем пункт Add new mock action, выбираем тип запроса GET и указываем Resource path - hello, т.к. наш сервис будет приветствовать пользователя по фамилии и имени из запроса.


Далее добавляем в только что созданный action ответ (New MockResponse) и называем его OK. Устанавливаем status code на 200 - OK, а content type на application/json. Ниже в Editor пишем следующее:

{"greeting": "Hello, ${name} ${surname}!", "date": "${date}"}

В разделе Script пишем:

// Получаем имя и фамилию из параметров запроса
def name = mockRequest.request.getParameter("name");
def surname = mockRequest.request.getParameter("surname");
// Текущая дата
def date = new Date();

// Устанавливаем параметры ответа
requestContext.name = name;
requestContext.surname = surname;
requestContext.date = date;

Все, наш эмулятор готов! Как запускать эмулятор, докрутить к нему https, конфиг и прочее - можно прочитать в других моих статьях.

Скачать готовый пример HelloWorld.