Простой 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 не будет опубликован. Обязательные поля помечены *