AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.08.2012, 09:40   #1  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
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  
michel1971 is offline
michel1971
Участник
 
76 / 63 (3) ++++
Регистрация: 14.01.2011
вот тут посмотрите \Classes\tutorial_SMSHandler\sendMessage
Старый 27.08.2012, 10:28   #3  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от michel1971 Посмотреть сообщение
вот тут посмотрите \Classes\tutorial_SMSHandler\sendMessage
Спасибо за направление ...

Ну пока неуспешно ... Вот мой код , по етому примеру :

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  
michel1971 is offline
michel1971
Участник
 
76 / 63 (3) ++++
Регистрация: 14.01.2011
Цитата:
Сообщение от Rimantas Посмотреть сообщение
Что я делаю плохо ?
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  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
А что такое objXHTTP? XMLHTTPRequest?
Насколько я знаю, чтобы он подключился к стороннему серверу, нужно на сервере что-то там шаманить. А почему бы Вам не использовать WinInet? У меня прекрасно работает обмен из Аксапты 3.0 с http сервером методом post с помощью WinInet
Старый 27.08.2012, 12:45   #6  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от Lucky13 Посмотреть сообщение
А что такое objXHTTP? XMLHTTPRequest?
Насколько я знаю, чтобы он подключился к стороннему серверу, нужно на сервере что-то там шаманить. А почему бы Вам не использовать WinInet? У меня прекрасно работает обмен из Аксапты 3.0 с http сервером методом post с помощью WinInet
Lucky13,
Могли вы подделиться исходником как примером ? XMLHTTPRequest или objXHTTP я пробывал потому , что ети штутки имеет POST возможность . А вот как с WinInet сделать POST - незнаю ... Мне именно надо POST .
Старый 27.08.2012, 13:11   #7  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от Rimantas Посмотреть сообщение
Lucky13,
Могли вы подделиться исходником как примером ? XMLHTTPRequest или objXHTTP я пробывал потому , что ети штутки имеет POST возможность . А вот как с WinInet сделать POST - незнаю ... Мне именно надо POST .
Я имею в виду именно POST, WinInet тоже так умеет, просто нужно аксапту немного допилить.
Работающим примером вряд ли поделюсь, так как стандартные классы обросли всякой спецификой и выделить оттуда часть чтобы она у вас заработала будет непросто.

Вот небольшой пример в качестве идеи:
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;
}
Это метод класса WinInet. Недостающие переменные объявлены в классе и инициализируются parm-методами. Недостающие API-функции тоже реализованы в это классе. На вход дается адрес сервиса, а возвращаемое значение отдается функции WinInet.internetReadFile.
Вообще я Вам советую написать сначала программу с помощью API функций WinInet (примеров в сети полно), например, на Delphi или C++, удостовериться, что все работает и потом уже повторять тоже самое в аксапте.
Например, судя по вашему коду, Вы обращаетесь к сервису по https, а для этого должен быть открыт 443 порт на железках вашей локальной сети (прокси-сервер, например), если таковые имеются. В общем исключить прежде всего проблемы доступа.
Старый 27.08.2012, 13:52   #8  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от 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');
}
Это метод класса WinInet. Недостающие переменные объявлены в классе и инициализируются parm-методами. Недостающие API-функции тоже реализованы в это классе. На вход дается адрес сервиса, а возвращаемое значение отдается функции WinInet.internetReadFile.
Вообще я Вам советую написать сначала программу с помощью API функций WinInet (примеров в сети полно), например, на Delphi или C++, удостовериться, что все работает и потом уже повторять тоже самое в аксапте.
Например, судя по вашему коду, Вы обращаетесь к сервису по https, а для этого должен быть открыт 443 порт на железках вашей локальной сети (прокси-сервер, например), если таковые имеются. В общем исключить прежде всего проблемы доступа.
Спасибо за идею . Жаль , но ваш пример не из Аксапты 3.0 , я так думаю . Там в ВинИнет OpenRequest напр. нету . Наверное мне нужно было бы обновить WinInet классу для Аксапты 3.0 ...
Старый 27.08.2012, 15:00   #9  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 423 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от Rimantas Посмотреть сообщение
Здраствуйте,

Неимею опыта работать с наружным веб сервисом . Мне надо из Аксапты 3.0 поключиться к вебу , даст параметры как POST и получить ответ . Помогите пожалуйста ...
Раньше в Аксапте 3,0 делал так, чтобы отправить на сайт форму с логином и паролем, а затем, после авторизации, получить ответ по заданному URL

Работало это как то так

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  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Цитата:
Сообщение от Rimantas Посмотреть сообщение
Спасибо за идею . Жаль , но ваш пример не из Аксапты 3.0 , я так думаю . Там в ВинИнет OpenRequest напр. нету . Наверное мне нужно было бы обновить WinInet классу для Аксапты 3.0 ...
Пример из Ax 3.0 сто процентов, просто нужно дописать недостающие функции в классе WinInet. OpenRequest - это WinAPI функция и для нее можно написать оболочку в Аксапте.
Почитайте, например, здесь http://www.rsdn.ru/article/inet/wininet.xml
Старый 27.08.2012, 15:20   #11  
michel1971 is offline
michel1971
Участник
 
