Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / SOAP запроса внутри USER class-a / 16 сообщений из 16, страница 1 из 1
07.09.2015, 15:01
    #39044995
lfktk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP запроса внутри USER class-a
Подскажите пожалуйста как создавать метод для получение инф через 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
07.09.2015, 16:12
    #39045103
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP запроса внутри USER class-a
Вы имеете ввиду, что вам нужно просто обратиться к стороннему SOAP-серверу ?
можете импортировать их WSDL, и запускайте сгенерированные методы
Документация
...
Рейтинг: 0 / 0
08.09.2015, 07:47
    #39045429
lfktk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP запроса внутри USER class-a
DAiMorВы имеете ввиду, что вам нужно просто обратиться к стороннему SOAP-серверу ?
можете импортировать их WSDL, и запускайте сгенерированные методы
Документация

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

У меня есть только URL веб-сервиса (может быть NAMESPACE) и несколько URL SOAP-action.
не мог найти нормальный гайд по SOAP webclient. Можешь показать пример по request SOAP?
...
Рейтинг: 0 / 0
08.09.2015, 12:35
    #39045696
lfktk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP запроса внутри USER class-a
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
08.09.2015, 12:46
    #39045716
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP запроса внутри USER class-a
lfktkпоказать пример

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

lfktk" http://xxx.xx.xx.xx:xxxx/IXXXEServiceDirectoryService.asmx";
У сервиса нет описания? Откуда тогда получили информацию о SOAP-action?
...
Рейтинг: 0 / 0
08.09.2015, 12:48
    #39045721
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP запроса внутри USER class-a
Значит вам можно собрать такой класс вручную, вот например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
08.09.2015, 13:02
    #39045734
lfktk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP запроса внутри USER class-a
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
08.09.2015, 13:09
    #39045745
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP запроса внутри USER class-a
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
08.09.2015, 13:15
    #39045750
lfktk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP запроса внутри USER class-a
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
08.09.2015, 13:50
    #39045788
Александр Коблов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP запроса внутри USER class-a
lfktk,

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

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

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

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

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

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

не открывает(
без логин/пароль, только 2 URL, первый это URL веб-сервиса, второй это SOAP-action.
вы можете переделат мой JAVA код под CACHÉ?
...
Рейтинг: 0 / 0
08.09.2015, 14:45
    #39045889
lfktk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP запроса внутри USER class-a
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
08.09.2015, 14:52
    #39045903
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP запроса внутри USER class-a
lfktkошибка:
Код: sql
1.
zInvokeClient+285^%SOAP.WebClient.1

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

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


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