Введение

Версия 1.11

Сервер SH5WAPI2 предоставляет возможность получать и передавать информацию на сервер StoreHouse5 посредством файлов формата JSON (www.json.org) через протокол HTTP.

Сервер StoreHouse5 общается с внешним миром исключительно с помощью процедур, идентифицируемых по имени. Процедура в качестве параметров принимает датасеты (таблицы) и в ответ заполняет их запрошенной информацией. Дататсеты SH5 могут быть однострочными и многострочными.

Доступные операции:

    • Запросить настройки сервера и информацию о БД: /api/sh5info

    • Запросить наличие прав на выполнение процедуры: /api/sh5able

    • Изменить свой пароль: /api/sh5pass

    • Информация о лицензии: /api/sh5lic

    • Запросить список датасетов процедуры: /api/sh5struct

    • Выполнить процедуру: /api/sh5exec

    • Cоздать атрибутное поле: /api/sh5CreateAttr

    • Запросить значения перечислимого атрибута: /api/sh5enum

    • Работа с пользователями: /api/sh5user

    • Работа с ролями: /api/sh5role

По указанным путям надо выполнять POST-запросы с передачей в Content JSON-файла с параметрами запроса. Файлы JSON должны быть в кодировке UTF-8. Пример запроса:

{ "UserName": "Admin", "Password": "12345", "procName": "XDivisions" }
  • UserName (string)- имя пользователя StoreHouse5

  • Password (string)- пароль пользователя StoreHouse5

  • procName (string)- название процедуры StoreHouse5

UserName и Password являются обязательными во всех запросах. Параметр procName присутствует в запросах на /api/sh5struct и /api/sh5exec.

В результате выполнения запроса будет прислан ответный JSON-файл. Пример ответа:

{
 "errorCode": 1, 
 "errMessage": "Процедура XDivisions не найдена.", 
 "Version": "1.1", 
 "UserName": "Admin", "actionName": "XDivisions", "actionType": "Structure", 
 "errorInfo": { "moduleId": 1, "moduleName": "SDBCLI.DLL", "errorId": 194 }
}
  • errorCode (number)- признак наличия ошибки (0/1).

  • errMessage (string)- текст ошибки

  • Version (string)- версия сервера SH5WAPI2

Эти три значения приcутствуют в любом ответе от сервера.

  • UserName (string) - переданное в запросе имя пользователя

В случае успешного выполнения запроса errorCode будет равен 0. В случае ошибки значение errorCode будет равно 1, и будет присутствовать объект errorInfo с дополнительной информацией об ошибке:

  • moduleId (number) - идентификатор модуля, из котрого поступила ошибка [0..5]

  • moduleName (string) - название модуля, из котрого поступила ошибка

  • errorId (number) - код ошибки, свой у каждого модуля

Возможные значения moduleId:

  • 0 - BRISH.DLL, errorId всегда равен 0

  • 1 - SDBCLI.DLL, наиболее частые значения errorId:

    • 150 - Неверно указано имя пользователя или пароль

    • 194 - Указанная процедура не существует

    • 2102 - нет связи с сервером SH5 через локальный протокол

    • 2205 - нет связи с сервером SH5 через TCP/IP

  • 2 - DOMM.DLL

  • 3 - MSDSET.DLL

  • 4 - SHSRV64.DLL, коды ошибок: https://docs.rkeeper.ru/pages/viewpage.action?pageId=19612474

  • 5 - SH5WAPI2, errorId всегда равен 1

GZIP

Начиная с версии 1.8.3 Если в запросе присутствует заголовок

Accept-Encoding: gzip

и размер ответа превышает 32kb, то ответ возвращается упакованным в gzip и с заголовком

Content-Encoding: gzip

Более того, с версии 1.11 ответы, превышающие 10 MB в обязательном порядке пакуются в gzip.

Запрос настроек сервера и информации о БД

Запросы посылаются по пути /api/sh5info

Чтобы узнать, с каким именно сервером StoreHouse5 происходит работа, надо послать запрос на этот адрес без какого-либо JSON. При этом допускается использование не только метода POST, но и GET. Благодаря этому выполнить его можно даже из браузера, что бывает удобно для быстрой проверки наличия сервера WebAPI.
Пример ответного JSON:

     { 
       "errorCode": 0, "errMessage": "OK", "Version": "0.5", "LinkType": 0, 
       "Server": "SDBSERV", "LinkDisp": "(local) SDBSERV"
     }

