IE2017

Простой POST-запрос.

Обмен - Интеграция с WEB

Простой Post-запрос, который максимально просто позволяет отправить серверу данные и получить ответ.

В сети, и в том числе на этом сайте, много тем по этому поводу. Содержимое большинства из них громоздки и запутанны. В числе прочего упоминается кодировка отправляемых данных в Base64, использование разделителей для отправки различных данных в одном запросе и т.д. В прилагаемой обработке все упрощено до минимума и "дебри" не рассматриваются. Предназначена для использования в качестве универсальной болванки для реализации более сложного функционала. В качестве примера используется сервис общеизвестной транспортной компании. В пост-запросе оправляется номер накладной, в ответ возвращается xml с информацией о её состоянии. На скрин-шоте реальная накладная (спасибо гуглу) на которой тестировал работоспособность. 

Качать все не обязательно, выкладываю весь код модуля формы:


Процедура КнопкаВыполнитьНажатие(Кнопка)
    Попытка
       
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
       
WinHttp.Option(2,"utf-8");
       
WinHttp.Open("POST","http://public.services.dellin.ru/tracker/XML/",0);
       
WinHttp.SetRequestHeader("Accept-Language", "ru");
       
WinHttp.SetRequestHeader("Accept-Charset","utf-8");
       
WinHttp.setRequestHeader("Content-Language", "ru");
       
WinHttp.setRequestHeader("Content-Charset", "utf-8");
       
WinHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
       
ПараметрыПОСТ = "rwID=" + СокрЛП(НомерНакладной);
       
WinHttp.Send(ПараметрыПОСТ);
       
ТекстОтвета = WinHttp.ResponseText();
    Исключение
       
