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

Простой 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);
   
ТекстОтвета = Ответ.ПолучитьТекст();
   
УдалитьФайлы(ФайлЗапроса);
   
УдалитьФайлы(ФайлРезультата);
КонецПроцедуры

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

 

25 Comments

  1. Den_D

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

    Reply
  2. dour-dead
  3. Den_D

    (2) dour-dead, да я смотрел и эту обработку, но вариант этого автора мне нравится больше

    Reply
  4. boffart

    Рекомендую использовать таймауты в запросах к серверу.

    Иначе 1С «Замрет» на долго.

    Reply
  5. ineshyk

    Подскажите, как реализовать такой 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.

    Reply
  6. skyp

    Автор молодец! С год назад пытался такое реализовать в 1С8 и не смог, несмотря на то, что ранее уже сделал это в 1С77. А здесь — просто, и с указанием подводных камней, привычных уже в 1С с ее зачаточной «документацией» по НТТР…

    Reply
  7. LexSeIch

    Мир этому дому!

    Плюс за статью и открытость публикации кода.

    Reply
  8. quick

    Все это хорошо, пока под виндой.

    Походу пора нормально прикручивать питон к 8-ке под всеми ОС, тогда и головная боль с такими задачами отпадет.

    Reply
  9. opx

    Поумничаю немного:

    Соединение = Новый HTTPСоединение(«public.services.dellin.ru»;);

    ЗаголовокHTTP = Новый Соответствие();

    ЗаголовокHTTP.Вставить(«Content-Type», «application/x-www-form-urlencoded»);

    Запрос = Новый HTTPЗапрос(«/tracker/XML/»,ЗаголовокHTTP);

    Запрос.УстановитьТелоИзСтроки(«&rwID=» + СокрЛП(НомерНакладной));

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

    ОтветВВидеСтроки = Ответ.ПолучитьТелоКакСтроку(«UTF-8»);

    Быстрее, проще веселее!

    Reply
  10. daryz

    Делаю все как пишет «opx»:

    Соединение = Новый HTTPСоединение(«sambonn.ru»);

    Запрос = Новый HTTPЗапрос(«/admin/import/»);

    Запрос.УстановитьТелоИзСтроки(«?action=ping»);

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

    ОтветВВидеСтроки = Ответ.ПолучитьТелоКакСтроку(«UTF-8»);

    Сообщить(«Ответ сата: » + ОтветВВидеСтроки);

    Ничего не выводится, а должен быть ответ «0» или «1». В чем подвох?

    Reply
  11. 7OH

    При работе с HTTPS методы с HTTPСоединение выдают ошибку про сертификаты.

    Куча методик с разных сайтов (про cacert.pem) увы не помогла.

    А вот с WinHttp.WinHttpRequest всё просто полетело.

    Спасибо за строки.

    Reply
  12. mar_a
    Reply
  13. VlaMir

    Спасибо автору, хотел добыть QR с «chart.googleapis.com/chart»,

    метод с GET и ПолучитьCOMОбъект(«»,»Microsoft.XMLHTTP»);

    не проходил с передачей большого объема кодирования,

    с запросом POST не получилось не понимал запрос ни в какую, сам тупил,

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

    Ваш метод попробовал ч.з. COMОбъект(«WinHttp.WinHttpRequest.5.1»), все окей.

    Хотя сейчас использую OcvitaBarcode.

    Reply
  14. sr5

    (9) opx, Веселее, но для 8.2.14 не подходит, там еще нет HTTP-команд (

    Reply
  15. sr5

    Вариант 1 на 8.2.14 работает, спасибо автору…

    Reply
  16. binex

    (11) 7OH,

    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;

    HTTPСоединение = Новый HTTPСоединение(«dip.7cont.ru»,,,,,,ЗащищенноеСоединение);

    Reply
  17. FlagmanGK

    Подскажите, где ошибка?

     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)

    Показать

    Reply
  18. Tapochki-tmn

    Поделюсь из своего личного опыта.

    Вдруг кому пригодится.

    Получал от сервера ошибку 400, типа, «Internal server error».

    Причем, именно при запросе из 1С. Другими средствами запрос обрабатывался.

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

    //Вызывало ошибку:

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

    //Взлетело:

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

    //»CESU-8″ — Кодировка CESU-8 это и есть UTF-8 без BOM,

    //приходится прописывать кодировку текстом, т.к. в текущей версии платформы

    //или из за режима совместимости третий параметр метода УстановитьТелоИзСтроки(ТекстPOSTЗапроса,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать) не доступен,

    //а в КодировкаТекста отсутствует вид кодировки «CESU-8»

    Reply
  19. Dimitrij

    Добрый день,

    Столкнулся с проблемой.

    $data = array( ‘secret’ => ‘972725f8566849d3a1b26g0d0a15fdc1’, ‘id’ => ‘CE100006045LV’, ); Это на PHP.

    В 1с это выглядит Запрос.УстановитьТелоИзСтроки(«secret=пароль&id=номеркоробки»);

    Но как мне передать:

    $data = [ ‘secret’ => ‘972725f8566849d3a1b26g0d0a15fdc1’, ‘parcels’ => [ ‘internalID1’ => [ ‘type’ => ‘Ie’, ‘name_surname’ => ‘имя’, ‘city’ => ‘Jelgava’, ‘zipcode’ => ‘LV-1234’, ‘phone’ => ‘21234567’, ‘country_id’ => 4, ‘multiparcel’=>1, ‘group_uid’=>572725f8-5668-49d3-a1b2-620d0a15fdc6 ],

    Не понимаю как корректно это все написать. Пробовал ЧтениеJSON, файлами… не получается.

    Заранее спасибо!

    Reply
  20. mar_a

    secret=972725f8566849d3a1b26g0d0a15fdc1&parcels[internalID1][type]=Ie&parcels[internalID1][name_surname]=имя&….

    ..&group_uid=572725f8-5668-49d3-a1b2-620d0a15fdc6

    Reply
  21. Dimitrij

    (20) Большое спасибо!

    Reply
  22. Stas84

    18 -> то что нужно. Спасибо большое

    Reply
  23. papche

    (18)

    CESU-8

    Большое спасибо, пригодилось!

    Reply
  24. BratLi

    (18)

    Reply
  25. BratLi

    (18) Спасибо, заработало!

    Reply

Leave a Comment

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