Вопрос

Я столкнулся с проблемой отправки сложных запросов с 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>
.

Кусок Groovy Code:

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

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

Спасибо, что вы помогите.

-vova.

Это было полезно?

Решение 2

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

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

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

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

С этим как упомянутый законопроект вы можете увидеть имена классов.

















Еще одна вещь: parameters может иметь разный тип.Не генеракодицетагкод.Вот почему это должно быть создано тоже.

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

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

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

Это все!


-Вова

Другие советы

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

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 думает, что имена класс должны быть на самом деле.

Спасибо!Я получил Groovyws, работаю с действительно сложным WebService!

Мои шаги: я включил отладочку, чтобы получить корневой класс, затем сделал этот код отражения, чтобы получить внутренние классы, и перейти на настройку свойств и проверять, есть ли его строка или список.

и Voilá!

def proxy = new WSClient(wsdl,this.class.classLoader)
proxy.initialize()

def f2bCobranca = proxy.create("br.com.f2b.soap.wsbilling.F2BCobranca") //got with debug on

//Show me inner classes of root class
f2bCobranca.class.fields.each { log.debug it }
f2bCobranca.class.methods.each { log.debug it }

f2bCobranca.cobranca = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Cobranca')
f2bCobranca.cobranca.demonstrativo << 'teste' //it's a list!
f2bCobranca.cobranca.sacadorAvalista = 'teste jose'
f2bCobranca.cobranca.desconto = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Cobranca$Desconto')
f2bCobranca.cobranca.multa = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Cobranca$Multa')

def sacado1 = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado')
sacado1.nome = "teste ${new Date()}"
sacado1.email << 'teste@wanswins.com.br'
sacado1.endereco = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado$Endereco')
sacado1.telefone = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado$Telefone')
sacado1.telefoneCom = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado$TelefoneCom')
sacado1.telefoneCel = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado$TelefoneCel')
sacado1.cpf = ''
sacado1.cnpj = ''
sacado1.observacao = ''
f2bCobranca.sacado << sacado1  

def retorno = proxy.RegisterWSBilling(f2bCobranca)
log.debug retorno
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top