27.08.2012, 09:40 | #1 |
Участник
|
http post из Аксапты 3,0
Здраствуйте,
Неимею опыта работать с наружным веб сервисом . Мне надо из Аксапты 3.0 поключиться к вебу , даст параметры как POST и получить ответ . Помогите пожалуйста ... X++: Str url, req_params; str response; COM objXHTTP; binData binData = new binData(); url = 'https://go.venipak.lt/ws/print_label'; req_params = 'user=усернаме&pass=пасжорд&code=12345678901234'; objXHTTP = new COM("MSXML2.XMLHTTP"); objXHTTP.open("POST", url, false); objXHTTP.send(req_params); if (objXHTTP.responsebody()) { url = strfmt( "%1", objXHTTP.responsebody() ); info( url ); } С уважением , Римантас |
|
27.08.2012, 10:04 | #2 |
Участник
|
вот тут посмотрите \Classes\tutorial_SMSHandler\sendMessage
|
|
27.08.2012, 10:28 | #3 |
Участник
|
Спасибо за направление ...
Ну пока неуспешно ... Вот мой код , по етому примеру : X++: soapMessageTemplate = @' <?xml version="1.0" encoding="utf-8" standalone="no"?> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <message xmlns="urn:prin_link" > <submit> <user>%1</user> <pass>%2</pass> <pack_no >%3</pack_no> </submit> </message> </s:Body> </s:Envelope>'; soapMessage = strFmt( soapMessageTemplate, "усер", "пасв", "002350858" ); req = new XMLHTTPRequest(); d = XMLDocument::newXML( soapMessage ); req.open( 'POST', 'https://go.venipak.lt/ws/print_link' ); req.sendXML( d ); reply = XMLDocument::newXML( req.responseText() ); n = reply.documentElement(); ErrorCode : -1072896682 reason : Invalid at the top level of the document., url : srcText : Error: Incorrect username or password. filePosition: 0 lineNumber : 1 linePosition: 1 XML invalid, error code: -1072896682 Что я делаю плохо ? |
|
27.08.2012, 11:16 | #4 |
Участник
|
srcText : Error: Incorrect username or password.
на open имя пользователя и пароль нужно передавать, типа того req.open("POST",'https://go.venipak.lt/ws/print_link' ,"user", "password"); Или он без пароля? ну и судя по ошибке reason : Invalid at the top level of the document., url : cо структурой XML что-то не в порядке |
|
27.08.2012, 12:30 | #5 |
Участник
|
А что такое objXHTTP? XMLHTTPRequest?
Насколько я знаю, чтобы он подключился к стороннему серверу, нужно на сервере что-то там шаманить. А почему бы Вам не использовать WinInet? У меня прекрасно работает обмен из Аксапты 3.0 с http сервером методом post с помощью WinInet |
|
27.08.2012, 12:45 | #6 |
Участник
|
Цитата:
Могли вы подделиться исходником как примером ? XMLHTTPRequest или objXHTTP я пробывал потому , что ети штутки имеет POST возможность . А вот как с WinInet сделать POST - незнаю ... Мне именно надо POST . |
|
27.08.2012, 13:11 | #7 |
Участник
|
Цитата:
Работающим примером вряд ли поделюсь, так как стандартные классы обросли всякой спецификой и выделить оттуда часть чтобы она у вас заработала будет непросто. Вот небольшой пример в качестве идеи: X++: int internetOpenUrl(str url,int flags = 0,int context = 0) { str serverName; str urlName; str data; str hdr; int hdl, pos, pos1, res; int status; ; pos = strfind(url, '@', 1, strlen(url)); if (pos == 0) pos = strfind(url, '/', 1, strlen(url))+1; else url = strdel(url,1, pos); pos = strfind(url, '/', 1, strlen(url)); pos1 = strfind(url, '?', 1, strlen(url)); serverName = substr(url, 1, pos-1); hdl = this.internetConnect(serverName,80); if (_method == 0) { //Метод Get urlName = substr(url, pos, strlen(url) - pos + 1); data = ''; hdr = ''; hdl = this.OpenRequest(hdl, urlName, 'GET'); } else { //Метод POST urlName = substr(url, pos, pos1 - pos); data = substr(url, pos1+1, strlen (url) - pos1); hdr = 'Content-Type: application/x-www-form-urlencoded'; hdl = this.OpenRequest(hdl, urlName, 'POST'); } if (login) { this.internetSetOption(hdl, 28, login); this.internetSetOption(hdl, 29, pass); } res = this.SendRequest(hdl, hdr, data); return hdl; } Вообще я Вам советую написать сначала программу с помощью API функций WinInet (примеров в сети полно), например, на Delphi или C++, удостовериться, что все работает и потом уже повторять тоже самое в аксапте. Например, судя по вашему коду, Вы обращаетесь к сервису по https, а для этого должен быть открыт 443 порт на железках вашей локальной сети (прокси-сервер, например), если таковые имеются. В общем исключить прежде всего проблемы доступа. |
|
27.08.2012, 13:52 | #8 |
Участник
|
Цитата:
Сообщение от Lucky13
Я имею в виду именно POST, WinInet тоже так умеет, просто нужно аксапту немного допилить.
Вот небольшой пример в качестве идеи: X++: int internetOpenUrl(str url,int flags = 0,int context = 0) { hdl = this.OpenRequest(hdl, urlName, 'GET'); hdl = this.OpenRequest(hdl, urlName, 'POST'); } Вообще я Вам советую написать сначала программу с помощью API функций WinInet (примеров в сети полно), например, на Delphi или C++, удостовериться, что все работает и потом уже повторять тоже самое в аксапте. Например, судя по вашему коду, Вы обращаетесь к сервису по https, а для этого должен быть открыт 443 порт на железках вашей локальной сети (прокси-сервер, например), если таковые имеются. В общем исключить прежде всего проблемы доступа. |
|
27.08.2012, 15:00 | #9 |
Участник
|
Цитата:
Работало это как то так X++: static void Job29(Args _args) { binData binData = new binData(); COM objXHTTP; ; objXHTTP = new COM("MSXML2.XMLHTTP"); objXHTTP.open("POST", "url с формой логина пароля", false); objXHTTP.setRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)"); objXHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); objXHTTP.send("login=тратата&password=пароль&submit1=Login"); objXHTTP.open("GET", "url с адресом страницы, запрашиваемой после авторизацииurl", false); objXHTTP.setRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)"); objXHTTP.send(); if (objXHTTP.responsebody()) { binData.setVariant(objXHTTP.responsebody()); } else { // } } |
|
27.08.2012, 15:04 | #10 |
Участник
|
Цитата:
Почитайте, например, здесь http://www.rsdn.ru/article/inet/wininet.xml |
|
27.08.2012, 15:20 | #11 |
Участник
|
Rimantas,
Вы XML структуру их примера взяли? Так это не правильно, нужно свою написать, ту которую ожидает Ваш url. Поэтому и ошибка reason : Invalid at the top level of the document., а с WinInet не уверен что проще будет. Мучался с ней ftp прикручивал, сделал конечно но потом отказался и переделал на внешнюю DLL |
|
27.08.2012, 16:55 | #12 |
Участник
|
Цитата:
Сообщение от Lucky13
Пример из Ax 3.0 сто процентов, просто нужно дописать недостающие функции в классе WinInet. OpenRequest - это WinAPI функция и для нее можно написать оболочку в Аксапте.
Почитайте, например, здесь http://www.rsdn.ru/article/inet/wininet.xml |
|
27.08.2012, 16:58 | #13 |
Участник
|
Цитата:
Сообщение от michel1971
Rimantas,
Вы XML структуру их примера взяли? Так это не правильно, нужно свою написать, ту которую ожидает Ваш url. Поэтому и ошибка reason : Invalid at the top level of the document., а с WinInet не уверен что проще будет. Мучался с ней ftp прикручивал, сделал конечно но потом отказался и переделал на внешнюю DLL Про хмл Вы прав . Написал письмо и жду ответа от админов сайта как там нужно обращаться ... |
|
27.08.2012, 17:04 | #14 |
Участник
|
Цитата:
X++: objXHTTP = new COM("MSXML2.XMLHTTP"); objXHTTP.open("POST", "https://go.venipak.lt/ws/print_label", false); objXHTTP.setRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)"); objXHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); objXHTTP.send( "user=ut&pass=hidenpasw&code=002350858" ); if (objXHTTP.responseText() ) info( objXHTTP.responseText() ); |
|
27.08.2012, 18:11 | #15 |
Участник
|
Цитата:
Сообщение от Rimantas
Интересно - попробывал .
X++: objXHTTP = new COM("MSXML2.XMLHTTP"); objXHTTP.open("POST", "https://go.venipak.lt/ws/print_label", false); objXHTTP.setRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)"); objXHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); objXHTTP.send( "user=ut&pass=hidenpasw&code=002350858" ); if (objXHTTP.responseText() ) info( objXHTTP.responseText() ); Чтобы заработало нужно сначала в браузере воспроизвести последовательность команд, при которой web сервер принимает запрос и отражает необходимый ответ, а уже затем переносить это в аксапту. в адресе url который у вас X++: objXHTTP.open("POST", "https://go.venipak.lt/ws/print_label", false); а у вас указан адрес страницы, которая видимо, может работать только ПОСЛЕ авторизации, либо код авторизации принимать как то иначе чем в способе описанном мной выше. |
|
28.08.2012, 09:12 | #16 |
Участник
|
Цитата:
Сообщение от someOne
Судя по всему так работать у вас не будет.
Чтобы заработало нужно сначала в браузере воспроизвести последовательность команд, при которой web сервер принимает запрос и отражает необходимый ответ, а уже затем переносить это в аксапту. в адресе url который у вас X++: objXHTTP.open("POST", "https://go.venipak.lt/ws/print_label", false); а у вас указан адрес страницы, которая видимо, может работать только ПОСЛЕ авторизации, либо код авторизации принимать как то иначе чем в способе описанном мной выше. |
|
28.08.2012, 10:02 | #17 |
Участник
|
Проблема решена ... . Способ решения :
X++: url = "https://go.venipak.lt/ws/print_link"; req_params = strfmt( "user=%1&pass=%2&pack_no=%3", 'user', 'pasw', 'V00000E3750531' ); req_len = strfmt( "%1", strlen( req_params ) ); http = new XMLHttpRequest(); http.open( "POST", url ); http.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" ); http.setRequestHeader( "Content-length", req_len ); http.send( req_params ); response = http.responseText(); С уважением , Римантас |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|