diff --git a/docs/Пример.bsl b/docs/Пример.bsl index e26d60f..f236873 100644 --- a/docs/Пример.bsl +++ b/docs/Пример.bsl @@ -5,22 +5,22 @@ // GUID соединения - Строка Функция СоздатьSQLСоединение() Экспорт - http = Новый HTTPСоединение("localhost", 8080); - path = "/api/v1/connection"; - json_body = СериализоватьВJSON( + HTTPСоединение = Новый HTTPСоединение("localhost", 8080); + Путь = "/api/v1/connection"; + ТелоJSON = СериализоватьВJSON( Новый Структура( "host,port,user,password,db_type,db_name,ssl", "127.0.0.1", 5432, "postgres", "postgres", "postgres", "test", Ложь - )); + )); // перепишите под себя, чтобы не хранить пароли в тексте программы - headers = Новый Соответствие; - headers.Вставить("API-Version", "1.2"); - headers.Вставить("Content-Type", "application/json;charset=UTF-8"); + Заголовки = Новый Соответствие; + Заголовки.Вставить("API-Version", "1.2"); + Заголовки.Вставить("Content-Type", "application/json;charset=UTF-8"); - query = Новый HTTPЗапрос(path, headers); - query.УстановитьТелоИзСтроки(json_body); + HTTPЗапрос = Новый HTTPЗапрос(Путь, Заголовки); + HTTPЗапрос.УстановитьТелоИзСтроки(ТелоJSON); - Ответ = http.ВызватьHTTPМетод("POST", query); + Ответ = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос); КодРезультата = Ответ.КодСостояния; SQLСоединение = Ответ.ПолучитьТелоКакСтроку(); Если КодРезультата = 200 Тогда @@ -34,25 +34,26 @@ // Закрывает и удаляет соединение с SQL-сервером // Параметры: // SQLСоединение - Строка - GUID открытого соединения -Процедура УдалитьSQLСоединение(SQLСоединение) Экспорт +Функция УдалитьSQLСоединение(SQLСоединение) Экспорт - http = Новый HTTPСоединение("localhost", 8080); - path = "/api/v1/connection"; + HTTPСоединение = Новый HTTPСоединение("localhost", 8080); + Путь = "/api/v1/connection"; - headers = Новый Соответствие; - headers.Вставить("API-Version", "1.2"); - headers.Вставить("Connection-Id", SQLСоединение); + Заголовки = Новый Соответствие; + Заголовки.Вставить("API-Version", "1.2"); + Заголовки.Вставить("Connection-Id", SQLСоединение); - query = Новый HTTPЗапрос(path, headers); + HTTPЗапрос = Новый HTTPЗапрос(Путь, Заголовки); - Ответ = http.ВызватьHTTPМетод("DELETE", query); + Ответ = HTTPСоединение.ВызватьHTTPМетод("DELETE", HTTPЗапрос); КодРезультата = Ответ.КодСостояния; - Результат = Ответ.ПолучитьТелоКакСтроку(); Если КодРезультата = 200 Тогда SQLСоединение = ""; КонецЕсли; -КонецПроцедуры + Возврат КодРезультата; + +КонецФункции // Выполняет обычные SQL-запросы вида выборки таблиц // Параметры: @@ -62,18 +63,18 @@ // Результат запроса - Структура, содержащая массив структур - результат выборки запроса Функция ЗапросВыборкаДанных(SQLСоединение, SQLЗапрос) Экспорт - http = Новый HTTPСоединение("localhost", 8080); - path = "/api/v1/query"; + HTTPСоединение = Новый HTTPСоединение("localhost", 8080); + Путь = "/api/v1/HTTPЗапрос"; - headers = Новый Соответствие; - headers.Вставить("API-Version", "1.2"); - headers.Вставить("Connection-Id", SQLСоединение); - headers.Вставить("Content-Type", "text/plain;charset=UTF-8"); + Заголовки = Новый Соответствие; + Заголовки.Вставить("API-Version", "1.2"); + Заголовки.Вставить("Connection-Id", SQLСоединение); + Заголовки.Вставить("Content-Type", "text/plain;charset=UTF-8"); - query = Новый HTTPЗапрос(path, headers); - query.УстановитьТелоИзСтроки(SQLЗапрос); + HTTPЗапрос = Новый HTTPЗапрос(Путь, Заголовки); + HTTPЗапрос.УстановитьТелоИзСтроки(SQLЗапрос); - Ответ = http.ВызватьHTTPМетод("POST", query); + Ответ = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос); КодРезультата = Ответ.КодСостояния; Если КодРезультата = 200 Тогда Возврат ДесериализоватьИзJSON(Ответ.ПолучитьТелоКакСтроку()); @@ -87,23 +88,23 @@ // Параметры: // SQLСоединение - Строка - GUID открытого соединения // SQLЗапрос - Строка - Текст SQL-запроса -Процедура ЗапросИзменениеДанных(SQLСоединение, SQLЗапрос) Экспорт +Функция ЗапросИзменениеДанных(SQLСоединение, SQLЗапрос) Экспорт - http = Новый HTTPСоединение("localhost", 8080); - path = "/api/v1/query"; + HTTPСоединение = Новый HTTPСоединение("localhost", 8080); + Путь = "/api/v1/HTTPЗапрос"; - headers = Новый Соответствие; - headers.Вставить("API-Version", "1.2"); - headers.Вставить("Connection-Id", SQLСоединение); - headers.Вставить("Content-Type", "text/plain;charset=UTF-8"); + Заголовки = Новый Соответствие; + Заголовки.Вставить("API-Version", "1.2"); + Заголовки.Вставить("Connection-Id", SQLСоединение); + Заголовки.Вставить("Content-Type", "text/plain;charset=UTF-8"); - query = Новый HTTPЗапрос(path, headers); - query.УстановитьТелоИзСтроки(SQLЗапрос); + HTTPЗапрос = Новый HTTPЗапрос(Путь, Заголовки); + HTTPЗапрос.УстановитьТелоИзСтроки(SQLЗапрос); - Ответ = http.ВызватьHTTPМетод("PUT", query); - КодРезультата = Ответ.КодСостояния; + Ответ = HTTPСоединение.ВызватьHTTPМетод("PUT", HTTPЗапрос); + Возврат Ответ.КодСостояния; -КонецПроцедуры +КонецФункции // Создает подготовленный оператор (Prepared statement) // Параметры: @@ -113,18 +114,18 @@ // GUID оператора - Строка Функция СоздатьПодготовленныйОператор(SQLСоединение, SQLЗапрос) Экспорт - http = Новый HTTPСоединение("localhost", 8080); - path = "/api/v1/prepared"; + HTTPСоединение = Новый HTTPСоединение("localhost", 8080); + Путь = "/api/v1/prepared"; - headers = Новый Соответствие; - headers.Вставить("API-Version", "1.2"); - headers.Вставить("Connection-Id", Соединение); - headers.Вставить("Content-Type", "text/plain;charset=UTF-8"); + Заголовки = Новый Соответствие; + Заголовки.Вставить("API-Version", "1.2"); + Заголовки.Вставить("Connection-Id", Соединение); + Заголовки.Вставить("Content-Type", "text/plain;charset=UTF-8"); - query = Новый HTTPЗапрос(path, headers); - query.УстановитьТелоИзСтроки(SQLЗапрос); + HTTPЗапрос = Новый HTTPЗапрос(Путь, Заголовки); + HTTPЗапрос.УстановитьТелоИзСтроки(SQLЗапрос); - Ответ = http.ВызватьHTTPМетод("POST", query); + Ответ = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос); КодРезультата = Ответ.КодСостояния; Результат = Ответ.ПолучитьТелоКакСтроку(); Если КодРезультата = 200 Тогда @@ -139,22 +140,22 @@ // Параметры: // SQLСоединение - Строка - GUID открытого соединения // SQLОператор - Строка - GUID оператора -Процедура УдалитьПодготовленныйОператор(SQLСоединение, SQLОператор) Экспорт +Функция УдалитьПодготовленныйОператор(SQLСоединение, SQLОператор) Экспорт - http = Новый HTTPСоединение("localhost", 8080); - path = "/api/v1/prepared"; + HTTPСоединение = Новый HTTPСоединение("localhost", 8080); + Путь = "/api/v1/prepared"; - headers = Новый Соответствие; - headers.Вставить("API-Version", "1.2"); - headers.Вставить("Connection-Id", SQLСоединение); - headers.Вставить("Statement-Id", SQLОператор); + Заголовки = Новый Соответствие; + Заголовки.Вставить("API-Version", "1.2"); + Заголовки.Вставить("Connection-Id", SQLСоединение); + Заголовки.Вставить("Statement-Id", SQLОператор); - query = Новый HTTPЗапрос(path, headers); + HTTPЗапрос = Новый HTTPЗапрос(Путь, Заголовки); - Ответ = http.ВызватьHTTPМетод("DELETE", query); - КодРезультата = Ответ.КодСостояния; + Ответ = HTTPСоединение.ВызватьHTTPМетод("DELETE", HTTPЗапрос); + Возврат Ответ.КодСостояния; -КонецПроцедуры +КонецФункции // Выполнить подготовленный оператор (Prepared statement) с выборкой данных // Параметры: @@ -165,21 +166,21 @@ // Результат запроса - Структура, содержащая массив структур - результат выборки запроса Функция ВыполнитьПодготовленныйОператорВыборка(SQLСоединение, SQLОператор, Парам) Экспорт - http = Новый HTTPСоединение("localhost", 8080); - path = "/api/v1/prepared/query"; + HTTPСоединение = Новый HTTPСоединение("localhost", 8080); + Путь = "/api/v1/prepared/HTTPЗапрос"; - headers = Новый Соответствие; - headers.Вставить("API-Version", "1.2"); - headers.Вставить("Connection-Id", Соединение); - headers.Вставить("Statement-Id", Оператор); - headers.Вставить("Content-Type", "application/json;charset=UTF-8"); + Заголовки = Новый Соответствие; + Заголовки.Вставить("API-Version", "1.2"); + Заголовки.Вставить("Connection-Id", Соединение); + Заголовки.Вставить("Statement-Id", Оператор); + Заголовки.Вставить("Content-Type", "application/json;charset=UTF-8"); ПараметрыJSON = СериализоватьВJSON(Парам); - query = Новый HTTPЗапрос(path, headers); - query.УстановитьТелоИзСтроки(ПараметрыJSON); + HTTPЗапрос = Новый HTTPЗапрос(Путь, Заголовки); + HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрыJSON); - Ответ = http.ВызватьHTTPМетод("POST", query); + Ответ = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос); КодРезультата = Ответ.КодСостояния; Если КодРезультата = 200 Тогда @@ -195,26 +196,101 @@ // SQLСоединение - Строка - GUID открытого соединения // SQLОператор - Строка - GUID оператора // Парам - Массив - Параметры для подготовленного оператора -Процедура ВыполнитьПодготовленныйОператорИзменение(SQLСоединение, SQLОператор, Парам) Экспорт +Функция ВыполнитьПодготовленныйОператорИзменение(SQLСоединение, SQLОператор, Парам) Экспорт - http = Новый HTTPСоединение("localhost", 8080); - path = "/api/v1/prepared/query"; + HTTPСоединение = Новый HTTPСоединение("localhost", 8080); + Путь = "/api/v1/prepared/HTTPЗапрос"; - headers = Новый Соответствие; - headers.Вставить("API-Version", "1.2"); - headers.Вставить("Connection-Id", Соединение); - headers.Вставить("Statement-Id", Оператор); - headers.Вставить("Content-Type", "application/json;charset=UTF-8"); + Заголовки = Новый Соответствие; + Заголовки.Вставить("API-Version", "1.2"); + Заголовки.Вставить("Connection-Id", Соединение); + Заголовки.Вставить("Statement-Id", Оператор); + Заголовки.Вставить("Content-Type", "application/json;charset=UTF-8"); ПараметрыJSON = СериализоватьВJSON(Парам); - query = Новый HTTPЗапрос(path, headers); - query.УстановитьТелоИзСтроки(ПараметрыJSON); + HTTPЗапрос = Новый HTTPЗапрос(Путь, Заголовки); + HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрыJSON); - Ответ = http.ВызватьHTTPМетод("PUT", query); + Ответ = HTTPСоединение.ВызватьHTTPМетод("PUT", HTTPЗапрос); + Возврат Ответ.КодСостояния; + +КонецФункции + +// Прочитать поле BLOB из таблицы +// Параметры: +// SQLСоединение - Строка - GUID открытого соединения +// SQLЗапрос - Строка - Текст SQL-запроса, содержащий выборку *одного* +// поля бинарного типа BYTEA, BLOB, IMAGE и т.д. +// +Функция ПрочитатьBlob(SQLСоединение, SQLЗапрос) Экспорт + + HTTPСоединение = Новый HTTPСоединение("localhost", 8080); + Путь = "/api/v1/blob"; + + Заголовки = Новый Соответствие; + Заголовки.Вставить("API-Version", "1.2"); + Заголовки.Вставить("Connection-Id", HTTPСоединение); + Заголовки.Вставить("Content-Type", "text/plain;charset=UTF-8"); + + HTTPЗапрос = Новый HTTPЗапрос(Путь, Заголовки); + HTTPЗапрос.УстановитьТелоИзСтроки(SQLЗапрос); + + Ответ = http.ВызватьHTTPМетод("POST", HTTPЗапрос); КодРезультата = Ответ.КодСостояния; + Если КодРезультата = 200 Тогда + Возврат ПоместитьВоВременноеХранилище(Ответ.ПолучитьТелоКакДвоичныеДанные(), Новый УникальныйИдентификатор()); + Иначе + Возврат Неопределено; + КонецЕсли; -КонецПроцедуры +КонецФункции + +// Записать поле BLOB в таблицу +// Параметры: +// SQLСоединение - Строка - GUID открытого соединения +// SQLЗапрос - Строка - Текст SQL-запроса, содержащий инструкции INSERT или UPDATE +// и *один* параметр указывающий на значение бинарного типа BYTEA, BLOB, +// IMAGE и т.д. +// Адрес - Строка - Адрес временного хранилища, содержащий двоичные данные +// +Функция ЗаписатьBlob(SQLСоединение, SQLЗапрос, Адрес) Экспорт + + HTTPСоединение = Новый HTTPСоединение("localhost", 8080); + Путь = "/api/v1/blob"; + + Разделитель = СтрЗаменить(Новый УникальныйИдентификатор(), "-", ""); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("API-Version", "1.2"); + Заголовки.Вставить("Connection-Id", HTTPСоединение); + Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Разделитель); + + Поток = Новый ПотокВПамяти; + Запись = Новый ЗаписьДанных(Поток,,, Символы.ВК + Символы.ПС, ""); + Запись.ЗаписатьСтроку("--" + Разделитель); + Запись.ЗаписатьСтроку("Content-Disposition: form-data; name=sql_query;"); + + Запись.ЗаписатьСтроку("Content-Type: text/html"); + Запись.ЗаписатьСтроку(""); + Запись.ЗаписатьСтроку(Запрос); + Запись.ЗаписатьСтроку("--" + Разделитель); + Запись.ЗаписатьСтроку("Content-Disposition: form-data; name=binary_data;filename=blob_data"); + Запись.ЗаписатьСтроку("Content-Type: application/octet-stream"); + Запись.ЗаписатьСтроку(""); + Запись.Записать(ПолучитьИзВременногоХранилища(Адрес)); + Запись.ЗаписатьСтроку(""); + Запись.ЗаписатьСтроку("--" + Разделитель + "--"); + Запись.ЗаписатьСтроку(""); + Запись.Закрыть(); + + HTTPЗапрос = Новый HTTPЗапрос(Путь, Заголовки); + HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(Поток.ЗакрытьИПолучитьДвоичныеДанные()); + + Ответ = http.ВызватьHTTPМетод("PUT", HTTPЗапрос); + Возврат Ответ.КодСостояния; + +КонецФункции #КонецОбласти