Какие существуют api сервисы dataspace
Перейти к содержимому

Какие существуют api сервисы dataspace

  • автор:

Как ускорить взаимодействие с Tinkoff Invest API

Следующие рекомендации позволят уменьшить временные издержки при запросе данных и выставлении поручений.

Сетевые задержки

Сервера брокера находятся в датацентрах M1 и Dataspace, чем ближе ваше оборудование будет располагаться к ним, тем меньше будут сетевые задержки.

Скорость исполнения поручений

  1. Скорость исполнения поручений со включенной маржинальной торговлей значительно ниже, поэтому если маржинальная торговля не является обязательной для вас, ее лучше отключить.
  2. Задержки в скорости выставлении заявок пропорциональны количеству сделок, проведенных на данном аккаунте в течение торгового дня. Поэтому если вы выставляете много поручений (десятки тысяч в сутки) и испытываете проблемы со скоростью исполнения, рекомендуем открыть дополнительные брокерские счета и равномерно разделить торговлю между ними.
  3. Если исполнение осуществляется достаточно медленно, вам надо выставлять больше заявок и вы не успеваете выбирать весь предоставленный лимит, то рекомендуем архитектурно выставлять заявки в несколько программных потоков параллельно.

Порядок доставки информации об исполнении заявок

Так как брокер — не строго-консистентная система, то при исполнении заявок в разных сервисах информация придет с различными задержками:

  1. Самое быстрое — придет обновление в GetOrders / GetOrderState
  2. Далее — GetPosition, TradeStream
  3. Далее — GetPortfolio
  4. Позже обновятся операции в GetOperations

Скорость доставки рыночных котировок

  1. Рекомендуем следить, чтобы клиентский код успевал вычитывать все присланную в стриминге информацию, иначе сервер может разорвать соединение.
  2. Обновления в tradeStream приходят чуть быстрее, чем в Candles
  3. В потоке котировок свечей есть ограничение на частоту отправки — свечи не отправляются ранее, чем через 300мс с момента отправки последней свечи по тому же инструменту.

APIs

This section gives an overview on the APIs provided by Copernicus Data Space Ecosystem.

Catalog APIs

There are various interfaces providing capability to search the catalog, to serve various users’ needs and to ensure continuity over the existing Copernicus Hubs. All interfaces are connected to the same database to guarantee consistency.

1. STAC product catalog

STAC data have become a de-facto standard in the EO community, also being onboarded to OGC at the moment. STAC items are provided for all online products, as well as for products generated by users within the Copernicus Data Space Ecosystem.

2. OData

OData is an SO/IEC approved, OASIS standard , which is based on http RESTful Application Programming Interfaces. It enables resources, which are identified by URLs and defined in a data model, to be created and edited using simple HTTP messages.

3. OpenSearch

The OpenSearch catalogue allows you to search through Copernicus data using a standardized web service. Search can be performed based on multiple attributes such as collection, spatial extent, time range, metadata. Orders can be based on the data collection, area, time range or any other selection criteria available in the search APIs

Catalog APIs news

This section provides detailed information about upcoming changes and the changelog of the implemented updates. The releases include all Catalog APIs interfaces. To avoid disruption to your scripts or apps, we recommend reviewing the upcoming changes and the latest release notes described below:

1.Upcoming Changes

We’ve put together a list of potential updates related to Catalog APIs as of September 2023. You can find a detailed comparison of these changes here.

2. Release notes

The release notes document provides you with a comprehensive list of modifications made to the Catalog APIs for every release.

Streamlined data access

1. Sentinel Hub API

Sentinel Hub is a multi-spectral and multi-temporal big data satellite imagery service, capable of fully automated archiving, real-time processing and distribution of remote sensing data and related EO products. Users can use its APIs to retrieve satellite data over their AOI and specific time range from full archives in a matter of seconds.

2. openEO API

