powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / SOAP запроса внутри USER class-a
16 сообщений из 16, страница 1 из 1
SOAP запроса внутри USER class-a
    #39044995
lfktk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста как создавать метод для получение инф через SOAP-клиент?
вот пример в %Net.HttpRequest, нужен аналогично....Method request(method, url)
{
  new httprequest set httprequest = ##class(%Net.HttpRequest).%New()
  set httprequest.Server =  ..SERVER
  set httprequest.Port = ..PORT
  set httprequest.ContentType = "application/json"
  D httprequest.SetHeader("Accept","application/json")
  D httprequest.InsertFormData("grant_type","password")
  D httprequest.InsertFormData("username",..USER)
  D httprequest.InsertFormData("password",..PWD)
  D httprequest.InsertFormData("scope","profile")
    
  do httprequest.Send(method, ulr)
  
  new size set size = httprequest.HttpResponse.Data.Size
  new response 
  set response = httprequest.HttpResponse.Data.Read(size)
  quit response
}
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045103
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы имеете ввиду, что вам нужно просто обратиться к стороннему SOAP-серверу ?
можете импортировать их WSDL, и запускайте сгенерированные методы
Документация
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045429
lfktk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorВы имеете ввиду, что вам нужно просто обратиться к стороннему SOAP-серверу ?
можете импортировать их WSDL, и запускайте сгенерированные методы
Документация

Не удается импортировать, есть пример для импортирования (SOAP-Webserver, cache -webclient)
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045460
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть какие то ошибки при импортировании ?
есть возможность выложить или прислать WSDL файл, если не секретный ?
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045674
lfktk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor,

У меня есть только URL веб-сервиса (может быть NAMESPACE) и несколько URL SOAP-action.
не мог найти нормальный гайд по SOAP webclient. Можешь показать пример по request SOAP?
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045696
lfktk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorЕсть какие то ошибки при импортировании ?
есть возможность выложить или прислать WSDL файл, если не секретный ?могу толлько JAVA код (Рабочий)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
package getReq;

import javax.xml.soap.SOAPException;

public class GetREQ {

    private javax.xml.soap.SOAPConnection _connection;
    private static String _url = "http://xxx.xx.xx.xx:xxxx/IXXXEServiceDirectoryService.asmx";
    private static String _inFilePath = "d:/exp/in/";
    private static String _outFilePath = "d:/exp/out/";
    private static String[] _inFileMsg = {
                                    "GetHBNamespaces",
                                    "GetHBList",
                                    "GetHBValuesByDate_rngFStruct",
                                };
    private static String[] _inSoapAction = {
                                        "http://xx.xxx.ru/..../GetHBNamespaces",
                                        "http://xx.xxx.ru/.../GetHBList",
                                        "http://xx.xxx.ru/.../GetHBValuesByDate",                                        
                                    };
    private StringBuffer preMsg;

    public static void main(String[] args) throws SOAPException {
        GetREQ client = new GetREQ();
        int im=_inFileMsg.length;
        for(int i=0;i<im;i++) {
            client.run(i);
        }
    }

    public void run(int indFile) throws SOAPException
    {
        writelog("===BEGIN===" );
        try {
            javax.xml.soap.SOAPConnectionFactory scf = javax.xml.soap.SOAPConnectionFactory.newInstance();
            _connection = scf.createConnection();
            writelog( callExecute(indFile) );
            _connection.close();
        } catch ( Exception e ) {
            writelog( e.getMessage() );
        }
        writelog( "===END===" );
    }

    public void writelog(String s){
        System.out.println( s );
    }

    private String callExecute(int indFile)
        throws javax.xml.soap.SOAPException, java.io.IOException
    {
        StringBuffer result = new StringBuffer();
        java.io.OutputStream os = null;
        javax.xml.soap.SOAPMessage message = null;
        try {
            // Затем создаем сообщение
            javax.xml.soap.MessageFactory messageFactory = javax.xml.soap.MessageFactory.newInstance();
            message = messageFactory.createMessage();
            // Создаем объекты, представляющие различные компоненты сообщения
            javax.xml.soap.SOAPPart soapPart = message.getSOAPPart();
            javax.xml.soap.SOAPEnvelope envelope = soapPart.getEnvelope();
            javax.xml.soap.SOAPBody body = envelope.getBody();
            // Формирование сообщения
            javax.xml.transform.stream.StreamSource preppedMsgSrc = new javax.xml.transform.stream.StreamSource( new java.io.FileInputStream( _inFilePath+_inFileMsg[indFile]+".msg" ) );
            soapPart.setContent( preppedMsgSrc );
            message.saveChanges();
            // synchronous request/response style
            javax.xml.soap.SOAPMessage response = null;
            message.getMimeHeaders().addHeader( "SOAPAction", _inSoapAction[indFile] );
            response = c.call( message, _url );
            result.append( "Successful request.\r\n" );
            result.append( "SOAP request:\r\n" );
            os = new java.io.ByteArrayOutputStream();
            message.writeTo( os );
            result.append( os.toString() );
            result.append( "\r\n" );
            result.append( "SOAP response:\r\n" );
            if (response != null) {
                response.writeTo(new java.io.FileOutputStream(_outFilePath+_inFileMsg[indFile]+".xml"));
                os = new java.io.ByteArrayOutputStream();
                response.writeTo( os );
                result.append( os.toString() );
                result.append( "\r\n" );                
            }
        } catch ( Throwable t ) {
            result.append( "Failed request.\r\n" );
            os = new java.io.ByteArrayOutputStream();
            message.writeTo( os );
            result.append( os.toString() );
            result.append( "\r\n" );
        }
        return result.toString();
    }    
}

...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045716
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lfktkпоказать пример

