Простой пример передачи данных между клиентом и сервером через HTTP-сервисы

26.09.16

Разработка - Мобильная разработка

При выходе платформы 8.3.5 появилось желание переделать в уже готовом мобильном приложении соединение клиента с сервером из Web на HTTP-сервисы. В статье не будет кучи воды, только конкретная задача, все максимально просто.

Скачать исходный код

Наименование Файл Версия Размер
КлиентHTTP
.cf 8,22Kb
40
.cf 1 8,22Kb 40 Скачать
СерверHTTP
.cf 7,23Kb
39
.cf 1 7,23Kb 39 Скачать

При выходе платформы 8.3.5 появилось желание переделать в уже готовом мобильном приложении соединение клиента с сервером из Web на HTTP-сервисы. На то было много причин, и говорить о них в рамках этой статьи, думаю, будет неуместно.

Но когда казавшуюся тогда простую задачу я попробовал решить с помощью синтаксис помощника и мануала 1с тут и тут у меня возникла куча вопросов. И какое было мое удивление когда я нашел много примеров применения HTTP-сервисов, например здесь и здесь, но ни одного для моего случая.

В статье не будет кучи воды, только конкретная задача, все максимально просто.

Итак, поехали.

 

Для начала сделаем серверную часть.

Создаем новый HTTP-сервер. Назовем его, например Exchange, корневой URL указываем такой же.

 

Далее переходим на вкладку ШаблоныURL. Добавляем новый шаблон, в моем случае Query, шаблон указываем /query/*.

 Далее создаем метод и назовем его к примеру Action, HTTP-метод выбираем "Любой", жмем на кнопку с изображение лупы напротив поля "Обработчик" и автоматически создается функция.

 В нее мы пишем следующее.

Функция QueryAction(Запрос)
      ПараметрыЗапроса = Запрос.ПолучитьТелоКакСтроку();
               
      Если ПараметрыЗапроса Тогда
           Ответ = "Информация с параметром";
      Иначе
           Ответ = "Информация без параметра";
      КонецЕсли;
                              
      HTTPОтвет = Новый HTTPСервисОтвет(200);
      HTTPОтвет.УстановитьТелоИзСтроки(Ответ);
      Возврат HTTPОтвет;
КонецФункции

Пробежавшись взглядом, сразу можно понять что для чего. В конце можно будет пробежать отладчиком и все сразу станет понятно и просто.

Публикуем базу и серверная часть готова.

 

Клиентская часть.

Для примера создадим общую форму. Добавляем в нее кнопку и пишем функцию которая отправит на сервер параметр и вернет нам результат.

Функция POSTЗапрос()
      Попытка
          //подключение к этому ПК
          Соединение = Новый HTTPСоединение("127.0.0.1");
      Исключение
          Возврат "Ошибка при создании HTTP соединения.";
      КонецПопытки;
               
      HTTPЗапрос = Новый HTTPЗапрос(ИмяОпубликованнойБазы+"/hs/Exchange/query");
      HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрЗапроса);
               
      Ответ = "";
               
      Попытка
          HTTPОтвет =     Соединение.Записать(HTTPЗапрос);
          Ответ = HTTPОтвет.ПолучитьТелоКакСтроку();
      Исключение
          Возврат "Ошибка при соединении.";
      КонецПопытки;
               
      Возврат Ответ;
КонецФункции

ПарметрЗапроса в данном примере – Булево,

а ИмяОпубликованнойБазы – Строка (это то имя с которым проходила публикация на веб-сервере серверной части).

Вот и все премудрости.

Если нужно, можно скачать базы клиента и сервера, их прикрепляю ниже.

Ну вот, теперь-то я уверен, что если кому-то понадобиться переделать или сделать мобильное приложение с HTTP-сервисами, у него на одну головную боль будет меньше. Всем успехов! 

Мобильное приложение HTTP-сервисы

См. также

"Штрихкод-информер" - мобильный ТСД и прайс-чекер в смартфоне

Мобильная разработка Сканер штрих-кода Терминал сбора данных Управляемые формы Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Сбор заказов, инвентаризация, проверка ценников, просмотр полной информации об остатках и ценах со смартфона Онлайн. Отправка данных со смартфона выполняется либо напрямую в открытую форму документа, отсканировав QR-код, либо в общую корзину учетной системы, не подходя к компьютеру. Кассир или оператор сможет просмотреть список присланных данных и загрузить в любую форму, поддерживающую работу с ТСД. Для работы с мобильным приложением требуется опубликовать HTTP-сервис из поставляемого расширения.

2880 руб.

03.12.2018    55025    139    102    

162

SALE! 25%

Что нам стоит бота построить? Нарисуем - будет жить! Графический конструктор телеграм-ботов/Telegram

Мобильная разработка Мессенджеры и боты Платформа 1С v8.3 Платные (руб)

Теперь создать telegram-бота - элементарно. Достаточно просто нарисовать блок-схему телеграм-бота, и он сразу заработает. Это возможно при использовании Графического конструктора телеграм-ботов. Это единственный конструктор ботов для telegram, чье качество и функционал подтверждены фирмой 1С, есть сертификат 1С:Совместимо. Расширение в интерактивном режиме, с помощью блок-схем, позволяет с минимальными трудозатратами создать телеграм-ботов в любой конфигурации, работающей на платформе «1С:Предприятие 8.3».

13200 9900 руб.

27.12.2021    33780    82    159    

177

"Мобильный ТСД" - инвентаризация и сбор штрихкодов для iOS и Android

Сканер штрих-кода Терминал сбора данных Мобильная разработка Монитор заказов Оптовая торговля Розничная торговля Ценообразование, анализ цен Платформа 1С v8.3 Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Простой мобильный терминал сбора данных для смартфонов на iOS и Android, не требующий сложных настроек и установки дополнительных программ. Обмен между Вашей 1С и мобильным приложением осуществляется через облачный сервис и расширение конфигурации. Работает с конфигурациями УТ 11, ERP, КА2, Розница 2, Розница 3, УНФ 1.6, УНФ 3.0. Полнофункциональный демо-доступ для своей конфигурации можно запросить в настройках мобильного приложения - все необходимое придет на почту автоматически.

2000 руб.

22.04.2019    92346    520    186    

297

Магазин 15 - приемка товара по штрихкодам или инвентаризация в торговом зале

Логистика, склад и ТМЦ Мобильная разработка Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Специализированное программное обеспечение для мобильных устройств со встроенным сканером штрихкодов. Позволяет быстро автоматизировать, оптимизировать рабочие места и бизнес процессы по учету товара в магазине. Например, приемку товара по штрихкодам или инвентаризацию прямо в торговом зале.

12950 руб.

30.05.2023    3459    2    0    

4

Работа с графикой в браузере (SimpleWEB). Векторный редактор

Мобильная разработка WEB-интеграция Мобильная платформа Абонемент ($m)

В SimpleWEB добавились средства для работы с графикой и отслеживание событий мыши, в онлайн редактор https://seditor.ru:1555/ добавился «Векторный редактор» на этом API. Теперь можно нарисовать схемы складов на ПК, сделать карты (*.sug-файлы) для мобильной платформы SimpleUI, выводить данные из 1С в графическом виде. Таким образом, API для работы с векторными файлами теперь есть и в веб- и в мобильной платформе, а также средства для создания и редактирования векторных файлов есть тоже в обеих платформах.

1 стартмани

20.03.2024    1606    0    informa1555    1    

40

Зачем нам 1С:Элемент

Мобильная разработка Языки и среды Бесплатно (free)

Flutter может быть использован с 1С:Предприятием для разработки кроссплатформенных мобильных приложений, обеспечивая единый интерфейс и функциональность на устройствах под управлением iOS и Android. Это позволяет создавать приложения с высокой производительностью благодаря использованию собственного движка рендеринга Flutter. Интеграция Flutter с 1С:Предприятием позволяет создавать мобильные приложения любого уровня сложности, интегрировать их в корпоративные информационные системы, а также реализовывать бизнес-логику

19.03.2024    9253    ROk_dev    67    

41

JavaScript в Simple

Мобильная разработка Бесплатно (free)

В SimpleUI и SimpleWEB, наряду с обработчиками на python и онлайн (1С и т.д.) добавляется интерпретатор JavaScript. В андроид платформе он скорее играет на поле python, т.к. является оффлайновым решением для самостоятельной обработки и расширяет аудиторию разработчиков для разработки самостоятельных решений. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

12.02.2024    1691    informa1555    0    

25
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. BigB 191 15.03.15 01:57 Сейчас в теме
(0) В двух файлах, для скачивания есть ещё, что нибудь кроме текстов, что вы выложили в описании?
+
2. kristart 95 19.03.15 12:09 Сейчас в теме
(1) BigB, только описанное в статье, запрос - ответ.
+
3. Tasselhof 20 28.09.15 18:15 Сейчас в теме
Только вместо - Соединение.Записать(HTTPЗапрос, Ответ);
надо - Соединение.Получить(HTTPЗапрос, Ответ);
+
4. kristart 95 05.10.15 22:04 Сейчас в теме
(3) Tasselhof, согласен, так тоже выглядит хорошо. Но в данном примере, HTTP-метод = любой, поэтому разницы нет.
+
5. FireFox_Manager 13.11.15 16:27 Сейчас в теме
Плюсанул за то, что автор кратко и доступно изложил суть вопроса и привел работающий код.
svilsa; +1
6. Andry.Boris 59 07.12.15 15:29 Сейчас в теме
Автору +
Скачал, попробовал по вашей схеме, работает,
проверил и с мобильного телефона, тоже все отлично отрабатывает.
Главное коротко и понятно.
svilsa; +1
7. bubus 18.12.15 00:37 Сейчас в теме
А как передать файл HTTP сервису в 1с?
+
8. kristart 95 18.12.15 14:00 Сейчас в теме
(7) bubus, Можно сериализовать данные и передать сериализованную строку (если ее еще и сжать, поместив в хранилище - пакет меньше будет). Про сериализацию почитать можно например тут или просто в гугл вбить, примеров много.
bubus; +1
9. bubus 18.12.15 14:54 Сейчас в теме
(8) спс уже сделал. Но вот про сжатие не знал. Отправляю в xml-двоичные-base64, а в http сервисе в обратном порядке, из мобильного приложения. Единственное что не нашел примера с методом PUT для HTTP сервиса. И еще вопрос, вы не знаете какой размер максимально можно приатачить к запросу? Понятно отрубит по таймауту, но есть ли ограничения по размерам? Где то читал про передаче через HTTP соединение из моб. приложения максимум 80кб. Типо баг что ли такой вроде был.
+
10. kristart 95 19.12.15 14:40 Сейчас в теме
(9) bubus, у меня небыло проблем с размерами файлов. В основном передавал файлы размером до 100мб - было все ок.
+
15. Region102 27.07.16 14:41 Сейчас в теме
(8) мне интересно как вы поместите ХранилищеЗначения в тело http запроса.
+
16. kristart 95 27.07.16 19:28 Сейчас в теме
(15) Region102, все проще чем кажется.
Сериализуем необходимые данные и на выходе получаем строку которую и помещаем в тело.
На принимающей стороне десериализуем и вуалая! - вот они наши данные.
Соответственно передать можно все что сериализуется (посмотреть это свойство объекта можно в синтаксис помощнике).
ХранилищеЗначения - сериализуется, то есть его так же можно передать в теле.
+
11. malikov_pro 1293 12.04.16 00:26 Сейчас в теме
Автор немного "срезал", и при Соединение.Получить серверная сторона работать будет некорректно

при POST тело сообщения передается и конструкция УстановитьТелоИзСтроки(ПараметрЗапроса) -> Запрос.ПолучитьТелоКакСтроку() работает

при GET только через параметры запроса, пример: HTTPЗапрос( ИмяОпубликованнойБазы+ "/?geocode=1"); и принимаем на стороне сервера в Запрос.ПараметрыЗапроса
baracuda; +1
12. kristart 95 23.04.16 23:17 Сейчас в теме
(11) malikov_pro, хороший коммент, как Вы правильно указали я "срезал" все уточнения и много теории. Дело в том, что я хотел показать самый минимум. Все как для новичка, которому просто надо запустить сервис, а разбираться со временем.

Кстати, некоторые параметры я сериализовал и передавал в заголовках (как строку). Еще один вариант прицепить данные.
+
13. alians-us 13.07.16 17:56 Сейчас в теме
у меня есть код
&НаСервере

Функция POSTЗапрос()
ПараметрЗапроса=истина;	
      Попытка
          //подключение к этому ПК
          Соединение = Новый HTTPСоединение("127.0.0.1");
      Исключение
          Возврат "Ошибка при создании HTTP соединения.";
      КонецПопытки;
               
      HTTPЗапрос = Новый HTTPЗапрос("Opoveshatel_android/hs/Exchange/query");
      HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрЗапроса);
               
      Ответ = "";
               
      Попытка
          HTTPОтвет =     Соединение.Получить(HTTPЗапрос, Ответ);
          Ответ = HTTPОтвет.ПолучитьТелоКакСтроку();
      Исключение
          Возврат "Ошибка при соединении.";
      КонецПопытки;
               
      Возврат Ответ;
  КонецФункции

&Наклиенте
Процедура Команда1(Команда)

Сообщить(POSTЗапрос());
  КонецПроцедуры
Показать

после нажатия на кнопку просто сообщает пустой ответ
+
14. kristart 95 13.07.16 22:46 Сейчас в теме
(13) alians-us, я думаю дело в том, что параметр не передается и дело именно в этом
Вы используете метод GET
Cоединение.Получить(HTTPЗапрос, Ответ);

соответственно тело не передается
HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрЗапроса);

нужно устанавливать параметры как писал malikov_pro:
"при GET только через параметры запроса, пример:
HTTPЗапрос( ИмяОпубликованнойБазы+ "/?geocode=1");

и принимаем на стороне сервера в Запрос.ПараметрыЗапроса

либо заголовками, их можно установить вторым параметром при создании HTTPзапроса
либо используйте метод PUT, как и описано в статье
Cоединение.Записать(HTTPЗапрос, Ответ);
+
21. smirnovserg.s@gmail.com 25.09.16 14:42 Сейчас в теме
(14) извиняюсь, а в чем смысл указывать второй параметр Ответ в строке:

HTTPОтвет =     Соединение.Записать(HTTPЗапрос, Ответ);


сервис работает и без него.
+
22. kristart 95 26.09.16 16:06 Сейчас в теме
(21) smirnovserg.s@gmail.com, спасибо за замечание, Вы правы, этот параметр не нужен для метода Записать (в статье исправил).
Его можно указывать используя метод Получить (GET-запрос) и тогда в ответ получим, как пишет синтаксис помощник - "Имя файла, в который помещаются данные полученного ресурса". В общем мы и так получаем все из HTTPОтвета, так что использование второго параметра, в нашем случае, считаю неоправданным.
TOSUNIK; +1
17. sml 41 28.07.16 13:51 Сейчас в теме
Доброго дня, плюсанул за краткость и содержание, а также за комменты.
Есть вопрос: Если передавать данные через Заголовок (2й параметр запроса), то как его разбирать на стороне сервера?
+
18. kristart 95 28.07.16 18:28 Сейчас в теме
(17) sml, и Вам доброго дня.
заголовки это обычное соответствие.

На стороне сервера предположим есть принимающая функция
Функция RegistrationChek(Запрос)


Вот что мы получим


Я передал два параметра поместив их в заголовки:
Соответствие = Новый Соответствие();
	Соответствие.Вставить("ТипОбращения", ПараметрыПодключения.ТипОбращения);
	Соответствие.Вставить("ПакетОбмена",ПараметрыПодключения.ИсходящееСообщение);
	HTTPЗапрос = Новый HTTPЗапрос(ПараметрыПодключения.РесурсНаСервере+ "/?geocode=1",Соответствие);


И вот они на сервере


А потом уже обращаемся к своим параметра как хотим,
можно так
Запрос.Заголовки["ПакетОбмена"]

или так
Запрос.Заголовки.Получить("ПакетОбмена")

в общем как удобно.
svilsa; sml; +2
19. serko8547 110 26.08.16 17:19 Сейчас в теме
Ув. Автор, прошу Вас поделиться опытом:
Я начал использовать http-сервисами недавно, и напоролся на такую проблему: Если в 1с завести пользователя - то мне ответ на любой Get или post запрос приходит Ошибка 401 (не авторизован). Как быть?
Был бы Вам очень благодарен, если Вы подскажете, как решить сию проблему )

авторизация в смысле запросом логина-пароли - программно, т.е. я не ручками ввожу логин-пароль, а как мне авторизоваться программно.
+
20. kristart 95 27.08.16 15:17 Сейчас в теме
(19) serko8547, Приветствую.

Если нет пользователя, авторизационные данные в HTTP-соединении указывать не обязательно; даже в базу пускает не запрашивая логин (без авторизации).
Как только Вы завели пользователя - авторизация обязательна и при попытке войти в базу система будет запрашивать логин и пароль.

В общем, Вам нужно указать логин и пароль при создании HTTP-соединения, примерно вот так:
Попытка
		Соединение = Новый HTTPСоединение(ПараметрыПодключения.АдресСервера,
		,ПараметрыПодключения.Пользователь,ПараметрыПодключения.Пароль,,Таймаут);
	Исключение
		//Сообщить("Не удалось установить соединение с сервером" 
		//+ Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
		ВызватьИсключение;
	КонецПопытки;
svilsa; +1
23. tindir 28.09.16 05:54 Сейчас в теме
Еще одна статья наколенного кода.
+
24. kristart 95 28.09.16 10:54 Сейчас в теме
(23) tindir, Доброго времени суток. Поясните пожалуйста что Вы имеете ввиду "наколенного кода"? Возможно стоит что-нибудь исправить или переписать?
svilsa; zfirstprog; +2
25. TOSUNIK 15.06.17 17:42 Сейчас в теме
Оставьте свое сообщение