Оператор EXTERNAL
Оператор EXTERNAL - создание действия, выполняющего обращение к внешней системе.
Синтаксис
EXTERNAL externalCall [PARAMS paramExpr1, ..., paramExprN] [TO propertyId1, ..., propertyIdM]
externalCall - внешний вызов, задается одним из следующих синтаксисов:
HTTP [CLIENT] [requestType] connectionStrExpr httpOption1 ... httpOptionN
TCP [CLIENT] connectionStrExpr
UDP [CLIENT] connectionStrExpr
SQL connectionStrExpr EXEC execStrExpr
LSF connectionStrExpr lsfExecType execStrExpr
DBF connectionStrExpr APPEND [CHARSET charsetLiteral]
Опции для HTTP (в произвольном порядке, через пробел или переводы строк):
BODYURL bodyStrExpr
BODYPARAMNAMES bodyParamNameExpr1, ..., bodyParamNameExprK
BODYPARAMHEADERS bodyParamHeadersPropertyId1, ..., bodyParamHeadersPropertyIdK
HEADERS headersPropertyId
COOKIES cookiesPropertyId
HEADERSTO headersToPropertyId
COOKIESTO cookiesToPropertyId
NOENCODE
Описание
Оператор EXTERNAL создаёт действие, выполняющее одиночный вызов внешней системы. Тип вызова (HTTP, SQL, LSF, TCP, UDP, DBF) определяет используемый протокол или интерфейс; каждый тип принимает свой набор оговорок поверх общих списков PARAMS и TO.
Параметры
-
HTTP,TCP,UDP,SQL,LSF,DBFКлючевые слова. Задают тип внешнего вызова; семантика каждого описана в статье Обращение к внешней системе.
-
requestTypeКлючевое слово. Определяет метод HTTP-запроса:
POSTGETPUTDELETEPATCH
Значением по умолчанию является
POST. -
CLIENTКлючевое слово. Выполняет вызов на клиенте пользователя. Без
CLIENTвызов выполняется на сервере приложений. -
APPENDОбязательное ключевое слово в синтаксисе
DBF-вызова. -
charsetLiteralСтроковый литерал с кодировкой
.dbf-файла. По умолчаниюUTF-8. -
connectionStrExprВыражение.
HTTP: строка http-запроса.TCP/UDP:host:portцелевого сокета.SQL: строка подключения к СУБД.LSF: URL сервера приложений или веб-сервера lsFusion.DBF: путь к.dbf-файлу. -
bodyStrExprВыражение. Строка BODY с подстановкой параметров через
$N. Для HTTP-методов с телом все параметры, оставшиеся после подстановки в URL, должны быть использованы внутри этой строки, иначе вызов падает. ДляGETBODYURLне действует, а оставшиеся параметры молча отбрасываются. -
bodyParamNameExpr1, ..., bodyParamNameExprKСписок выражений. Каждое вычисляется в имя BODY-части в форме
'name'или'name;filename'(часть после;задаёт имя файла multipart-части). БезBODYPARAMNAMESчасти BODY получают автоматические именаparam0,param1, ... (файловые части без явного filename аналогично получаютfile0,file1, ...). -
bodyParamHeadersPropertyId1, ..., bodyParamHeadersPropertyIdKСписок идентификаторов свойств. Каждое свойство имеет один параметр строкового класса (имя заголовка) и значение строкового класса (значение заголовка). Без
BODYPARAMHEADERSдополнительные заголовки к частям BODY не добавляются. -
headersPropertyId,headersToPropertyIdИдентификаторы свойств. Каждое свойство имеет один параметр строкового класса (имя заголовка) и значение строкового класса (значение заголовка). Без
HEADERSсобственные заголовки запроса не устанавливаются; безHEADERSTOзаголовки ответа не сохраняются. -
cookiesPropertyId,cookiesToPropertyIdИдентификаторы свойств. Каждое свойство имеет один параметр строкового класса (имя cookie) и значение строкового класса (значение cookie). Без
COOKIESсобственные cookies не отправляются; безCOOKIESTOcookies не сохраняются. -
NOENCODEКлючевое слово. Отключает предварительное URL-кодирование литерального текста строки подключения и строки
BODYURL(значения параметров, подставляемых через$N, всё равно URL-кодируются отдельно). БезNOENCODEлитеральный текст URL-кодируется перед отправкой. -
lsfExecTypeКлючевое слово. Определяет способ задания действия:
EXEC- задается имя вызываемого действия.EVAL- задается код на языке lsFusion. Предполагается, что в этом коде присутствует объявление действия с именемrun, именно это действие и будет вызвано.EVAL ACTION- задается код действия на языке lsFusion. Для обращения к параметрам можно использовать спецсимвол$и номер параметра (начиная с1).
-
execStrExprВыражение.
SQL: SQL-команда(ы) — выражение, заканчивающееся на.sql, трактуется как путь к ресурсу classpath, содержимое которого используется как команда.LSF: имя действия или код, в зависимости отlsfExecType. -
paramExpr1, ..., paramExprNСписок выражений, значения которых будут использоваться в качестве параметров обращения.
-
propertyId1, ..., propertyIdMСписок идентификаторов свойств (без параметров), в которые будут записаны полученные результаты.
Примеры
externalHTTP() {
// HTTP-метод + TO для результата
EXTERNAL HTTP GET 'https://www.cs.cmu.edu/~chuck/lennapg/len_std.jpg' TO exportFile;
// BODYURL: второй и третий параметры уходят в url-encoded BODY через $N
EXTERNAL HTTP 'http://tryonline.lsfusion.org/exec?action=doSomething&someprm=$1'
BODYURL 'otherprm=$2&andonemore=$3' PARAMS 1, 2, '3';
// BODYPARAMNAMES в форме 'name;filename' + ручной Content-Type через HEADERS
LOCAL headers = TEXT(STRING[100]);
headers('Content-Type') <- 'multipart/form-data; charset=UTF-8';
EXTERNAL HTTP POST 'https://api.example/upload'
BODYPARAMNAMES 'document;report.pdf'
HEADERS headers
PARAMS exportFile();
// HEADERSTO / COOKIESTO: захват заголовков и cookies ответа
LOCAL respHeaders = TEXT(STRING[100]);
LOCAL respCookies = TEXT(STRING[100]);
EXTERNAL HTTP GET 'https://api.example/login'
HEADERSTO respHeaders
COOKIESTO respCookies
TO exportFile;
}
externalTCP() {
EXTERNAL TCP 'example.com:9100' PARAMS RAWFILE('payload');
MESSAGE STRING(responseTcp());
}
externalSQL () {
// SQL-команда с параметром формата TABLE, загружаемым во временную таблицу
EXPORT TABLE FROM bc=barcode(Article a) WHERE name(a) LIKE '%Мясо%';
EXTERNAL SQL 'jdbc:mysql://$1/test?user=root&password='
EXEC 'select price AS pc, articles.barcode AS brc from $2 x JOIN articles ON x.bc=articles.barcode'
PARAMS 'localhost',exportFile()
TO exportFile;
}
externalLSF() {
EXTERNAL LSF 'http://localhost:7651' EXEC 'System.testAction[]';
}
externalDBF() {
EXPORT TABLE FROM bc=barcode(Article a), nm=name(a);
EXTERNAL DBF '/tmp/articles.dbf' APPEND CHARSET 'CP866' PARAMS exportFile();
}