gifts2017

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

ќпубликовал arhal-ya@yandex.ru в раздел ќбмен - »нтеграци€ с 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
103
.epf 7,07Kb 103 —качать

—м. также

ѕодписатьс€ ƒобавить вознаграждение

 омментарии

1. ƒенис (Den_D) 19.12.12 16:04
ѕыталс€ реализовать отправку GET и POST запросов штатными средствами 1— ничего не получилось. Ќа просторах интернета нашел такую же схему. ¬ любом случае спасибо, теперь в поиске на инфостарте люд€м можно будет легко найти эти несколько полезных строк.
3. ƒенис (Den_D) 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) 13.07.13 13:16
јвтор молодец! — год назад пыталс€ такое реализовать в 1—8 и не смог, несмотр€ на то, что ранее уже сделал это в 1—77. ј здесь - просто, и с указанием подводных камней, привычных уже в 1— с ее зачаточной "документацией" по Ќ““–...
7. —ергей ћаслов (LexSeIch) 31.07.13 12:36
ћир этому дому!
ѕлюс за статью и открытость публикации кода.
8. ≈вгений —то€нов (quick) 13.12.13 12:21
¬се это хорошо, пока под виндой.
ѕоходу пора нормально прикручивать питон к 8-ке под всеми ќ—, тогда и головна€ боль с такими задачами отпадет.
9. ѕавел ќпарин (opx) 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");

Ѕыстрее, проще веселее!
Crazy_kz; Alexander.Shvets; TreeDogNight; savinsva; Spacer; white_sochi; DrAku1a; rbbs; AlX0id; daryz; griffer; +11 ќтветить 1
10. ƒарь€ «отова (daryz) 04.08.14 09:19
ƒелаю все как пишет "opx":

—оединение = Ќовый HTTP—оединение("sambonn.ru");
«апрос = Ќовый HTTP«апрос("/admin/import/");
«апрос.”становить“ело»з—троки("?action=ping");
ќтвет = —оединение.ќтправитьƒл€ќбработки(«апрос);
ќтвет¬¬иде—троки = ќтвет.ѕолучить“ело ак—троку("UTF-8");
—ообщить("ќтвет сата: " + ќтвет¬¬иде—троки);

Ќичего не выводитс€, а должен быть ответ "0" или "1". ¬ чем подвох?
11. —емЄн ѕавлюков (7OH) 03.10.14 10:56
ѕри работе с HTTPS методы с HTTP—оединение выдают ошибку про сертификаты.
 уча методик с разных сайтов (про cacert.pem) увы не помогла.
ј вот с WinHttp.WinHttpRequest всЄ просто полетело.
—пасибо за строки.
@Sonya; Spacer; +2 ќтветить 1
12. Evgeny K (mar_a) 24.09.15 10:25
≈сть иде€ переделать свое приложение ( https://infostart.ru/public/376254/ ) по данному методу (так сказать без установки дополнительного —ќћ объекта (NestNet45.dll) -на уже встроенном)
» так авторизацию по DIGEST проходит без вопросов, но результат отдает сервер (внешний)
в кодировке UTF-8.
1C 8.2 отображает русские символы в виде такой беды:
КРÐХÐФÐШТ ÐšÐÐ Ð¢ÐšÐžÐЃ

символьно похоже на UTF-8, перекодировка на лету мне не известна (может кто и подскажет)
¬от код который кидаю в хедерах но он картину не мен€ет

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");
...ѕоказать —крыть


ставил кодовую страницу как win1251, cp1251, koi8R(U) и т.д. результат не мен€етс€
ѕричем строка WinHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
портит картину с Digest авторизацией...
если ее нет - то авторизаци€ проходит с внешним сервером на ”–ј!
Ќо кодировка UTF-8 в 1— 8.2 коректно не отображаетс€.
 ак только строку setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8") вставл€ем - то 501 ошибка из вне (с HTTP сервака) приходит.

¬опрос банальный - кто и как получал человеческую кирилицу котора€ адекватно отображаетс€ в 1— 8.2
хочу получить универсальный инструмент дл€ работы и 8.х и 7.7(на будующее).

«аранеевсем спасибо.
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) 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)

ƒл€ написани€ сообщени€ необходимо авторизоватьс€
ѕрикрепить файл
ƒополнительные параметры ответа