Учимся создавать http сервис (часть четвертая). Изучение метода POST http запроса (передача текстовых данных)

11.10.20

Разработка - Запросы

Пошаговое руководство по созданию http сервисов (часть четвертая). Изучение метода POST http запроса.

На прошлых уроках:

-Учимся создавать http-сервисы (часть первая)

-Учимся создавать http сервисы (часть вторая). Передача параметра в http сервис

-Учимся создавать http сервис (часть третья). Передача нескольких параметров в http сервис ,

мы с вами научились создавать http сервис, научились отправлять запросы на сервер. Запросы, которые, до сих пор отправляли на сервер, были GET запросами. При помощи метода GET запроса можно получать данные с сервера. Мы, например, получали информацию о документах расходных документах, а также, получали информацию о номенклатуре.

Что делать, если нам нужно передать некие данные на сервер? На помощь приходит http запрос типа POST!

Поставим задачу:

-Перенесем данные справочника «Номенклатура» из базы источник в базу приемник при помощи http сервиса, используя POST запрос. Переносить данные будем в JSON формате.

 

Подготовим базу источник.

-Создаем чистую информационную базу.

-Назовем ее «БазаИсточник»

-Добавляем в нее несколько объектом метаданных:

Спр. «Номенклатура»

Реквизит «Атрикул» тип строка 25

-Обработка «ИзучениеPOSTЗапросов»

 

Подготовим базу приемник

-Создаем чистую информационную базу

-Назовем ее «БазаПриемник»

-Добавим в нее несколько объектов метаданных:

Спр. «Номенклатура»

Реквизит «Атрикул» тип строка 25

-Создаем новый http сервис «ИзучениеPOSTЗапросов»

-Корневой URL – «post»

 

-Переходим на закладку «Шаблоны URL»

-Добавляем новый шаблон «ЗагрузкаНоменклатуры»

-Создадим шаблон, назовем его «product_json»

-Добавим новый метод «ЗагрузкаНоменклатурыJSON»

-Выбираем HTTP метод POST

 

-Публикуем http сервис на веб сервере, если забыли, как это сделать, смотрите статью 

Учимся создавать http-сервисы (часть первая)

После публикации у меня получился следующий путь «http://localhost/post_test/hs/post/product_json/»

Localhost – IP адрес

post_test – имя публикации

hs – признак http сервиса

post – корневой каталог

product_json - шаблон

 

Переходим в базу источник.

-Открываем обработку «ИзучениеPOSTЗапросов»

-Создадим форму. На форме разместим кнопку «Перенести номенклатуру JSON»

 

 

Шаблон, по которому мы подключаемся из 1С к http сервису следующий:

-Создаем объект типа «HTTPСоединение», в его конструкторе передаем ip адрес http сервиса, например, так:

 

-Создаем объект типа «HTTPЗапрос», в его конструкторе указываем адрес ресурса и заголовки, например так:

 

-Помещаем данные, которые мы хотим отправить на сервер в тело запроса. Мы хотим передать текстовые данные, для этого мы воспользуемся методом «УстановитьТелоИзСтроки»

-Отправляем данные на сервер. (пример кода)

 

Еще раз. Для того чтобы передать данные на сервер, надо эти данные поместить в тело POST запроса. В заголовке необходимо указать какого типа эти данные.

-Открываем базу источник в режиме предприятия и добавляем в справочник «Номенклатура» несколько элементов.

 

Базу источник мы подготовили!

 

Переходим в базу приемник

-Добавляем общий модуль «ОбщегоНазначения»

-В нем описываем две процедуры

 

-Переходим в обработчик метода «ЗагрузкаНоменклатурыJSON» http сервиса «ИзучениеPOSTЗапросов»

-Описываем в нем следующий код

 

Базу приемник мы подготовили.

Запускаем обработку из базы источник. Нажимаем на кнопку. И в базе приемнике создается номенклатура.

 

 

Видео инструкция тут:

 

 

Там же, вы сможете скачать файлы конфигурации источника и приемника.

 

Итак, мы решили поставленную задачу.

При реализации данного функционала была использована платформа 1С:Предприятие 8.3 (8.3.12.1567)

Всего хорошего.

http web сервис GET POST

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    129742    700    390    

752

Как посмотреть итоговый запрос в отчете СКД

Запросы СКД Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    2953    implecs_team    4    

34

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    2619    andrey_sag    10    

