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

26.09.16

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
КлиентHTTP
.cf 8,22Kb ver:1
40
40 Скачать (1 SM) Купить за 1 850 руб.
СерверHTTP
.cf 7,23Kb ver:1
39
39 Скачать (1 SM) Купить за 1 850 руб.

При выходе платформы 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С v8.3 1С:Конвертация данных Платные (руб)

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

13200 руб.

27.12.2021    38198    108    161    

201

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

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

3000 руб.

03.12.2018    59291    192    103    

172

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

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

2000 руб.

22.04.2019    97226    586    189    

321

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

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

3450 руб.

28.04.2023    9471    15    0    

9

Мобильная разработка Платформа 1С v8.3 Конфигурации 1cv8 Финансовые услуги, инвестиции Управленческий учет Платные (руб)

Мобильное приложение и конфигурация 1С для автоматической торговли на бирже через API Тинькофф банка. Достаточно задать настройки, нажать «Пуск», и робот сам торгует ежедневно.

7000 руб.

25.05.2022    4644    1    0    

6

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

Экспериментальный релиз и простенький скрипт к нему закрывает потребности в любых видах синхронизации между устройствами Simple и между Simple и бек-системами (например 1С). По сути – это очень простой python-скрипт, который можно запустить на доступной машине, сервере или VPS и он будет связывать клиентские устройства между собой и с 1С или другими бек-системами. В самой платформе появилось для этого множество доработок для поддержки стабильного постоянного соединения, докачки больших файлов и работе в фоне. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

1 стартмани

23.08.2024    1217    6    informa1555    1    

13

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

В этом релизе собрано много нового из области интерфейса, связи, хранения и важные новые способы управления. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

1 стартмани

25.06.2024    2607    29    informa1555    0    

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

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

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

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


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


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


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


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

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

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

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

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

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