With openEO’s collaborative nature, users can seamlessly share code, workflows, and data processing methods across platforms and tools, fostering collaboration and advancing the accessibility, scalability, and reproducibility of Earth observation data. Additionally, openEO provides intuitive programming libraries that enable easy analysis of diverse Earth observation datasets.

Additionally

1. Download products using S3

S3 API is one of the main access methods for EO data. It is suitable for Third Party applications that require high-performance parallel access and scalability. Moreover, any user who wants to connect from an external infrastructure to the Copernicus Data Space Ecosystem collection can do so through the S3 protocol.

2. Traceability API

Traceability service allows user to verify and register traces for user level data available in the Copernicus Data Space. The general design of the Traceability Service centers around a REST API service. Users may interact with Traceability API either directly using e.g. curl, or through the open source Traceability command line utility.

3. On-Demand Production API

On-demand processing capability for CARD-BS, CARD-COH6/12 is available on the Copernicus Data Space Ecosystem. This service is offered free to the use via a limited pool of resources, shared across all users, which can be used for processing the data free of charge. This is suitable for users who need to process smaller batches of products.

REST API

Get to know the Dataspace Connector’s REST API to automated resource handling.

If you haven’t already checked it out, please first take a look at the Dataspace Connector data model here. As mentioned there, the data model of the Connector is very modular. Relations between objects are predefined and via the REST API, a data offer can thus be created very dynamically. Individual objects can be detached from each other, attached to other objects, and modified at any time.

Overview of all available endpoints reduced to generic endpoints:

Method Endpoint Usage Returns
GET / Get the connector connector
POST /Ts Create a T
GET /Ts Get a list of all T Ts
GET /Ts/

Get a T T
PUT /Ts/

Change a T’s details
DELETE /Ts/

Remove a T
GET /Ts//Xs Get a T’s Xs Xs
POST /Ts//Xs Add Xs to the T
PUT /Ts//Xs Replace Xs of the T
DELETE /Ts//Xs Remove Xs from the T

CRUD endpoints allow the creation and modification of both individual entities and the relations between objects — starting from the child and the parent.

Swagger UI for creating offered resources:

Swagger API Offers

Swagger UI for adding offers to catalogs:

Swagger API Offers to Catalogs

Swagger UI for adding offers to catalogs:

Swagger API Catalog to Offers

As described here, the Dataspace Connector partly supports HATEOAS and returns correct response codes according to the HTTP1.1 standard (RFC 7231). The OpenApi documentation is provided within the repository and can additionally be created at runtime as explained here.

The entry point for the REST API is located at /api . From there, you can easily navigate through the data model.

REST API

The API supports pagination and each REST resource provides meta information about itself. This includes for example the self-link or parent and child information.

REST Example Offer

Copyright © 2021 Fraunhofer ISST.

Platform V DataSpace: пишем код на Java при помощи удобного SDK

Привет, Хабр! Продолжаем рассказывать, как быстро и просто создавать микросервисные приложения. В прошлой статье мы написали frontend с помощью Platform V DataSpace. В примере был использован TypeScript, но, как мы и говорили, это необязательное требование.

Теперь рассмотрим, как разрабатывать backend-приложения на языке Java с помощью сервиса Platform V Functions и инструмента DataSpace SDK.

Platform V Functions — это FaaS-решение, позволяющее загружать исходный код сервиса в виде функции в OpenShift/k8s без создания docker-образов и настройки окружения.

Но основное внимание в статье уделим даже не Functions, а DataSpace SDK. Это инструмент для удобного взаимодействия с DataSpace по протоколу JSON-RPC. По ходу статьи мы рассмотрим основные фичи, которые DataSpace SDK предоставляет Java-разработчику.

Приложение «Промоакция»

В качестве примера снова возьмём приложение «Промоакция» из предыдущей статьи.

Изменим архитектуру нашего приложения, разбив его на микросервисы. Теперь промокоды и подарки будут вестись раздельно разными сервисами, у каждого из которых будет свой DataSpace со своей моделью данных.

Архитектура приложения на этот раз будет выглядеть вот так:

Function 1 Vouchers — backend-сервис, отвечающий за ведение промокодов.

Function 2 Gifts — backend-сервис, отвечающий за ведение подарков.

Function 3 Report — backend-сервис, предоставляющий различные аналитические отчёты о подарках.

Разработка

Представим, что разработкой данного приложения занимаются два разработчика:

  • разработчик Vouchers реализует часть приложения, которая связана с управлением промокодами;
  • разработчик Gifts реализует часть приложения, которая связана с управлением подарками.

Для начала работы каждому разработчику нужно развернуть сервис DataSpace в своем пространстве в SmartMarket Studio. Подробнее о том, как это сделать, мы рассказывали здесь, в разделе «Как начать работу» в SmartMarket Studio.

У каждого DataSpace будет своя модель данных:

  • vouchers_model.xml — модель для DataSpace Vouchers;
  • gifts_model.xml — модель для DataSpace Gifts.

Voucher и Gift теперь имеют связь OneToOne. Но тип этой связи «из внешней системы», так как они находятся в разных моделях данных.

Итак, сервисы DataSpace развёрнуты. Теперь создадим заготовки для наших сервисов.

Разработчик Vouchers создаёт в своём пространстве соответствующую функцию:

Разработчик Gifts создаёт в своём пространстве функции Gifts Function, Reports Function:

Теперь разработаем «начинки» для функций — это будут хорошо известные всем Spring Boot приложения.

Сервис Voucher

Переходим на вкладку «Детали» и скачиваем инструмент DataSpace SDK — он был сгенерирован после развёртывания сервиса DataSpace Vouchers.

Создадим проект со стандартной структурой. Для удобства можно взять за основу шаблонный проект в одной из наших функций-заготовок. Для этого в действиях выбираем пункт «Экспортировать»:

При этом добавим в src/libs jar, полученный из скачанного ранее архива.

Также нам потребуется java-sdk-core для подписи REST-запросов при помощи ak/sk. Скачиваем его по ссылке, достаём из архива и добавляем в src/libs нашего проекта.

В pom.xml проекта необходимо добавить следующие зависимости:

Данная зависимость содержит служебные классы, сгенерированные под нашу модель данных. Это позволяет достичь строгой типизации при написании прикладного кода. sbp.com.sbt.dataspace m7063364230573391874-model-sdk 0.0.1 system $/src/libs/m7063364230573391874-model-sdk-0.0.3.jar  Зависимости необходимые для работы DataSpace SDK org.apache.httpcomponents httpclient  io.projectreactor.netty reactor-netty  org.springframework spring-webflux  org.apache.commons commons-lang3  com.google.guava guava 26.0-jre  io.grpc grpc-stub 1.39.0  com.google.protobuf protobuf-java 3.15.8  Зависимость нужна для осуществления подписи REST-запросов при помощи ak/sk sbp.ts.faas java-sdk-core 3.1.2 system $/src/libs/java-sdk-core-3.1.2.jar  Зависимость необходимая для работы java-sdk-core joda-time joda-time 2.10.3 

Сервис Vouchers будет предоставлять REST API, который принимает на вход промокод и тип подарка. В ответ он отдаёт сообщение с информацией о результате бронирования подарка.

Определим API в нашем контроллере:

@RestController public class VouchersController < @Autowired private VouchersService vouchersService; @RequestMapping(value = "/getGiftByPromoCode") public ResponseEntitygetGiftByPromoCode(@RequestParam String voucherCode, @RequestParam String giftKind) < return ResponseEntity.ok() .contentType(MediaType.TEXT_PLAIN) .body(vouchersService.getGift(voucherCode, giftKind)); >>

Перейдём к конфигурации. Определим инстансы DataspaceCorePacketClient и DataspaceCoreSearchClient. Нам понадобится адрес сервиса DataSpace и ak/sk для авторизации на API gateway. Все эти значения мы получаем из соответствующих инфраструктурных переменных DATASPACE_URL, APP_KEY, APP_SECRET.