32

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    6300    KawaNoNeko    23    

26

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2291    2    Yashazz    0    

32

Запрос 1С copilot

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

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

15.01.2024    7115    40    mkalimulin    32    

53

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    2015    vandalsvq    7    

29

Консоль запросов УФ 8.3.2.24.12 (мод от Dr.Zombi)

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Запросы Россия Абонемент ($m)

Работа с запросом и СКД, Полная поддержка пакетных запросов, временных таблиц. Главное скорость отладки запроса и данных, а красота вторична.

1 стартмани

07.12.2023    3483    52    DrZombi    54    

21
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user1304317 11.10.20 15:39 Сейчас в теме
2. user1464234 11.10.20 17:18 Сейчас в теме
Подскажите пож-ста, можно ли все это реализовать в виде расширения, например к БП 3?
Общий модуль и обработки в расширение включаются, а вот остальные упомянутые в статье объекты метаданных?
5. platonov.e 159 12.10.20 07:00 Сейчас в теме
(2) Это зависит от платформы.
user1464234; +1 Ответить
6. vitika_m 12.10.20 10:37 Сейчас в теме
(2) теоретически в расширение эти объекты добавить можно, но вот использовать для публикации не имеется возможности, так как в окне публикации он не появится, по крайней мере на платформе 8.3.16...
user1464234; +1 1 Ответить
14. uno-c 237 13.10.20 03:24 Сейчас в теме
(6) Не появится в списке - не значит, что нельзя использовать. Нормально публикуется и работает из расширений. Проверено не раз, и не только на 8.3.16.
gigapevt; +1 Ответить
15. vitika_m 13.10.20 07:15 Сейчас в теме
(14)отлично! А можно поподробнее?
17. vitika_m 13.10.20 11:44 Сейчас в теме
18. dsdred 3345 14.10.20 14:03 Сейчас в теме
(15)https://infostart.ru/1c/articles/842751/
вот тут в расширении, и публикуется и работает.
vitika_m; +1 Ответить
19. vitika_m 17.10.20 11:57 Сейчас в теме
(18) Подробнее и не опишешь! Спасибо большое!
3. user1464234 11.10.20 21:12 Сейчас в теме
И из 7 ки с использованием компоненты v7plus как настроить тоже самое было бы полезно.
7. acvatoris 534 12.10.20 11:11 Сейчас в теме
Скажем так, если в v7plus есть методы, которые позволяют подлючиться к http сервису, если есть методы, которые позволяют помещать данные в тело запроса, то можно, если нет, то увы.
user1464234; +1 Ответить
4. Fox-trot 158 12.10.20 06:49 Сейчас в теме
(0) поиск дубля не помешал бы перед тем как создавать новый элемент справочника
8. dsdred 3345 12.10.20 11:56 Сейчас в теме
обработка ИзучениеPOSTЗапросов
а на картинке ИзчениеPOSTЗапросов

для JSON наверное правильнее
HTTPЗапрос.Заголовки.Вставить("Content-Type","application/json");
10. Поручик 4677 12.10.20 14:12 Сейчас в теме
(8) Смотря как сервер-приёмник обрабатывает данные.
11. dsdred 3345 12.10.20 14:44 Сейчас в теме
(10)Чаще всего если сервис сторонний то разворачивают без этого заголовка.
К примеру сейчас обмен с API IIKO делаю, там этот момент не документирован, но без этого заголовка кушать запросы отказывается.
9. ICeZm 22 12.10.20 14:09 Сейчас в теме
12. ltfriend 964 12.10.20 21:00 Сейчас в теме
Технически, можно передать данные и создать объект и GET запросом, передав нужные значения в параметрах, т.к. GET-запрос не имеет тела. Но это, конечно, извращение, да и размер данных ограничен максимальной длинной URL.

А передать данные в теле запроса можно и методами PATCH, PUT, а не только POST.

Так, распространённая практика при создании REST API использовать POST для создание объекта, а PUT/PATCH для его изменения (метод DELETE, соответственно, используется для удаления).

А вообще, все эти методы используются на усмотрение программиста. Встречался с таким, что для всех запросов использовался только POST (и для получения данных, и для передачи).

По поводу заголовка Content-Type. Вы указываете text/plain, а передаёте json (Content-Type: application/json). А если учесть, что база-приёмник ни как этот заголовок не использует, то его вообще можно не передавать.