Или такой ответ:

{
  "errorCode": 0, "errMessage": "OK", "Version": "0.5", "LinkType": 1, 
  "Host": "127.0.0.1", "Port": 7771, "LinkDisp": "(tcp/ip) 127.0.0.1:7771"
}
  • LinkType (number)- 0-подключение локальное; 1-подключение через TCP/IP.

  • Server (string)- присутствует только для локального подключения - имя сервера SH5

  • Host (string) - присутствует только для TCP/IP - компьютер, где запущен сервер SH5

  • Port (number) - присутствует только для TCP/IP и если порт не стандартный

  • LinkDisp (string)- строка с текстовым описанием параметров подключения

Если по этому же пути выполнить POST-запрос с вложенным JSON с указанием логина и пароля, то сервер WebAPI подключится к серверу StoreHouse и добавит в ответ информацию о БД.

Запрос:

{ "UserName": "Admin", "Password": "12345" }

Ответ:

{
 "errorCode": 0, "errMessage": "OK", "Version": "0.5", "UserName": "Admin", 
 "LinkType": 0, "Server": "SRV1", "LinkDisp": "(local) SRV1", 
 "DB": 
 {
  "Ident": "3BDCC5D0", "Size": "300MB", "Version": "5.27"
 }
}
  • Ident (string) - уникальный идентификатор БД

  • Size (string) - текущий размер файла БД

  • Version (string) - версия БД

Запросить наличие прав на выполнение процедур

Запрос посылается по пути /api/sh5able
Пример запроса:

{
  "UserName": "Admin", "Password": "12345",
  "procList": ["Divisions", "Goods", "XYZ", "Departs", "BGoodsCategories"]
}
  • procList (массив) - список процедур StoreHouse5

Пример ответа:

	{ 
	 "errorCode": 0, "errMessage": "OK", "Version": "1.1", "UserName": "Admin",
	 "procList": ["Divisions", "Goods", "XYZ", "Departs", "BGoodsCategories"],
	 "allow": [true, true, false, true, true]
	}
  • allow (массив) - наличие у пользователя права на выполнение соответствующей процедуры

Изменить пароль

Запрос посылается по пути /api/sh5pass
Пример запроса:

{ "UserName": "Admin", "Password": "12345", "newValue": "ABCxyz123" }
  • newValue (string) - новый пароль

Пример ответа:

	{ 
	 "errorCode": 0, "errMessage": "OK", "Version": "1.2", "UserName": "Admin"
	}

Информация о лицензии

Запрос посылается по пути /api/sh5lic
Пример запроса:

{"UserName": "Admin","Password": "12345"}

Пример ответа:

	{ 
	 "errorCode": 0, "errMessage": "OK", "Version": "1.4", "UserName": "Admin",
	 "license":
	 [
		{ "type": 56, "count": 1, "expDate": "2019-02-13",
        "objectId": 199990044, "key": "E800921A" 
		},
		{ "type": 58, "count": 3, "expDate": "2019-01-27", 
		"objectId": 199990044, "key": "E800921A" 
		},
		{ "type": 260, "count": 1, "expDate": "2019-03-22", 
		"objectId": 199990044, "key": "E800921A" 
		}
	 ]	
	}
  • license (массив) - список лицензий, имеющихся в БД StoreHouse5

Каждая лицензия содержит следующую информацию:

  • type (number) - SoftCode лицензии

  • count (number) - кол-во лицензий этого вида

  • expDate (string) - строк действия лицензии

  • objectId (number) - идентификатор объекта

  • key (string) - идентификатор виртуального ключа

Запрос списка датасетов процедуры

Запрос посылается по пути /api/sh5struct

JSON запроса содержит только три параметра: UserName, Password, procName. Пример запроса:

{ "UserName": "Admin", "Password": "12345", "procName": "Divisions" }

Ответ содержит элементы:

  • UserName (string) - переданное имя пользователя

  • actionName (string) - название процедуры StoreHouse5

  • actionType (string) - «Structure»- запрошенная операция

  • shTable (массив) - список объектов «структура таблицы»

