How-to: Взаимодействие через HTTP-протокол
Пример 1
Условие
Задан некоторый набор городов, привязанных к странам.
CLASS Country 'Страна';
id 'Код' = DATA STRING[20] (Country) IN id;
name 'Имя' = DATA ISTRING[100] (Country) IN id;
country (STRING[20] id) = GROUP AGGR Country c BY id(c);
CLASS City 'Город';
name 'Имя' = DATA ISTRING[100] (City) IN id;
country 'Страна' = DATA Country (City);
nameCountry 'Страна' (City c) = name(country(c));
FORM cities 'Города'
OBJECTS c = City
PROPERTIES(c) name, nameCountry, NEW, DELETE
;
NAVIGATOR {
NEW cities;
}
Нужно отправить на определенный url HTTP-запрос на добавление города в формате JSON.
Решение
postCity 'Отправить' (City c) {
EXPORT JSON FROM countryId = id(country(c)), name = name(c);
LOCAL result = FILE();
EXTERNAL HTTP 'http://localhost:7651/exec?action=Location.createCity' PARAMS exportFile() TO result;
LOCAL code = STRING[10]();
LOCAL message = STRING[100]();
IMPORT JSON FROM result() TO() code, message;
IF NOT code() == '0' THEN {
MESSAGE 'Ошибка: ' + message();
}
}
EXTEND FORM cities
PROPERTIES(c) postCity
;
Оператор EXPORT
создаст JSON в формате FILE
и сохранит его в свойство exportFile
. Пример сформированного файла:
{"countryId":"123","name":"San Francisco"}
Дальше вызывается оператор EXTERNAL
, который делает запрос на предопределенный url, передавая туда в качестве Body содержимое сформированного файла. В данном случае, так как свойство в блоке FROM
имеет тип JSON, то в качестве типа контента будет использоваться application/json. В url'е закодированы <пространство имен>.<имя свойства>
. В данном случае пространство именем модуля вызываемого свойства createCity
является Location
. Все параметры передаются по порядку с идентификатором p
. Ответ, который будет получен от сервера, будет записан в свойство result
. Предположим, что ответ получен в формате JSON и имеет один из следующих видов:
{"code":"0","message":"OK"}
{"code":"1","message":"Некорректный код страны"}
Ответ разбирается при помощи оператора IMPORT
, который раскладывает соответствующие параметры в свойства code
и message
соответственно. В случае ошибки пользователю выдается сообщение с текстом ошибки.