GroovyWS и сложные запросы

Я имею сталкивающийся с проблемой отправления сложных запросов с GroovyWS.

Это - демонстрационный запрос, сгенерированный soapUI:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:dex="http://www.temp.com/com/dex" 
>
 <soapenv:Header/>
 <soapenv:Body>
  <dex:executeRequest>
     <!--Optional:-->
     <a>?</a>
     <!--Optional:-->
     <b>?</b>
     <!--Optional:-->
     <parameters>
        <!--Zero or more repetitions:-->
        <parameter>
           <!--Optional:-->
           <key>?</key>
           <!--Optional:-->
           <value>?</value>
        </parameter>
     </parameters>
     <!--Optional:-->
     <c>?</c>
     <!--Optional:-->
     <d>?</d>
  </dex:feedrequest>
 </soapenv:Body>
</soapenv:Envelope>

часть отличного кода:

def proxy = webService.getClient(grailsApplication.config.ws.endpoint);
proxy.processdRequest(?);

Таким образом, что я должен передать вместо?.

Спасибо за Вас справка.

- vova.

8
задан trnl 23 July 2010 в 10:51
поделиться

2 ответа

Большое спасибо, Билл.

Я просто хочу добавить информацию для будущих читателей.

Чтобы включить ведение журнала для GroovyWS в Grails:

log4j = {
   debug 'grails.app',
         'groovyx.net.ws',
         'org.apache.cxf'
}

С помощью этого, как уже упоминалось, Билл, вы можете видеть имена классов.


Еще одно: параметры могут иметь другой тип. Не Список . Поэтому его тоже нужно создавать.

def params = proxy.create('com.temp.feeds.FeedRequestType$Parameters');

Чтобы получить доступные методы и поля для вновь созданных объектов, вы можете использовать отражение Groovy:

params.class.methods.each{
        println it;
}
params.class.fields.each{
        println it;
}

Вот и все!

-vova

5
ответ дан 5 December 2019 в 12:07
поделиться

GroovyWS динамически создает классы для каждого из типов аргументов, необходимых для передачи данных в вызов веб-сервиса. Например, если вызов веб-сервиса был:

public int passSomeArgs( Arg1Type a, Arg2Type b );

GroovyWS динамически создаст класс Arg1Type и класс Arg2Type, к которым вы сможете обратиться через метод прокси-сервера.

// this will instantiate an Arg1Type for you
def arg1 = proxy.create( "ns1.ns2.Arg1Type" );  
// this will instantiate an Arg2Type for you
def arg2 = proxy.create( "ns1.ns2.Arg2Type" );  

Затем вы можете заполнить экземпляр arg1/arg2 данными и сделать свой вызов:

int ret = proxy.passSomeArgs( arg1, arg2 );

Обратите внимание, что в создаваемых классах, вероятно, задействованы некоторые пространства имен. Я использовал журнал CXF, который печатался, когда GroovyWS обрабатывал WSDL, чтобы увидеть, какими, по мнению CXF, должны быть имена классов.

6
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: