Таблицы. Как вывести данные из удаленного источника (по API) в компоненте Таблица

Есть некая внешняя система, у которой есть API. Требуется вывести данные из этого API в таблицу.

1. Указываем в настройках таблицы в поле Источник API коды исходящего запроса API (можно несколько через запятую без пробелов). В базе это поле таблицы as_crud_tables requestGetItems nvarchar(512).

2. Реализуем исходящий вызов /asapi 

Пример запроса Request: 

CREATE PROCEDURE [dbo].[api_falconUpdates_request]
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2)
	@username nvarchar(32)  -- текущий пользователь.
AS
BEGIN
	-- SELECT 1  Msg, Result, Url (адрес, куда будет идти запрос)
	select '' Msg, 1 Result, 'https://falconspace.ru/api/action/updates?typeID=2' Url

	-- SELECT 2 PARAMETERS - параметры, которые будут передаваться во внешний источник
	select 1
    --select 'id' name, '5' value, '' [type] -- form (в форме передается), header (в http headers), get запросы передавайте прямо в URL
END

Все параметры, которые передавались в GetItems таблицы передаются в параметре @parameters этой процедуры

Response процедура без изменений: 

CREATE PROCEDURE [dbo].[api_falconUpdates_response]
	@response nvarchar(max),
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2 - те же что и на request)

	@username nvarchar(32)
AS
BEGIN
	-- SELECT 1
	select '' Msg, 1 Result, @response Response
	-- SELECT 2 Внешние действия
END

Проверяем, что запрос отрабатывает хорошо через ссылку для этого элемента (/api/req/{code}).

3. Делаем GetItems для таблицы: 

CREATE PROCEDURE [dbo].[crud_tst-remotetable_getItems]
	@filters ExtendedDictionaryParameter READONLY,   -- ВАЖНО обязательно именно тип ExtendedDictionaryParameter (Key, Value2)
	@sort sql_variant,
	@direction nvarchar(8),
	@page int,
	@pageSize int,
	@username nvarchar(32)
AS
BEGIN
	declare @result TABLE(
		id nvarchar(max),
		name nvarchar(max),
		[desc] nvarchar(max),
		typeID nvarchar(max),
		created nvarchar(max),
		isMain nvarchar(max),
		link nvarchar(max),
		techChange nvarchar(max)
	)
	-- извлекаем ответ api запроса с кодом falconUpdates
	declare @falconUpdatesJSON nvarchar(max)
	select @falconUpdatesJSON = Value2 from @filters where [Key] = 'falconUpdates'