Сообщить(ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Где "НомерНакладной" - это строковое поле ввода на форме, куда вводите номер накладной (например, Сю-00090170085), а "ТекстОтвета" - это многострочное строковое поле, куда выводим результат. 

После комментария Den_D решил добавить тоже самое, только встроенными средствами. Обратите внимание на амперсанд перед параметром - сэкономите время и нервы. Это обычная "особенность" 1С, которая решила что неважно сколько у вас там параметров - ставьте амперсанд ВСЕГДА ибо мы так хотим.

Обработку обновил.

Ну и код для нежелающих качать выкладываю. Надеюсь при этом на вашу социальную "плюсоответственность".


Процедура ОсновныеДействияФормыВыполнить2(Кнопка)
   
Сервер = "public.services.dellin.ru";
   
Ресурс = "/tracker/XML/";
   
HTTP =  Новый HTTPСоединение(Сервер);
   
ФайлЗапроса = ПолучитьИмяВременногоФайла();
   
ТекстовыйФайл = Новый ТекстовыйДокумент;
   
ТекстовыйФайл.УстановитьТекст("&rwID=" + СокрЛП(НомерНакладной));
   
ТекстовыйФайл.Записать(ФайлЗапроса, КодировкаТекста.UTF8);
   
ФайлРезультата = ПолучитьИмяВременногоФайла();
   
ЗаголовокHTTP = Новый Соответствие();
   
ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");
   
ЗаголовокHTTP.Вставить("Accept-Language", "ru");
   
ЗаголовокHTTP.Вставить("Accept-Charset", "utf-8");
   
ЗаголовокHTTP.Вставить("Content-Language", "ru");
   
ЗаголовокHTTP.Вставить("Content-Charset", "utf-8");
   
HTTP.ОтправитьДляОбработки(ФайлЗапроса, Ресурс, ФайлРезультата, ЗаголовокHTTP);
   
Ответ = Новый ТекстовыйДокумент();
   
Ответ.Прочитать(ФайлРезультата, КодировкаТекста.UTF8);
   
ТекстОтвета = Ответ.ПолучитьТекст();
   
УдалитьФайлы(ФайлЗапроса);
   
УдалитьФайлы(ФайлРезультата);
КонецПроцедуры

Исключения было лень писать... Но работоспособность проверял.

 

Скачать файлы

Наименование Файл Версия Размер
Пост-запрос
.epf 7,07Kb
20.12.12
110
.epf 7,07Kb 110 Скачать

См. также

Комментарии
1. Денис (Den_D) 48 19.12.12 16:04 Сейчас в теме
Пытался реализовать отправку GET и POST запросов штатными средствами 1С ничего не получилось. На просторах интернета нашел такую же схему. В любом случае спасибо, теперь в поиске на инфостарте людям можно будет легко найти эти несколько полезных строк.
3. Денис (Den_D) 48 28.03.13 16:10 Сейчас в теме
(2) dour-dead, да я смотрел и эту обработку, но вариант этого автора мне нравится больше
4. Astor (boffart) 15.04.13 07:52 Сейчас в теме
Рекомендую использовать таймауты в запросах к серверу.
Иначе 1С "Замрет" на долго.
5. Игорь Нешик (ineshyk) 12.07.13 00:55 Сейчас в теме
Подскажите, как реализовать такой POST запрос в 1С?

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

code=4/v6xr77ewYqhvHSyW6UJ1w7jKwAzu&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2-login-demo.appspot.com/code&
grant_type=authorization_code

делаю как описано в статье, выдает ошибку 302.
6. Сергей Концеропятов (skyp) 34 13.07.13 13:16 Сейчас в теме
Автор молодец! С год назад пытался такое реализовать в 1С8 и не смог, несмотря на то, что ранее уже сделал это в 1С77. А здесь - просто, и с указанием подводных камней, привычных уже в 1С с ее зачаточной "документацией" по НТТР...
7. Сергей Маслов (LexSeIch) 184 31.07.13 12:36 Сейчас в теме
Мир этому дому!
Плюс за статью и открытость публикации кода.
8. Евгений Стоянов (quick) 559 13.12.13 12:21 Сейчас в теме
Все это хорошо, пока под виндой.
Походу пора нормально прикручивать питон к 8-ке под всеми ОС, тогда и головная боль с такими задачами отпадет.
9. Павел Опарин (opx) 439 24.01.14 14:17 Сейчас в теме
Поумничаю немного:

Соединение = Новый HTTPСоединение("public.services.dellin.ru";);
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");
Запрос = Новый HTTPЗапрос("/tracker/XML/",ЗаголовокHTTP);
Запрос.УстановитьТелоИзСтроки("&rwID=" + СокрЛП(НомерНакладной));
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ОтветВВидеСтроки = Ответ.ПолучитьТелоКакСтроку("UTF-8");

Быстрее, проще веселее!
tinkerbell; vovial; Crazy_kz; Alexander.Shvets; TreeDogNight; savinsva; Spacer; white_sochi; DrAku1a; rbbs; AlX0id; daryz; griffer; +13 Ответить 1
10. Дарья Зотова (daryz) 04.08.14 09:19 Сейчас в теме
Делаю все как пишет "opx":

Соединение = Новый HTTPСоединение("sambonn.ru");
Запрос = Новый HTTPЗапрос("/admin/import/");
Запрос.УстановитьТелоИзСтроки("?action=ping");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ОтветВВидеСтроки = Ответ.ПолучитьТелоКакСтроку("UTF-8");
Сообщить("Ответ сата: " + ОтветВВидеСтроки);

Ничего не выводится, а должен быть ответ "0" или "1". В чем подвох?
11. Семён Павлюков (7OH) 31 03.10.14 10:56 Сейчас в теме
При работе с HTTPS методы с HTTPСоединение выдают ошибку про сертификаты.
Куча методик с разных сайтов (про cacert.pem) увы не помогла.
А вот с WinHttp.WinHttpRequest всё просто полетело.
Спасибо за строки.
@Sonya; Spacer; +2 Ответить 1
12. Evgeny K (mar_a) 17 24.09.15 10:25 Сейчас в теме
13. VlaMir (VlaMir) 19.01.16 22:22 Сейчас в теме
Спасибо автору, хотел добыть QR с "chart.googleapis.com/chart",
метод с GET и ПолучитьCOMОбъект("","Microsoft.XMLHTTP");
не проходил с передачей большого объема кодирования,
с запросом POST не получилось не понимал запрос ни в какую, сам тупил,
наткунлся на Вашу статью оказалось не правильно передавал параметры.
Ваш метод попробовал ч.з. COMОбъект("WinHttp.WinHttpRequest.5.1"), все окей.
Хотя сейчас использую OcvitaBarcode.
14. sr (sr5) 02.02.16 13:53 Сейчас в теме
(9) opx, Веселее, но для 8.2.14 не подходит, там еще нет HTTP-команд (
15. sr (sr5) 02.02.16 14:09 Сейчас в теме
Вариант 1 на 8.2.14 работает, спасибо автору...
16. Денис Новосёлов (binex) 210 27.02.16 08:29 Сейчас в теме
(11) 7OH,

ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
HTTPСоединение = Новый HTTPСоединение("dip.7cont.ru",,,,,,ЗащищенноеСоединение);
17. Pavel K (FlagmanGK) 03.05.16 14:28 Сейчас в теме
Подскажите, где ошибка?
	WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); 
	WinHttp.Option(2,"UTF-8");
	
	WinHttp.Open("POST","http://api.site.ru/rpc");
	WinHttp.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
	WinHttp.Send(СформироватьСтрокуJSON(СтруктураЗапроса));
...Показать Скрыть

Когда отправляю так, то все работает...
но если отправляю через http соединение
	Соединение = Новый HTTPСоединение("api.site.ru", , , , , ложь);    	
	ЗаголовокHTTP = Новый Соответствие();                 
	ЗаголовокHTTP.Вставить("Content-Type", "application/json; charset=utf-8");
	ФайлЗапроса = КаталогВременныхФайлов()+"1";
	файл = новый ЗаписьТекста(ФайлЗапроса);
	Файл.ЗаписатьСтроку(ОповещениеВК.СформироватьСтрокуJSON(СтруктураЗапроса));
	файл.Закрыть();
	ФайлРезультата=ПолучитьИмяВременногоФайла();
	Соединение.ОтправитьДляОбработки(ФайлЗапроса,"/rpc", 
                           ФайлРезультата, ЗаголовокHTTP);
...Показать Скрыть


То выдает ошибку
Соединение.ОтправитьДляОбработки(ФайлЗапроса,"/rpc",
по причине:
Ошибка при выполнении файловой операции '/rpc'
по причине:
Ошибка работы с Интернет: Ошибка доступа к ресурсу. Путь не найден: (400). SyntaxError: Unexpected token ?
at Object.parse (native)
at /var/www/v2/corev2/node_modules/express/node_modules/connect­/lib/middleware/json.js:75:25
at IncomingMessage.onEnd (/var/www/v2/corev2/node_modules/express/node_modules/connect­/node_modules/raw-body/index.js:109:7)
at IncomingMessage.g (events.js:199:16)
at IncomingMessage.emit (events.js:104:17)
at _stream_readable.js:908:16
at process._tickDomainCallback (node.js:381:11)
по причине:
Ошибка работы с Интернет: Ошибка доступа к ресурсу. Путь не найден: (400)

18. Николай Степанов (Tapochki-tmn) 41 23.05.17 15:45 Сейчас в теме
Поделюсь из своего личного опыта.
Вдруг кому пригодится.

Получал от сервера ошибку 400, типа, "Internal server error".
Причем, именно при запросе из 1С. Другими средствами запрос обрабатывался.

В результате оказалось вот в чем дело:

//Вызывало ошибку:
//Запрос.УстановитьТелоИзСтроки(ТекстPOSTЗапроса, КодировкаТекста.UTF8);

//Взлетело:
Запрос.УстановитьТелоИзСтроки(ТекстPOSTЗапроса, "CESU-8");

//"CESU-8" - Кодировка CESU-8 это и есть UTF-8 без BOM,
//приходится прописывать кодировку текстом, т.к. в текущей версии платформы
//или из за режима совместимости третий параметр метода УстановитьТелоИзСтроки(ТекстPOSTЗапроса,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать) не доступен,
//а в КодировкаТекста отсутствует вид кодировки "CESU-8"
Оставьте свое сообщение