массив элементов «структура таблицы».

Объект «структура таблицы» содержит следующие элементы:

  • head (String) - идентификатор таблицы

  • SingleRow (Bool) - однострочный датасет (true) или многострочный (false)

  • fields (массив) - список объектов «поле таблицы»

Объект «поле таблицы» содержит следующие элементы:

  • path (String) - оригинальное имя поля

  • type (String) - тип поля

  • size (String) - размер поля

  • alt (String) - необязательный, альтернативное имя поля

Пример успешного ответа:

{ 
 "errorCode": 0, "errMessage": "OK", "Version": "1.1", "UserName": "Admin",
 "actionName": "Divisions", "actionType": "Structure", 
 "shTable": 
 [
  {
   "head": "103", "SingleRow": false, 
   "fields": 
   [
    {     "path": "1", "type": "tUint32", "size": 4, "alt": "Rid"    }, 
    {     "path": "4", "type": "tGuid", "size": 16, "alt": "Guid"    }, 
    {     "path": "3", "type": "tStrZ", "size": 255, "alt": "Name"    }, 
    {     "path": "7\\$Qush", "type": "tStrP", "size": 0    }, 
    {     "path": "7\\$PDocNum", "type": "tStrP", "size": 0    }, 
    {     "path": "7\\$IDocNum", "type": "tStrP", "size": 0    }, 
    {     "path": "7\\$GDocNum", "type": "tStrP", "size": 0    }, 
    {     "path": "7\\Chef", "type": "tStrP", "size": 0    }
   ]
  }, 
  {
   "head": "103#1", "SingleRow": true,
    "fields": 
   [
    {     "path": "239", "type": "tUint32", "size": 4, "alt": "MaxCount"    }, 
    {     "path": "240", "type": "tUint32", "size": 4    }
   ]
  }
 ]
}

Выполнение процедуры

Запрос посылается по пути /api/sh5exec. Передача данных в процедуру осуществляется через параметр «Input». Либо, для совместимости со старой версией, через параметр «dsParams». Второй метод устарел и в будущем может быть исключён.

Параметр «Input» (массив) содержит список объектов «таблица с данными».

Параметр «dsParams» (объект) содержит объекты «поле с данными», при этом допускаются только альтернативные названия полей .

Ответ содержит массив элементов «таблица с данными».

Типы «tShortDate» и «tLongDate» должны передаваться в формате «yyyy-mm-dd». И если в ответе есть такие типы данных, то они будут именно в этом формате.

Тип «tGuid» должен передаваться в формате «{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}».

Типы «tBinary» и «tBtData» передаются в HEX формате. Например, если требуется поместить двухбайтное целое (WORD) равное 2687 в такое поле: «7F0A». А если строку «William Shakespeare» с указанием байта длины перед ней: «1357696c6c69616d205368616b65737065617265»

Объект «таблица с данными» содержит следующие элементы:

  • head (String) - идентификатор таблицы

  • original - массив оригинальных названий полей (string)

  • fields - массив альтернативных названий полей (string)

  • values - массив, содержащий массивы значений полей.

  • status - необязательный, массив статусов записей (string)

Пример запроса с параметром «Input»:

{
 "UserName": "Admin", "Password": "", "procName": "GDoc0", 
 "Input": 
 [
  { "head": "111", "original": [ "1" ], "values": [ [ 3 ] ] }
 ]
}

Некоторые процедуры для модификации/удаления записи в таблице требуют передачи её статуса. В этом случае в объект «таблица с данными» надо добавлять массив «status», в котором перечислить нужные статусы для каждой записи. Возможные варианты: «Insert», «Modify», «Delete». По умолчанию все записи получают статус «Insert».

Пример запроса со статусами записей:

{
 "UserName": "Admin", "Password": "", "procName": "ModCountries", 
 "Input": 
 [
  {"head": "231", 
   "original": [ "1", "2", "3" ], 
   "values": 
   [
    [ 1, null, 8 ], 
    [ "643", "UTO", "NET" ], 
    [ "Россия", "Утопия", "Нетландия" ]
   ], 
   "status": [ "Modify", "Insert", "Delete" ]
  }
 ]
}