76 / 63 (3) ++++
Регистрация: 14.01.2011
Rimantas,
Вы XML структуру их примера взяли? Так это не правильно, нужно свою написать, ту которую ожидает Ваш url. Поэтому и ошибка
reason : Invalid at the top level of the document.,

а с WinInet не уверен что проще будет. Мучался с ней ftp прикручивал, сделал конечно но потом отказался и переделал на внешнюю DLL
Старый 27.08.2012, 16:55   #12  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от Lucky13 Посмотреть сообщение
Пример из Ax 3.0 сто процентов, просто нужно дописать недостающие функции в классе WinInet. OpenRequest - это WinAPI функция и для нее можно написать оболочку в Аксапте.
Почитайте, например, здесь http://www.rsdn.ru/article/inet/wininet.xml
Да , Вы правы . Я потом заметил ето . Ещё с параметрами не все сделал . Можно там по умолчанию для HttpOpenRequestA и HttpSendRequestA задать как пустые ? То есть мне надо только урл, тип урл и дата ...
Старый 27.08.2012, 16:58   #13  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от michel1971 Посмотреть сообщение
Rimantas,
Вы XML структуру их примера взяли? Так это не правильно, нужно свою написать, ту которую ожидает Ваш url. Поэтому и ошибка
reason : Invalid at the top level of the document.,

а с WinInet не уверен что проще будет. Мучался с ней ftp прикручивал, сделал конечно но потом отказался и переделал на внешнюю DLL
Ну почему ? С WinInet у меня ftp крутиться хорошо , проблем нету . Поетому я хочу ето попробовать с POST , как у Lucky13 .

Про хмл Вы прав . Написал письмо и жду ответа от админов сайта как там нужно обращаться ...
Старый 27.08.2012, 17:04   #14  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от someOne Посмотреть сообщение
Раньше в Аксапте 3,0 делал так, чтобы отправить на сайт форму с логином и паролем, а затем, после авторизации, получить ответ по заданному URL

Работало это как то так
Интересно - попробывал .
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() );
Пока - Incorrect user name or password ... Написал письмо для админа сайта . Жду ответа ...
Старый 27.08.2012, 18:11   #15  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 423 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от 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() );
Пока - Incorrect user name or password ... Написал письмо для админа сайта . Жду ответа ...
Судя по всему так работать у вас не будет.
Чтобы заработало нужно сначала в браузере воспроизвести последовательность команд, при которой web сервер принимает запрос и отражает необходимый ответ, а уже затем переносить это в аксапту.

в адресе url который у вас
X++:
objXHTTP.open("POST", "https://go.venipak.lt/ws/print_label", false);
при таком способе реализации должна находится html форма ввода логина-пароля,
а у вас указан адрес страницы, которая видимо, может работать только ПОСЛЕ авторизации, либо код авторизации принимать как то иначе чем в способе описанном мной выше.
Старый 28.08.2012, 09:12   #16  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от someOne Посмотреть сообщение
Судя по всему так работать у вас не будет.
Чтобы заработало нужно сначала в браузере воспроизвести последовательность команд, при которой web сервер принимает запрос и отражает необходимый ответ, а уже затем переносить это в аксапту.

в адресе url который у вас
X++:
objXHTTP.open("POST", "https://go.venipak.lt/ws/print_label", false);
при таком способе реализации должна находится html форма ввода логина-пароля,
а у вас указан адрес страницы, которая видимо, может работать только ПОСЛЕ авторизации, либо код авторизации принимать как то иначе чем в способе описанном мной выше.
Ето не форма , ето web service . Там посылаеться сразу усер , пасв и номер заказа . Оно возвращяет урл для отпечятки заказа . Я получил ответ из них . Если ето все сделать из php или javascript то все работает , а вот как сделать такое из Аксапты - пока невезет ...
Старый 28.08.2012, 10:02   #17  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Проблема решена ... . Способ решения :

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();
Спасибо Всем за помочь !

С уважением , Римантас
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как сильно модифицировано ваше приложение Аксапты? mazzy DAX: Прочие вопросы 30 14.04.2011 17:26
Axilicious:IDMF Post Installation Issue : ODBC Connection Blog bot DAX Blogs 0 28.01.2011 23:14
The Death of Reason: Post Project Reviews Blog bot DAX Blogs 0 27.08.2010 19:05
Вставка строк в таблицы Аксапты сторонними средствами Андре DAX: База знаний и проекты 1 07.05.2009 16:49
Arijit Basu: Post Ledger Transactions via X++ Blog bot DAX Blogs 0 27.07.2007 17:30

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:43.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.