Также нам потребуется RestTemplate для осуществления вызовов к сервису Gifts:

@Configuration public class Config < @Value("$") private String dataSpaceUrl; @Value("$") private String appKey; @Value("$") private String appSecret; @Bean public RestTemplate restTemplate() < return new RestTemplate(); >@Bean public DataspaceCoreSearchClient searchClient() < return new DataspaceCoreSearchClient(dataSpaceUrl, DataspaceSdkApiClientConfiguration.of(builder ->builder .setApiGatewayConfiguration(AKSKApiGatewayConfiguration.of(appKey, appSecret)) ) ); > @Bean public DataspaceCorePacketClient packetClient() < return new DataspaceCorePacketClient(dataSpaceUrl, DataspaceSdkApiClientConfiguration.of(builder ->builder .setApiGatewayConfiguration(AKSKApiGatewayConfiguration.of(appKey, appSecret)) ) ); >

Также нам понадобятся:

  • адрес проекта;
  • appKey;
  • appSecret.

Найти эти значения можно в настройках проекта:

В конфигурационном файле config.yaml определим необходимые настройки:

gifts.url: https://gw-ift-sm.pv-api-test.sbc.space/fn_fa969687_4694_4b3e_a871_5g42q56he710 gifts.appKey: d9ad1de7d38f493793c407061dc1111e gifts.appSecret: a418e8315cf0222fbf4784811fe3dc8a

Перейдём к реализации VoucherService.

Алгоритм заказа подарка по промокоду будет выглядеть так:

  1. Запрос клиента поступает с фронта в сервис Vouchers, который выполняет валидацию промокода.
  2. Если валидация прошла успешно, сервис Vouchers вызывает сервис Gifts по REST.
  3. Сервис Gifts должен найти подходящий подарок и забронировать его либо вернуть ответ, содержащий информацию о том, что доступные подарки отсутствуют.
  4. Сервис Vouchers получает идентификатор подарка, привязывает его к промокоду и отправляет ответ с серийным номером подарка и наименованием компании клиенту.
  5. Если подарок не был найден, сервис отправляет соответствующий ответ клиенту:
 public String getGiftByPromoCode(String code, String giftKind) < try < String voucherId = verifyPromoCode(code); JsonNode giftResponse = getGift(giftKind, voucherId); JsonNode error = giftResponse.get("error"); if (error != null) < return error.textValue(); >updateVoucher(voucherId, giftResponse.get("giftId").textValue()); return "You have been given a gift from " + giftResponse.get("vendor") + ". Serial number: " + giftResponse.get("serialNumber"); > catch (Exception e) < LOG.error(e.getMessage()); return e.getMessage(); >>

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

Рассмотрим метод verifyPromoCode:

 public String verifyPromoCode(String code) throws SdkJsonRpcClientException < try < VoucherGet voucher = searchClient.getVoucher(voucherWith ->voucherWith .withCode() .withStatusForVoucherMain(StatusWithLinkable::withCode) .withGift() .setWhere(where -> where.codeEq(code))); if (voucher.getGift().getEntityId() != null || !voucher.getStatusForVoucherMain().getCode().equals(VoucherVoucherMainStatus.OPEN.getValue())) < throw new GiftAlreadyIssuedException(code); >return voucher.getObjectId(); > catch (ObjectNotFoundException objectNotFoundException) < throw new VoucherNotFoundException(code); >>

Метод DataspaceCoreSearchClient#getVoucher из состава DataSpace SDK позволяет построить в типизированном формате запрос к сервису DataSpace Vouchers.

В лямбда-выражении мы указываем спецификацию с набором полей, которые хотим получить в ответе, а также задаём условие поиска.

Get-метод предполагает возникновение ObjectNotFoundException в случае, если по запросу ничего не нашлось.

Далее нужно убедиться, что у запрашиваемого промокода нет ссылки на уже полученный подарок, а статус — «ОТКРЫТ». В противном случае отправляем сообщение о том, что данный промокод уже был использован.

Мы провели валидацию промокода и получили его идентификатор, теперь нужно забронировать подходящий подарок.

В методе getGift вызовем сервис Gifts по REST. При этом подпишем наш запрос при помощи ключей ak/sk для корректной авторизации на ApiGateway:

 private JsonNode getGift(String giftKind, String voucherId) throws Exception < final String GET_GIFT_URL = giftsFunctionUrl + GET_GIFT_ENDPOINT; Request request = new Request(); request.setMethod("GET"); request.setBody(""); request.setKey(appKey); request.setSecret(appSecret); request.setUrl(GET_GIFT_URL); request.addQueryStringParam("voucherId", voucherId); request.addQueryStringParam("giftKind", giftKind); new Signer().sign(request); HttpHeaders requestHeaders = new HttpHeaders(); request.getHeaders().forEach((k, v) ->requestHeaders.put(k, Collections.singletonList(v))); String urlTemplate = UriComponentsBuilder.fromHttpUrl(GET_GIFT_URL) .queryParam("voucherId", "") .queryParam("giftKind", "") .encode() .toUriString(); Map params = new HashMap<>(); params.put("voucherId", voucherId); params.put("giftKind", giftKind); ResponseEntity response = restTemplate.exchange( urlTemplate, HttpMethod.GET, new HttpEntity<>(requestHeaders), JsonNode.class, params); return response.getBody(); >

В ответ получаем ошибку, которую пробрасываем на фронт, или атрибуты забронированного подарка.

Если мы получили положительный ответ от Gifts, нужно отметить, что обрабатываемый промокод использован и за ним закреплён подарок.

Рассмотрим метод updateVoucher:

 public void updateVoucher(String voucherId, String giftId) throws SdkJsonRpcClientException

Метод DataspaceCorePacketClient#execute оперирует объектами типа Packet. Packet является реализацией паттерна UnitOfWork. Все команды, содержащиеся в рамках одного Packet, выполняются в одной транзакции на стороне сервиса DataSpace.

Создаём объект Packet. При этом задаём параметр idempotencePacketId — таким образом мы наделяем Packet свойством идемпотентности.

IdempotencePacketId выступает ключом идемпотентности. Это означает, что на все последующие вызовы Packet c таким же ключом DataSpace вернёт результат, который был получен при первом успешном вызове. При этом сами операции изменения состояния БД выполнены не будут. В качестве ключа идемпотентности используем идентификатор сущности Voucher.

Добавляем в Packet команду update сущности Voucher. При этом указываем идентификатор сущности, а также значения полей, которые нужно установить.

Вызываем метод DataspaceCorePacketClient#execute, чтобы отправить запрос в DataSpace.

В методе getGiftByPromoCode отправляем на фронт сообщение о полученном подарке или ошибку.

Сервис Gifts

Скачиваем jar с DataSpace SDK, но на этот раз из сервиса DataSpace Gifts:

Создаём проект, подключаем зависимости точно так же, как и в случае с сервисом Vouchers:

Сервис Gift будет предоставлять REST API, который принимает на вход идентификатор промокода и тип подарка.

В ответ он отдаёт JSON, в котором содержится информация о забронированном подарке или ошибка.

Определим API в нашем контроллере:

@RestController public class GiftsController < @Autowired private GiftsService giftsService; @RequestMapping(value = "/getGift") public ResponseEntitygetGift(@RequestParam String voucherId, @RequestParam String giftKind) < return ResponseEntity.ok() .contentType(MediaType.APPLICATION_JSON) .body(giftsService.getGift(voucherId, giftKind)); >>

Определим инстансы DataspaceCorePacketClient и DataspaceCoreSearchClient. Получаем необходимые параметры из соответствующих инфраструктурных переменных DATASPACE_URL, APP_KEY, APP_SECRET.

