2010-07-23 32 views
8

Tôi đã gặp phải sự cố khi gửi các yêu cầu phức tạp với GroovyWS.GroovyWS và các yêu cầu phức tạp

này được yêu cầu mẫu được tạo ra bởi 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> 

các đoạn mã groovy:

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

Vì vậy, những gì tôi phải vượt qua thay vì ?.

Cảm ơn sự giúp đỡ của bạn.

-vova.

Trả lời

5

Rất cảm ơn Bill.

Tôi chỉ muốn thêm một số thông tin cho người đọc trong tương lai.

Để bật khai thác gỗ cho GroovyWS trong Grails:

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

Với điều này như đã đề cập Bill bạn sẽ nhìn thấy tên của các lớp học.


Một điều nữa: parameters có thể có loại khác nhau. Không phải List<?>. Đó là lý do tại sao nó nên được tạo ra quá.

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

Để lấy phương pháp có sẵn và các lĩnh vực cho các đối tượng mới được tạo ra, bạn có thể sử dụng phản ánh Groovy:

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

Đó là tất cả!

-vova

6

GroovyWS tự động tạo lớp cho từng loại đối số bạn cần để chuyển dữ liệu vào cuộc gọi dịch vụ web. Ví dụ: nếu cuộc gọi webservice là:

public int passSomeArgs(Arg1Type a, Arg2Type b); 

GroovyWS sẽ tự động tạo lớp Arg1Type và lớp Arg2Type, bạn có thể truy cập thông qua phương thức trên proxy.

// 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"); 

Sau đó bạn có thể di chuyển arg1/dụ arg2 với dữ liệu và thực hiện cuộc gọi của bạn:

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

Lưu ý, có lẽ một số không gian tên tham gia vào các lớp học được tạo ra. Tôi đã sử dụng nhật ký CXF được in khi GroovyWS đang xử lý WSDL để xem CXF nghĩ tên lớp thực sự là gì.

3

Cảm ơn! Tôi nhận GroovyWS làm việc với một webservice thực sự phức tạp!

Các bước của tôi: Tôi bật gỡ lỗi để lấy lớp gốc, sau đó đã làm mã phản chiếu đó để nhận các lớp bên trong và tiếp tục thiết lập thuộc tính và kiểm tra xem đó có phải là chuỗi hoặc danh sách hay không.

Và 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 << '[email protected]' 
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 
Các vấn đề liên quan