Объект «поле с данными» - это массив, содержащий значения поля для всех записей таблицы. Пример запроса с параметром «dsParams»:

{ 
 "UserName": "Admin","Password": "",
 "procName":"CntrSpecs",
 "dsParams":
 { "contractorRid":["2"] }
}

Создать атрибутное поле

Добавлено в версии 1.8

Запрос посылается по пути /api/sh5CreateAttr

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

{ "UserName": "Admin", "Password": "12345", "bob": "aTable_Attrs",
  "ident": "UserComment", "caption": "Комментарий пользователя", 
  "type": "tStrP" }
  • bob (string) - Идентификатор контейнера (SdbMan: Обслуживание - Статистика - Поля бин.объектов)

  • ident (string) - Идентификатор создаваемого поля

  • caption (string) - Заголовок создаваемого поля

  • type (string) - Тип поля. Поддерживаются только такие: («tInt32», «tInt64», «tDouble», «tLongDate», «tStrP» )

Пример ответа:

   { "errorCode": 0, "errMessage": "OK", "Version": "1.8", "UserName": "Admin"	}

Запросить значения перечислимого атрибута

Добавлено в версии 1.10

Запрос посылается по пути /api/sh5enum

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

{"UserName": "Admin", "Password": "12345", "head": "111", "path": "6\\Otvets"}
  • head (String) - идентификатор таблицы

  • path (String) - имя поля атрибута перечислимого типа

Пример ответа:

{ 
 "errorCode": 0, "errMessage": "OK", "Version": "1.10", "UserName": "Admin",
 "actionType": "enum", "head": "111", "path": "6\\Otvets",
 "idents": [0, 1, 2, 5],
 "values": ["Вася", "Лена", "Ира", "Евгений Петрович"]
}
  • ident - список целочисленных идентификаторов

values - список текстовых значений

Работа с пользователями

добавлено в версии 1.12

Запрос посылается по пути /api/sh5user. Необходимое действие указывается в параметре «actionName». Передача входных данных осуществляется через параметр «Input». Параметр «Input» (массив) содержит список объектов «таблица с данными» (см. /api/sh5exec).

Создать нового пользователя

Запрос:

{"UserName": "Admin", "Password": "", "actionName": "Create", 
 "Input": 
 [
  { "head": "User", 
    "original": [ "Name", "Psw" ], 
    "values": [ [ "n.romanoff" ], [ "secret" ] ] 
  }
 ]
}

В однострочной таблице «User» передаются параметры:

  • Name - логин создаваемого пользователя

  • Psw - пароль для создаваемого пользователя

Поменять пароль пользователя

Запрос:

{"UserName": "Admin", "Password": "", "actionName": "SetPsw", 
 "Input": 
 [
  { "head": "User", 
    "original": [ "Name", "Psw" ], 
    "values": [ [ "n.romanoff" ], [ "secretNew" ] ] 
  }
 ]
}

Удалить пользователя

Запрос:

{"UserName": "Admin", "Password": "", "actionName": "Delete", 
 "Input": 
 [
  { "head": "User", 
    "original": [ "Name" ], 
    "values": [ [ "n.romanoff" ] ] 
  }
 ]
}

Список системных привилегий (номера бит)

  • 0 - право создавать пользователя

  • 1 - право читать список пользователей

  • 2 - право читать информацию о правах пользователя

  • 3 - право изменять пароль любого пользователя

  • 4 - право изменять пароль самому себе

  • 5 - право удалять пользователя

  • 6 - право создавать/модифицировать роль

  • 7 - право читать список ролей

  • 8 - право читать информацию о правах роли

  • 9 - право назначать роли пользователям

  • 10 - право удалять роль

  • 11 - право изменять системный словарь,

  • 12 - право получать статистику по серверу

  • 13 - право делать проверку файла БД

  • 14 - право делать проверку файла БД с исправлением ошибок

  • 15 - право делать резервное копирование

  • 16 - право восстанавливать БД из архива (при загруженном файле БД)

  • 17 - право создавать новую БД (при загруженном файле БД)

  • 18 - право читать и изменять размер файла БД

  • 19 - право читать список соединений

  • 20 - право завершать чужие соединения