@Configuration public class Config < @Value("$") private String dataSpaceUrl; @Value("$") private String appKey; @Value("$") private String appSecret; @Bean public DataspaceCoreSearchClient searchClient() < return new DataspaceCoreSearchClient(dataSpaceUrl, DataspaceSdkApiClientConfiguration.of(builder ->builder .setApiGatewayConfiguration(AKSKApiGatewayConfiguration.of(appKey, appSecret)) ) ); > @Bean public DataspaceCorePacketClient packetClient() < return new DataspaceCorePacketClient(dataSpaceUrl, DataspaceSdkApiClientConfiguration.of(builder ->builder .setApiGatewayConfiguration(AKSKApiGatewayConfiguration.of(appKey, appSecret)) ) ); > >

Перейдём к реализации GiftsService.

Рассмотрим основной метод GiftsService#getGift:

 public JsonNode getGift(String voucherId, String kind) < ObjectNode response = objectMapper.createObjectNode(); try < updateRequestCount(voucherId, kind); GraphCollectiongifts = searchClient.searchGift(giftWith -> giftWith .withKind() .withVendor(GiftVendorWithLinkable::withName) .withSerialNumber() .setWhere(where -> where .kindEq(GiftKind.valueOf(kind)) .and(where.voucherIsNull().or(where.voucherEq(voucherId))) ) ); if (gifts.isEmpty()) < LOG.error("Available gift not found"); response.put("error", "Available gift not found"); return response; >GiftGet gift = gifts.get(0); String giftId = gift.getObjectId(); Packet packet = new Packet(giftId); packet.gift.update(GiftRef.of(giftId), update -> update .setVoucher(VoucherReference.of(voucherId))); packetClient.execute(packet); response.put("giftId", giftId); response.put("vendor", gift.getVendor().getName()); response.put("serialNumber", gift.getSerialNumber()); > catch (IdempotencyException idempotencyException) < LOG.error(idempotencyException.getMessage()); return getGift(voucherId, kind); >catch (Exception exception) < LOG.error(exception.getMessage()); response.put("error", exception.getMessage()); >return response; >

Разберём его детально.

В сервисе Gifts помимо самих подарков и компаний ведётся сущность GiftRequestCounter, которая хранит количество поступивших запросов для каждого типа подарка.

Предполагается, что она будет использована в аналитических отчётах:

 private void updateRequestCount(String voucherId, String kind)

В методе updateRequestCount мы отправляем асинхронно запрос на увеличение счётчика GiftRequestCounter в сервис DataSpace Gifts.

Создаём Packet с ключом идемпотентности, состоящим из идентификатора промокода и типа подарка, чтобы избежать лишнего накручивания счётчика при ретраях.

В Packet добавляем команду UpdateOrCreate. Эта команда позволяет за один вызов проверить наличие сущности в БД и обновить её, а если сущности нет, то создать. Также мы добавляем команду update с установленным параметром на увеличение счётчика. Затем отправляем запрос асинхронно при помощи метода DataspaceCorePacketClient#executeAsync.

Далее в основном методе сервиса getGift производим поиск доступного подарка, используя метод DataspaceCoreSearchClient#searchGift:

 GraphCollection gifts = searchClient.searchGift(giftWith -> giftWith .withKind() .withVendor(GiftVendorWithLinkable::withName) .withSerialNumber() .setWhere(where -> where .kindEq(GiftKind.valueOf(kind)) .and(where.voucherIsNull().or(where.voucherEq(voucherId))) ) );

Если доступные подарки не были найдены, формируем ответ с ошибкой:

 if (gifts.isEmpty())

Если подходящие подарки нашлись, нам необходимо забронировать один из них, установив ссылку на соответствующий ваучер.

Снова воспользуемся функционалом DataspaceCorePacketClient. Создадим Packet и добавим в него команду на обновление сущности Gift.

Обратим внимание, что данный запрос мы выполняем идемпотентно, используя при этом в качестве ключа идентификатор подарка.

Данный подход позволяет нам не допустить ситуацию, в которой один и тот же подарок будет забронирован для нескольких разных ваучеров, а также избежать выполнения лишних операций при ретраях:

