Учимся создавать 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

См. также

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

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

12000 руб.

02.09.2020    169304    937    403    

905

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    11395    sergey279    18    

65

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

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6340    XilDen    36    

83

Запросы Программист Запросы Бесплатно (free)

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

16.08.2024    9071    user1840182    5    

28

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

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2727    ivanov660    9    

22

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

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

15.05.2024    10220    implecs_team    6    

48

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

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

11.04.2024    3625    andrey_sag    10    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user1304317 11.10.20 15:39 Сейчас в теме
2. user1464234 11.10.20 17:18 Сейчас в теме
Подскажите пож-ста, можно ли все это реализовать в виде расширения, например к БП 3?
Общий модуль и обработки в расширение включаются, а вот остальные упомянутые в статье объекты метаданных?
5. platonov.e 160 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 267 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 3758 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 557 12.10.20 11:11 Сейчас в теме
Скажем так, если в v7plus есть методы, которые позволяют подлючиться к http сервису, если есть методы, которые позволяют помещать данные в тело запроса, то можно, если нет, то увы.
user1464234; +1 Ответить
4. Fox-trot 163 12.10.20 06:49 Сейчас в теме
(0) поиск дубля не помешал бы перед тем как создавать новый элемент справочника
8. dsdred 3758 12.10.20 11:56 Сейчас в теме
обработка ИзучениеPOSTЗапросов
а на картинке ИзчениеPOSTЗапросов

для JSON наверное правильнее
HTTPЗапрос.Заголовки.Вставить("Content-Type","application/json");
10. Поручик 4661 12.10.20 14:12 Сейчас в теме
(8) Смотря как сервер-приёмник обрабатывает данные.
11. dsdred 3758 12.10.20 14:44 Сейчас в теме
(10)Чаще всего если сервис сторонний то разворачивают без этого заголовка.
К примеру сейчас обмен с API IIKO делаю, там этот момент не документирован, но без этого заголовка кушать запросы отказывается.
9. ICeZm 24 12.10.20 14:09 Сейчас в теме
12. ltfriend 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 340 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 120 08.12.20 10:53 Сейчас в теме
Добрый день.

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

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

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

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