1) на основе WSDL генерируется набор классов реализующих веб-клиента (см. документацию, ссылку ранее дал DAiMor)
2) пользуешься сгенерированными классами

lfktk" http://xxx.xx.xx.xx:xxxx/IXXXEServiceDirectoryService.asmx";
У сервиса нет описания? Откуда тогда получили информацию о SOAP-action?
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045721
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит вам можно собрать такой класс вручную, вот напримерClass LetografWebService.LetografWebServiceSoap Extends %SOAP.WebClient [ ProcedureBlock ]
{

/// This is the URL used to access the web service.
Parameter LOCATION = " http://localhost/letograf/WebService.Base.cls" ;

/// This is the namespace used by the Service
Parameter NAMESPACE = " http://www.letograf.ru/2009/ws/" ;

/// Use xsi:type attribute for literal types.
Parameter OUTPUTTYPEATTRIBUTE = 1;

/// Determines handling of Security header.
Parameter SECURITYIN = "ALLOW";

/// This is the name of the Service
Parameter SERVICENAME = "LetografWebService";

/// This is the SOAP version supported by the service.
Parameter SOAPVERSION = 1.1;

Method Connect(Login As %String, Password As %String) As %String [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]
{
 Quit ..WebMethod("Connect").Invoke($this," http://www.letograf.ru/2009/ws//WebService.Base.Connect" ,.Login,.Password)
}
}далее работать можно такset soap=##class(LetografWebService.LetografWebServiceSoap).%New()
set sessionId=soap.Connect(login,pass)собственно и все
я этот пример сгенерировал на основе своего же веб-сервиса, и на основе своего WSDL, который Cache сам генерирует
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045734
lfktk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor,

А можно сделать так? =>
Class Myclass Extends %Library.RegisteredObject [ Not ProcedureBlock ]
{

Method getSoapMsg(url, soapaction)
{
  set soap=##class(LetografWebService.LetografWebServiceSoap).%New()
  set sessionId=soap.Connect(login,pass)
        .............
  quit res
}
}
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045745
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lfktkDAiMor,

А можно сделать так? =>
Class Myclass Extends %Library.RegisteredObject [ Not ProcedureBlock ]
{

Method getSoapMsg(url, soapaction)
{
  set soap=##class(LetografWebService.LetografWebServiceSoap).%New()
  set sessionId=soap.Connect(login,pass)
        .............
  quit res
}
}
Можно, но уже значительно сложнее, либо вы не поняли мой пример
А чем вас не устроило, собрать класс с отдельным методом для каждого soapaction, как я показал
у вас же они насколько я понимаю статичные
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045750
lfktk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorlfktkDAiMor,

А можно сделать так? =>
Class Myclass Extends %Library.RegisteredObject [ Not ProcedureBlock ]
{

Method getSoapMsg(url, soapaction)
{
  set soap=##class(LetografWebService.LetografWebServiceSoap).%New()
  set sessionId=soap.Connect(login,pass)
        .............
  quit res
}
}
Можно, но уже значительно сложнее, либо вы не поняли мой пример
А чем вас не устроило, собрать класс с отдельным методом для каждого soapaction, как я показал
у вас же они насколько я понимаю статичныеЯ понял, просто не хотел создавать личный класс.
спасибо за помощь , попробую....
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045788
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lfktk,

А вы пробовали открыть URL добавив к нему wsdl?

http://xxx.xx.xx.xx:xxxx/IXXXEServiceDirectoryService.asmx?wsdl

Может он WSDL отдаст.
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045875
lfktk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр Кобловlfktk,

А вы пробовали открыть URL добавив к нему wsdl?

http://xxx.xx.xx.xx:xxxx/IXXXEServiceDirectoryService.asmx?wsdl

Может он WSDL отдаст.

не открывает(
без логин/пароль, только 2 URL, первый это URL веб-сервиса, второй это SOAP-action.
вы можете переделат мой JAVA код под CACHÉ?
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045889
lfktk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorЗначит вам можно собрать такой класс вручную, вот напримерClass LetografWebService.LetografWebServiceSoap Extends %SOAP.WebClient [ ProcedureBlock ]
{

/// This is the URL used to access the web service.
Parameter LOCATION = " http://localhost/letograf/WebService.Base.cls" ;

/// This is the namespace used by the Service
Parameter NAMESPACE = " http://www.letograf.ru/2009/ws/" ;

/// Use xsi:type attribute for literal types.
Parameter OUTPUTTYPEATTRIBUTE = 1;

/// Determines handling of Security header.
Parameter SECURITYIN = "ALLOW";

/// This is the name of the Service
Parameter SERVICENAME = "LetografWebService";

/// This is the SOAP version supported by the service.
Parameter SOAPVERSION = 1.1;

Method Connect(Login As %String, Password As %String) As %String [ Final, ProcedureBlock = 1, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]
{
 Quit ..WebMethod("Connect").Invoke($this," http://www.letograf.ru/2009/ws//WebService.Base.Connect" ,.Login,.Password)
}
}
далее работать можно такset soap=##class(LetografWebService.LetografWebServiceSoap).%New()
set sessionId=soap.Connect(login,pass)собственно и все
я этот пример сгенерировал на основе своего же веб-сервиса, и на основе своего WSDL, который Cache сам генерируетошибка:
Код: sql
1.
zInvokeClient+285^%SOAP.WebClient.1
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045903
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lfktkошибка:
Код: sql
1.
zInvokeClient+285^%SOAP.WebClient.1

Не хватает самой ошибки в треугольных скобках
И какая у вас версия Caché ?
...
Рейтинг: 0 / 0
SOAP запроса внутри USER class-a
    #39045983
Александр Коблов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lfktk,

Я бы написал тем, чей это веб-сервис и попросил wsdl.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / SOAP запроса внутри USER class-a
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]