Получить список пользователей

Запрос:

  {"UserName": "Admin", "Password": "", "actionName": "List"}

Пример ответа:

{
 "errorCode": 0, "errMessage": "OK", "Version": "1.12", "UserName": "Admin", 
 "shTable": 
 [
  {
   "head": "User", 
   "original": 
   ["Name", "Type", "WinError", "SysPrivs", "SysGrant", "Rid"], 
   "values": 
   [
    ["Petrov", "n.romanoff", "elena", "Ivanov", "Admin"], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 4294967295], 
    [0, 0, 0, 0, 4294967295], 
    [2, 3, 4, 1, 0]
   ]
  }
 ]
}

Описание полей таблицы:

  • Name (tStrP) Имя пользователя

  • Type (tUint8) Тип аутентификации (0 - sdbserv; 1 - Windows(enabled); 2 - Windows(disabled))

  • WinError (tUint32) Win32Error при типе аутентификации НЕ sdbserv (значение 0 значит ОК)

  • SysPrivs (tUint32) Битовая маска системных привилегий

  • SysGrant (tUint32) Маска прав на назначение другим пользователям системных привилегий

  • Rid (tUint16) Уникальный идентификатор пользователя

Изменить права пользователя

Запрос:

{
 "UserName": "Admin", "Password": "", "actionName": "SetPrivs", 
 "Input": 
 [
  { "head": "User", 
    "original": ["Name", "SysPrivs", "SysGrant", "RoleMask", "RoleGrant"], 
    "values":  [ ["n.romanoff" ], [ 255 ], [ 2 ], [ 13 ], [ 0 ] ]
   },
   { "head": "Procedures", 
     "original": ["Name", "Flags" ], 
     "values": 
   [ 
   [ "ModEInv1", "MissEMarks", "ModEInv0", "EMarkPresent", 
     "EInv1", "EInv0", "DelEInv", "EInvents" ],
   [  1, 3, 1, 1, 
      1, 1, 0, 3 ]
   ]
   }
 ]
}

Поля таблицы User:

  • SysPrivs (tUint32) Битовая маска системных привилегий

  • SysGrant (tUint32) Маска прав на назначение другим пользователям системных привилегий

  • RoleMask (tUint32) Маска идентификаторов ролей

  • RoleGrant (tUint32) Маска идентификаторов грант опций для ролей

Поля таблицы Procedures:

  • Name (tStrZ) имя процедуры

  • Flags (tUint8):

0 - запретить процедуру для пользователя; 1 - разрешить процедуру для пользователя; 3 - разрешить процедуру для пользователя и выдать грант-опцию.

Получить права пользователя

Запрос:

{"UserName": "Admin", "Password": "", "actionName": "Read", 
 "Input": 
 [
  { "head": "User", 
    "original": [ "Name" ], 
    "values": [ [ "n.romanoff" ] ] 
  }
 ]
}

Пример ответа:

 
{
 "errorCode": 0, "errMessage": "OK", "Version": "1.12", "UserName": "Admin", 
 "shTable": 
 [
  {
   "head": "User", 
   "original": 
   ["Name", "SysPrivs", "SysGrant", "RoleMask", "RoleGrant" ], 
   "values": [["n.romanoff"], [33170], [0], [13], [0]]
  }, 
  {
   "head": "Roles",
   "original": 
   ["Name", "Type", "WinError", "SysPrivs", "Rid" ], 
   "values": 
   [
    ["Контролёр", "Аудитор", "Бухгалтер", "Все права", "PUBLIC"], 
    [ 0, 0, 0, 0, 0 ], 
    [ 0, 0, 0, 0, 0 ], 
    [ 0, 0, 0, 0, 0 ], 
    [ 4, 3, 2, 1, 0 ]
   ]
  }, 
  {
   "head": "Procedures", 
   "original": 
   ["Name", "RoleMask", "Flags"], 
   "values": 
   [
    ["DeleteGDocsRDoc", "CreateGDocsByRDocList", "ModPlanCorrs", 
     "SetRDocStatus", "PlanCorrs", "UDefContractors", "UpdUContractor", 
     "RplUContractor", "DelUContractor", "UContractor", "UContractors" ], 
    [ 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0 ],
    [ 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0 ]
   ]
  }
 ]
}

Список процедур в этом примере сильно сокращён, фактически их более 600.

Работа с ролями

добавлено в версии 1.12

Запрос посылается по пути /api/sh5role. Необходимое действие указывается в параметре «actionName». Передача входных данных осуществляется через параметр «Input». Параметр «Input» (массив) содержит список объектов «таблица с данными» (см. /api/sh5exec).

Получить список ролей

Запрос:

 
{"UserName": "Admin", "Password": "", "actionName": "List"}

Пример ответа:

 
{
 "errorCode": 0, "errMessage": "OK", "Version": "1.12", "UserName": "Admin", 
 "shTable": 
 [
  {
   "head": "Role", 
   "original": 
   [
    "Name", "Type", "WinError", "SysPrivs", "Rid"
   ], 
   "values": 
   [
    ["Контролёр", "Аудитор", "Бухгалтер", "Все права", "PUBLIC" ], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0], 
    [4, 3, 2, 1, 0]
   ]
  }
 ]
}

Описание полей таблицы:

  • Name (tStrP) Имя роли

  • Type (tUint8) Тип аутентификации (0 - sdbserv; 1 - Windows(enabled); 2 - Windows(disabled))

  • WinError (tUint32) Win32Error при типе аутентификации НЕ sdbserv (значение 0 значит ОК)

  • SysPrivs (tUint32) Битовая маска системных привилегий

  • Rid (tUint16) Уникальный идентификатор роли

Создать новую роль

Запрос:

 
{"UserName": "Admin", "Password": "", "actionName": "Create", 
 "Input": 
 [
  { "head": "Role", 
    "original": [ "Name" ], 
    "values": [ [ "Смотритель" ] ] 
  }
 ]
}

Удалить роль

Запрос:

{"UserName": "Admin", "Password": "", "actionName": "Delete", 
 "Input": 
 [
  { "head": "Role", 
    "original": [ "Name" ], 
    "values": [ [ "Смотритель" ] ] 
  }
 ]
}

Изменить права роли

Запрос:

{
 "UserName": "Admin", "Password": "", "actionName": "SetPrivs", 
 "Input": 
 [
  { "head": "Role", 
    "original": ["Name", "SysPrivs"], 
    "values":  [ ["Бухгалтер" ], [ 16 ]]
   },
   { "head": "Procedures", 
     "original": ["Name", "Flags" ], 
     "values": 
   [ 
    [ "ModEInv1", "MissEMarks", "ModEInv0", "EMarkPresent", 
      "EInv1", "EInv0", "DelEInv", "EInvents" 
    ],
    [  1, 0, 1, 1, 1, 1, 0, 1 ]
   ]
   }
 ]
}

Поля таблицы Role:

  • Name (tStrP) Имя роли

  • SysPrivs (tUint32) Битовая маска системных привилегий

Поля таблицы Procedures:

  • Name (tStrZ) имя процедуры

  • Flags (tUint8):

0 - запретить процедуру для роли; 1 - разрешить процедуру для роли;

Получить права роли

Запрос:

{"UserName": "Admin", "Password": "", "actionName": "Read", 
 "Input": 
 [
  { "head": "Role", 
    "original": [ "Name" ], 
    "values": [ [ "Бухгалтер" ] ] 
  }
 ]
}

Пример ответа:

{
 "errorCode": 0, "errMessage": "OK", "Version": "1.12", "UserName": "Admin", 
 "shTable": 
 [
  {
   "head": "Role", 
   "original": ["Name", "SysPrivs"], 
   "values": [ ["Бухгалтер"], [4112]]
  }, 
  {
   "head": "Procedures", 
   "original": 
   [ "Name", "Flags" ], 
   "values": 
   [
    [
     "ModDivBuyPlan", "DivBuyPlan", "DelGDoc9", "UpdGDoc9", "InsGDoc9", 
     "GDoc9", "CurrRates", "ModCurrencies", "Currencies"
    ], 
    [
      0, 0, 1, 1, 1, 1, 1, 1, 1
    ]
   ]
  }
 ]
}

Список процедур в этом примере сильно сокращён, фактически их более 600.