GiftGet gift = gifts.get(0); String giftId = gift.getObjectId(); Packet packet = new Packet(giftId); packet.gift.update(GiftRef.of(giftId), update -> update .setVoucher(VoucherReference.of(voucherId))); packetClient.execute(packet);

Сервис Reports

Перейдём к реализации сервиса, который предоставляет API для получения отчётов.

Данный сервис будет предоставлять отчёты о подарках, поэтому нам потребуется jar DataSpace SDK из сервиса DataSpace Gifts.

Создадим проект, добавим необходимую зависимость:

Реализуем API получения следующего отчёта:

Компания | тип подарка | кол-во подарков:

@RestController public class ReportController < @Autowired private ReportService reportService; @RequestMapping(value = "/getGiftsReport") public ResponseEntitygetGiftsReport() < return ResponseEntity.ok() .contentType(MediaType.APPLICATION_JSON) .body(reportService.getGiftsReport()); >>

Рассмотрим реализацию основного метода ReportService#getGiftsReport с применением DataSpace SDK:

 public JsonNode getGiftsReport() < ObjectNode response = objectMapper.createObjectNode(); try < SelectionWithselectionWith = GiftGraph.createSelection() .$withGroup("vendor", groupSelector -> groupSelector.none(giftGrasp -> giftGrasp.vendor().name())) .$withGroup("kind", groupSelector -> groupSelector.none(GiftGrasp::kind)) .$withGroup("giftsCount", groupSelector -> groupSelector.count(GiftGrasp::kind)) .$addGroupBy(groupBy -> groupBy.vendor().name()) .$addGroupBy(GiftGrasp::kind); GraphCollection selections = searchClient.selectionSearch(selectionWith); ArrayNode reportRows = objectMapper.createArrayNode(); selections.forEach(selection -> < ObjectNode objectNode = objectMapper.createObjectNode(); objectNode.put("vendor", selection.$getCalculated("vendor", String.class)); objectNode.put("kind", selection.$getCalculated("kind", String.class)); objectNode.put("giftsCount", selection.$getCalculated("giftsCount", Integer.class)); reportRows.add(objectNode); >); response.set("report", reportRows); > catch (SdkJsonRpcClientException e) < LOG.error(e.getMessage()); response.put("error", e.getMessage()); >return response; >

Конструкция SelectionWith позволяет построить запрос с группировками.

Метод $withGroup первым параметром принимает алиас поля, который будет отображён в результирующей выборке. Вторым параметром $withGroup принимает groupSelector, который позволяет указать выражение, на основе которого будут получены данные, будь то значение поля как оно есть или агрегирующая функция.

При помощи метода $addGroupBy мы добавляем поля, по которым будет выполнена группировка.

После формирования объекта SelectionWith выполняем вызов DataspaceCoreSearchClient#selectionSearch. Формируем JSON-ответ. Метод Selection#$getCalculated позволяет получить данные из объекта Selection, а также привести их к требуемому типу данных.

Публикация функций и тестирование

Приложения готовы, теперь необходимо упаковать каждое в zip-архив и загрузить в соответствующую функцию в SmartMarket Studio:

  • vouchers.zip
  • gifts.zip
  • report.zip

Затем жмём кнопку «Опубликовать» и ждём, пока функции задеплоятся.

После успешного деплоя на вкладке «Тестирование» мы можем проверить работоспособность наших API:

Итог

С помощью Platform V Functions и DataSpace SDK мы создали и развернули два полноценных микросервиса:

a) Ведение компаний-спонсоров и их подарков.

b) Аналитический учёт пользовательских запросов.

a) Ведение промоакций и ваучеров в рамках сервиса.

b) Резервирование подарков в рамках промоакций (интеграция с сервисом «Подарки»).

В следующих статьях подробнее раскроем фичи и возможности Platform V Functions и расскажем, как ещё можно сократить время на разработку и реализовать микросервисный подход, используя инструменты Platform V.

  • Блог компании Сбер
  • Программирование
  • Микросервисы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *