Перейти к основному содержимому
Версия: 7.0

Оператор 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-запроса:

    • POST
    • GET
    • PUT
    • DELETE
    • PATCH

    Значением по умолчанию является 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, должны быть использованы внутри этой строки, иначе вызов падает. Для GET BODYURL не действует, а оставшиеся параметры молча отбрасываются.

  • 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 не отправляются; без COOKIESTO cookies не сохраняются.

  • 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();
}