--Пример ответа: set @falconUpdatesJSON = '
--{"errorCode":0,"data":[{"id":1375,"name":"Доработка механизма обрезки фото (для thumb варианта фото) ","desc":"","type":"Исправление ошибки","created":"2020-05-17T09:22:32.977","isMain":false,"link":"","techChange":null},{"id":1362,"name":"Дерево. Поправлен момент с работой редиректа и выпадающем меню по пункту","desc":"","type":"Исправление ошибки","created":"2020-05-06T19:14:55.46","isMain":false,"link":"","techChange":null},{"id":1360,"name":"Исправлен момент с пейджингом в каталогах Lists","desc":"","type":"Исправление ошибки","created":"2020-05-06T16:55:47.803","isMain":false,"link":"","techChange":null},{"id":1359,"name":"Поправлен момент взаимодействия модального окна и popover окна (в быстром добавлении для таблиц)","desc":"","type":"Исправление ошибки","created":"2020-05-06T16:00:49.217","isMain":false,"link":"","techChange":null},{"id":1347,"name":"Исправлена ошибка с изменением статусов в Канбан доске","desc":"","type":"Исправление ошибки","created":"2020-04-22T11:44:51.287","isMain":false,"link":"","techChange":null},{"id":1345,"name":"Исправлена ошибка в параметрах импорта + добавлен параметр itemID для импорта/экспорта","desc":"","type":"Исправление ошибки","created":"2020-04-21T12:49:48.353","isMain":false,"link":"","techChange":null},{"id":1341,"name":"Исправлена критичная ошибка с фильтрами таблицы","desc":"Если были установлены на странице 2 таблицы с разными фильтрами, фильтры одной таблицы влияли на другую (JS ошибка). ","type":"Исправление ошибки","created":"2020-04-19T11:11:11.263","isMain":false,"link":"","techChange":null},{"id":1338,"name":"Уточнение логики по полю формы типа Таймер","desc":"Возможность перезапуска поля, исправление учета code и itemID в as-timer","type":"Исправление ошибки","created":"2020-04-17T21:41:04.297","isMain":false,"link":"","techChange":null},{"id":1329,"name":"Поправлено сохранение одиночного поля для поля формы Набор чекбоксов","desc":"","type":"Исправление ошибки","created":"2020-04-10T14:04:02.38","isMain":false,"link":"","techChange":null},{"id":1327,"name":"Правка ошибки в Метриках (boards)","desc":"","type":"Исправление ошибки","created":"2020-04-02T20:47:23.627","isMain":false,"link":"","techChange":null},{"id":1314,"name":"Выгрузка таблицы в Excel - удаление тегов html и поправлена граница таблицы","desc":"","type":"Исправление ошибки","created":"2020-03-30T15:46:03.927","isMain":false,"link":"","techChange":null},{"id":1313,"name":"Исправлена неточность при печати таблицы (добавлена перезагрузка страницы)","desc":"","type":"Исправление ошибки","created":"2020-03-30T15:44:43.24","isMain":false,"link":"","techChange":null},{"id":1312,"name":"Исправлена ошибка работы скриптов после экспорта таблицы в Excel","desc":"","type":"Исправление ошибки","created":"2020-03-30T15:43:56.543","isMain":false,"link":"","techChange":null},{"id":1308,"name":"Исправлена ошибка с сохранением HTML через inline edit в таблице","desc":"","type":"Исправление ошибки","created":"2020-03-25T16:04:09.103","isMain":false,"link":"","techChange":null},{"id":1297,"name":"Исправлена ошибка пагинации вложенной таблицы","desc":"","type":"Исправление ошибки","created":"2020-03-13T10:52:02.697","isMain":false,"link":"","techChange":null},{"id":1295,"name":"Исправлен момент по перекрытию контекстных  форм и модальных окон","desc":"","type":"Исправление ошибки","created":"2020-03-11T13:14:25.17","isMain":false,"link":"","techChange":null},{"id":1274,"name":"Исправлена критичная ошибка в файловом менеджере при аплоде","desc":"","type":"Исправление ошибки","created":"2020-02-19T22:43:04.627","isMain":true,"link":"","techChange":"В панели управления код файлового менеджера (uploadsadmin) - строчными буквами"},{"id":1268,"name":"Обновлена либа Newtonsoft.JSON","desc":"Системное изменение, обязательно при обновлении ядра внести изменения в web.config","type":"Исправление ошибки","created":"2020-02-16T12:27:33.45","isMain":false,"link":"","techChange":"При обновлениях ядра заменить JSON либу в WebConfig \\n        \\n        \\n\\t\\t\\n\\t\\t"},{"id":1263,"name":"Исправлена проблема русских букв в URL (при приведении в нижний регистр)","desc":"","type":"Исправление ошибки","created":"2020-02-13T10:37:41.677","isMain":false,"link":"","techChange":null},{"id":1257,"name":"Исправлен момент по совместному использованию модальной формы и всплывающей формы","desc":"","type":"Исправление ошибки","created":"2020-02-06T11:54:58.187","isMain":false,"link":"","techChange":null}],"outputType":"json","result":true,"msg":""}
--'
	insert into @result
    SELECT *
    FROM OPENJSON(@falconUpdatesJSON, '$.data')
    WITH (
            id int '$.id',
            name nvarchar(512) '$.name',
            [desc] nvarchar(max) '$.desc',
            [type] nvarchar(512) '$.type',
            created nvarchar(512) '$.created',
            isMain nvarchar(512) '$.isMain',
            link nvarchar(512) '$.link',
            techChange nvarchar(512) '$.techChange'
        )
	-- 1 SELECT - сами данные
	select * from @result
	order by  id desc
	OFFSET @PageSize * (@Page - 1) ROWS
	FETCH NEXT @PageSize ROWS ONLY;

	-- 2 SELECT - кол-во в таблице
	select count(*) from @result

END

 Примечание: 

  • Обязательно используем ExtendedDictionaryParameter для параметра @filters.
  • Отклик от каждого запроса API хранится в @filters с кодом этого запроса. 
  • В примере мы обрабатываем отклик в JSON. Чтобы это корректно работало, уровень совместимости SQL должен быть не ниже 130
  • В API метод request передается параметр caller  - в нем указывается вызывающий объект в виде table-{code} или form-{code} (если это форма)
--Как узнать уровень совместимости SQL Server?
SELECT compatibility_level, *
FROM sys.databases --WHERE name = 'dbName';

--Как установить уровень совместимости
ALTER DATABASE dbName
SET COMPATIBILITY_LEVEL = 130;

Подробнее - https://docs.microsoft.com/ru-ru/sql/t-sql/statements/alter-database-transact-sql-compatibility-level?view=sql-server-ver15

Хорошая статья про разбор JSON через SQL - https://habr.com/ru/post/343062/

В итоге компонент будет сначала собирать данные с внешних источников и передавать их в GetItems в коллекции @filters (каждый response находим по коду запроса API).  

Пример подобной таблицы https://falconspace.ru/tst-remotetable

Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Falcon Space

Это снижение стоимости владения

за счет меньшего количества людей для поддержки и узкого стека разработки. Про снижение стоимости владения продуктом

Это быстрое внесение изменений

по ходу эксплуатации программы. Как создается функционал на платформе

Это простой удобный интерфейс

адаптация под мобильные устройства. Про юзабилити платформы

Нужна бесплатная консультация?
Получить оценку проекта
Создайте концепцию проекта на основе нашего шаблона и получите оценку проекта в виде КП.
Демо-сайт решений
Базисные решения, которые можно гибко адаптировать под себя: менять внешний вид, бизнес-логику и даже структуру базы данных.