Ну и я бы настоятельно рекомендовал перед изучением создания http сервисов, сначала изучить HTTP-протокол. Хотя бы, с прочтения статьи на википедии: https://ru.wikipedia.org/wiki/HTTP
RustIG; Fox-trot; +2 Ответить
13. Aquashop 46 12.10.20 21:31 Сейчас в теме
Очень подробно, в свое время не хватало этого=)
20. aspirator23 339 18.10.20 17:42 Сейчас в теме
Есть ограничения на длину передаваемой строки в этом запросе HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаНоменклатураJSON); ?
22. BlinOFF 7 04.12.20 11:04 Сейчас в теме
Здравствуйте!Скачал cf из примера, установил, на стороне приемника
СтрокаНоменклатураJSON = Запрос.ПолучитьТелоКакСтроку();
приходит пустая строка. Подскажите что не так? Платформа
1С:Предприятие 8.3 (8.3.16.1224)
upd: обновление платформы до 8.3.18 решило проблему
23. mikl79 119 08.12.20 10:53 Сейчас в теме
Добрый день.

Сделал все как описано, но HTTPОтвет получает код 500:

Результат = Соединение.ОтправитьДляОбработки(HTTPЗапрос);

Результат работы: Результат.КодСостояния = 500

В чем может быть причина?
24. acvatoris 534 09.12.20 22:01 Сейчас в теме
Добрый день. Высылаю Вам ссылку на cf файл. Проверьте еще раз, то что вы сделали с файлом. Может все-таки где-то ошибка.
https://yadi.sk/d/oQK4EjKZiN1a4Q
25. user817897 2 21.12.20 15:58 Сейчас в теме
Помогло разобраться с проблемой(дело в том что забыл прописать /hs/ , и просто не замечал...)
Спасибо
26. unknown181538 155 28.08.22 02:07 Сейчас в теме
Спасибо! Помогло очень быстро сделать по образцу! Очень читабельно написано.
acvatoris; +1 Ответить
27. unknown181538 155 28.08.22 04:46 Сейчас в теме
Не понял только, как работать с ошибками. У меня была ошибка в коде в приемнике. В журнал регистрации она не записывалась, отладчик тоже не получилось подключить.
28. acvatoris 534 28.08.22 17:13 Сейчас в теме
Добрый день. Непонятно о каких ошибках идет речь. Может быть эта статья вам поможет https://infostart.ru/1c/articles/1298261/
29. unknown181538 155 28.08.22 21:27 Сейчас в теме
(28) Ну обычные ошибки в коде обработчиков, там где я уже свой код создания документа написал. То, что должно было бы возвращать "поле объекта на найдено".
Посмотрел ссылку - да, возможно, адрес отладчика надо вставить. Спасибо, попробую позже.
30. Attya 04.05.23 14:41 Сейчас в теме
Добрый день. А как можно отправить не json, а несколько файлов?
31. KHoroshulinAV 174 19.05.23 11:02 Сейчас в теме
32. user1192594 19.05.23 13:26 Сейчас в теме
Добрый день. Спасибо за пример.
Может стоит уточнить, что в строке
" Сервер = "localhost"; " может потребоваться указать нестандартный порт.
33. puzanov1973 10.11.23 17:11 Сейчас в теме
Добрый день!
Как ввести логин/пароль для подключения к приемнику?
34. acvatoris 534 11.11.23 09:14 Сейчас в теме
Добрый день. Задачу авторизации пользователя можно решить разными способами. Один из самых простых - например - Базовая авторизация (Basic Auth).
Данный способ авторизации заключается в том , что вы в заголовок http запроса передаете ключ "authorization" с значением. В общем виде это выглядит так 'authorization': строка в которой содержится логин и пароль зашифрованная в формате Base64.

Вот полный пример 'authorization': "Basiс" + " " + ФункцияКотораяПреобразовываетСтрокуВБазе64("ИмяПользователя:ПарольПользователя")

Вот , примерно, так выглядит функция , которая создает значение для ключа "authorization" на языке dart:

String basicAuthorization(String userName, String password) {

return 'Basic ${base64Encode(utf8.encode('$userName:$password'))}';

}
И хэш мэп заголовков:

Map<String, String> headers = {
"accept": "application/json",
"content-type": "application/json;charset=UTF-8",
'charset': 'utf-8',
'authorization': basicAuthorization("user", "pass"),
};
Оставьте свое сообщение