Problema passando e recebendo ARRAY DE OBJETOS em um webservice feito em C#

Delphi

28/06/2012

Boa tarde!

Estou com problemas para receber resposta de um webservice da rodocred, que em todas as funções é retornado um objeto, que dentro tem outros objetos e arrays de objetos... quando é somente objetos ou variaveis do tipo string, int, etc... eu consigo pegar o retorno normal, porém, quando vou pegar o retorno de algum array, ele volta vazio... alguem já passou por isso?

Segue um exemplo do meu código:

//essa é a classe que contém as variaveis pra enviar no request para o webservice:
ManterMotoristaRequest = class(TRemotable)
private
FIdentificacaoIntegracao: IdentificacaoIntegracaoType;
FOperacao: TipoOperacaoType;
FIdClienteResponsavel: Integer;
FTransportador: Transportador4;
FMotorista: MotoristaType;
public
constructor Create; override;
destructor Destroy; override;
published
property IdentificacaoIntegracao: IdentificacaoIntegracaoType Index (IS_OPTN) read FIdentificacaoIntegracao write FIdentificacaoIntegracao;
property Operacao: TipoOperacaoType read FOperacao write FOperacao;
property IdClienteResponsavel: Integer Index (IS_OPTN) read FIdClienteResponsavel write FIdClienteResponsavel;
property Transportador: Transportador4 Index (IS_OPTN) read FTransportador write FTransportador;
property Motorista: MotoristaType Index (IS_OPTN or IS_UNBD) read FMotorista write FMotorista;
end;



//aqui é o problema... quando a resposta vem somente preenchido o RetornoMensagem eu consigo ler, mas quando vem
//preenchido também o Motoristas, que é um array, eu nao consigo pegar resposta nenhuma
Array_Of_Motoristas = array of Motoristas;

ManterMotoristaResponse = class(TRemotable)
private
FRetornoMensagem: RetornoMensagem5;
FMotoristas: Array_Of_Motoristas;
public
constructor Create; override;
destructor Destroy; override;
published
property RetornoMensagem: RetornoMensagem5 Index (IS_OPTN) read FRetornoMensagem write FRetornoMensagem;
property Motoristas: Array_Of_Motoristas Index (IS_OPTN or IS_UNBD) read FMotoristas write FMotoristas;
end;


Estou chamando a função do webservice da seguinte maneira:
ManterMotResponse := ser.ManterMotoristaRequest(objManterMotoristaRequest);

ManterMotResponse é do tipo ManterMotoristaResponse, que tem o RetornoMensagem e o Motoristas dentro... quando a resposta vem somente no RetornoMensagem eu consigo capturar ela, ler e tudo mais... mas quando vem também o Motoristas preenchido (que é um array de Motoristas) o ManterMotResponse vem tudo nil...


alguem tem alguma sugestão?

agradeço desde já!

[]s
Romulo Contro
Romulo Contro

Romulo Contro

Curtidas 0

Respostas

Romulo Contro

Romulo Contro

28/06/2012

Boa tarde!

Estou com problemas para receber resposta de um webservice da rodocred, que em todas as funções é retornado um objeto, que dentro tem outros objetos e arrays de objetos... quando é somente objetos ou variaveis do tipo string, int, etc... eu consigo pegar o retorno normal, porém, quando vou pegar o retorno de algum array, ele volta vazio... alguem já passou por isso?

Segue um exemplo do meu código:

//essa é a classe que contém as variaveis pra enviar no request para o webservice:
ManterMotoristaRequest = class(TRemotable)
private
FIdentificacaoIntegracao: IdentificacaoIntegracaoType;
FOperacao: TipoOperacaoType;
FIdClienteResponsavel: Integer;
FTransportador: Transportador4;
FMotorista: MotoristaType;
public
constructor Create; override;
destructor Destroy; override;
published
property IdentificacaoIntegracao: IdentificacaoIntegracaoType Index (IS_OPTN) read FIdentificacaoIntegracao write FIdentificacaoIntegracao;
property Operacao: TipoOperacaoType read FOperacao write FOperacao;
property IdClienteResponsavel: Integer Index (IS_OPTN) read FIdClienteResponsavel write FIdClienteResponsavel;
property Transportador: Transportador4 Index (IS_OPTN) read FTransportador write FTransportador;
property Motorista: MotoristaType Index (IS_OPTN or IS_UNBD) read FMotorista write FMotorista;
end;



//aqui é o problema... quando a resposta vem somente preenchido o RetornoMensagem eu consigo ler, mas quando vem
//preenchido também o Motoristas, que é um array, eu nao consigo pegar resposta nenhuma
Array_Of_Motoristas = array of Motoristas;

ManterMotoristaResponse = class(TRemotable)
private
FRetornoMensagem: RetornoMensagem5;
FMotoristas: Array_Of_Motoristas;
public
constructor Create; override;
destructor Destroy; override;
published
property RetornoMensagem: RetornoMensagem5 Index (IS_OPTN) read FRetornoMensagem write FRetornoMensagem;
property Motoristas: Array_Of_Motoristas Index (IS_OPTN or IS_UNBD) read FMotoristas write FMotoristas;
end;


Estou chamando a função do webservice da seguinte maneira:
ManterMotResponse := ser.ManterMotoristaRequest(objManterMotoristaRequest);

ManterMotResponse é do tipo ManterMotoristaResponse, que tem o RetornoMensagem e o Motoristas dentro... quando a resposta vem somente no RetornoMensagem eu consigo capturar ela, ler e tudo mais... mas quando vem também o Motoristas preenchido (que é um array de Motoristas) o ManterMotResponse vem tudo nil...


alguem tem alguma sugestão?

agradeço desde já!

[]s
Romulo Contro



Alguem? :S
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

up!


preciso disso com muita urgencia... ninguem nunca passou por isso mesmo? nenhuma boa alma pra me ajudar? :(

Abraços!
GOSTEI 0
William

William

28/06/2012

Romulo se o retorno está nil, então o problema ou está na solicitação enviada ou na resposta do WebService, porque pelo o que eu entendi não retorna nada para vc então não existe erro de leitura da resposta.

Vc já tentou entrar em contato com o suporte da RodoCred?
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

Romulo se o retorno está nil, então o problema ou está na solicitação enviada ou na resposta do WebService, porque pelo o que eu entendi não retorna nada para vc então não existe erro de leitura da resposta.

Vc já tentou entrar em contato com o suporte da RodoCred?


Olá, muito obrigado por responder!

estou usando o programa Fiddler pra conseguir ver o xml que sai e que entra... a requisição está indo certinho... e o xml de retorno está chegando certinho também... porém, na hora de ler isso no delphi, ele entende que está nil... essa que é a minha dificuldade.

segue uma imagem do retorno:
http://puu.sh/FhVw


quando vem preenchido só o RetornoMensagem eu consigo ler certinho...

mas quando vem o Motoristas a minha variavel de retorno fica inteira nil
GOSTEI 0
William

William

28/06/2012

Se puder poste um exemplo do XML de retorno.
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

está neste print: http://puu.sh/FhVw

ou qualquer coisa, segue também o xml:

<?xml version=1.0 encoding=UTF-8?>
-<soap:Envelope xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:soap=http://www.w3.org/2003/05/soap-envelope>
-<soap:Body>
-<ManterMotoristaResponse xmlns=https://ws.rodocred.com.br/>
-<RetornoMensagem>
-<IdentificacaoIntegracao>
<IdClienteRodocred>1238</IdClienteRodocred>
<TokenAutenticacao>0d2e2c16-5cd5-41ef-9cad-6f509c31c389</TokenAutenticacao>
<NumeroTransacao>123456</NumeroTransacao>
<VersaoServico>1.00</VersaoServico>
</IdentificacaoIntegracao>
<StatusRetorno>SUCESSO</StatusRetorno>
</RetornoMensagem>
-<Motoristas>
<CPFMotorista>77912459812</CPFMotorista>
<StatusRetorno>ERRO</StatusRetorno>
-<Excecao>
<TipoExcecao>NEGOCIO</TipoExcecao>
<CodigoExcecao>MOTEXC008</CodigoExcecao>
<MensagemExcecao>O cartão não fornecido para o cliente responsável pela operação.</MensagemExcecao>
</Excecao>
</Motoristas>
</ManterMotoristaResponse>
</soap:Body></soap:Envelope>
GOSTEI 0
William

William

28/06/2012

Realmente pelo XML, não foi possível retirar muita informação. Algum tempo tempo atrás postei um artigo sobre como consultar endereços usando CEP, a reposta do WebService em casos raros poderia ser uma lista de endereços com o mesmo CEP, então tinha que montar um loop para capturar tais registros, mas no seu caso precisaria capturar esse tal Array de Objetos.
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

entendo. uma vez para aprender eu fiz um exemplo de consulta de CEP também, porém, esse exemplo não tinha arrays como parametro, e nele funcionou certinho...

estava fazendo um teste aqui, e ao invés de declarar um array_of_motoristas, eu deixei só o tipo Motoristas, já que no meu caso vai sempre retornar 1 só mesmo... e ainda assim ele não consegue ler... muito estranho isso...


segue um exemplo em que o xml retornou os dois parametros:
http://puu.sh/FjzB

e segue outro exemplo, mas com um erro proposital para que só retorne um dos parametros:
http://puu.sh/FjAu



vc acha que pode ser algum erro no initialization? pois está dando impressão que é erro na hora de passar de xml pra objeto...
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

não sei se consegui ser muito claro na minha duvida... mas ela é a seguinte:

quando dá um erro de validação dos campos, o webservice me retorna somente o objeto RetornoMensagem preenchido. Quando é assim, eu consigo normalmente ver a resposta que veio...

quando eu passo dados válidos, eu recebo o xml de retorno com o objeto RetornoMensagem preenchido, onde contém o idcliente, token, versão, etc. e também recebo o objeto Motoristas, que vem com o CPF, status do retorno, exceção, mensagem de exceção, etc. dos motoristas que eu solicitei o cadastro... e é nesse caso que eu não consigo recuperar o retorno... nem o RetornoMensagem e nem o Motoristas... não consigo ler isso do XML que retornou. será que tem algo especifico pra fazer quando tem 2 parametros de retorno? todas as outras funções que é de 1 parametro de retorno só dá certo, só essas com 2 parametros de retorno que não dá. =/
GOSTEI 0
William

William

28/06/2012

Preciso analisar com calma esse xml, tem como vc mandar um exemplo para meu e-mail:wllfl@ig.com.br, com o retorno de 2 motoristas pelo menos.

Se vc tem certeza que os xml está sendo gerado corretamente então o problema só poder ser no momento de atribuição para Array..
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

Certo, enviei pra vc no e-mail o request e response com 2 motoristas.
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

bom dia!

pra tratar esse causo aí eu vou ver se consigo salvar o xml de retorno, ou entao carregar ele direto em um TXMLDocument...

estava fuçando um pouco aqui, alguem sabe se tem como ler só o xml de resposta? levando em conta que o delphi passa de xml pra objeto nas classes mais baixas... não tenho ideia de como vou conseguir esse xml por dentro do delphi
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

BOM DIA!

Consegui descobrir uma maneira de receber corretamente o retorno...

lá na declaração, ao invés de deixar como FUNCTION, é melhor deixar como PROCEDURE, e dentro dela declarar variaveis OUT pra receber o retorno... assim os objetos são populados certinho!

segue exemplo:
procedure ManterMotoristaRequest(const IdentificacaoIntegracao: IdentificacaoIntegracaoType; const Operacao: TipoOperacaoType; const IdClienteResponsavel: Integer; const Transportador: Transportador; const Motorista: MotoristaType; out RetornoMensagem: RetornoMensagem; out Motoristas: Motoristas); stdcall;


e essa seria a chamada pra procedure:

ser := GetRodocredSoap(false,,uMain.HTTPRIO1);

ser.ManterMotoristaRequest(IdentificacaoIntegracao,INC,StrToInt(uMain.EdtID.Text),objtransportador,objMotorista,outRetornoMensagem,outMotoristas);


onde as variaveis outRetornoMensagem e outMotoristas são as que recebem o meu retorno.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

28/06/2012

Obrigado por compartilhar a solução com a comunidade, Romulo.
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

Se precisar, tamo aí!
GOSTEI 0
Marcos Rocha

Marcos Rocha

28/06/2012

Bom dia,
Estou precisando fazer a transmissão do CIOT para a RODOCRED
alguém pode me dar uma força?

até estamos querendo começar um projeto no ACBR
http://www.djsystem.com.br/acbr/forum/viewtopic.php?f=9&t=6511

Grato
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

entao, eu já terminei a integração do meu sistema com a rodocred... to recebendo o ciot certinho de lá já, e td mais...

não usei nenhum componente pra fazer, eu importei o wsdl no delphi 2010 e fiz tudo por lá.

o que exatamente vc precisa?
GOSTEI 0
Marcos Rocha

Marcos Rocha

28/06/2012

Pode me passar um demo, ou os fontes de como fez?
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

Certo, dá uma lida nesse link, e faz o exemplo do CEP aí pra entender como funciona mais ou menos...

http://rodrigojarouche.wordpress.com/2010/03/27/como-consumir-webservices-em-delphi/

se vc usa o delphi 7, vc terá que fazer uma atualização do wsdl importer, tem lá no site da codegear... pois o que vem no delphi 7 é bugado...

depois que vc entender esse exemplo do cep, vc vai conseguir fazer o da rodocred... eu fiz praticamente igual o esquema do cep.

qualquer duvida posta aí
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

o link de importação do WSDL da rodocred é este:

http://homologacao.ws.rodocred.com.br/rodocred.asmx?WSDL
GOSTEI 0
Marcos Rocha

Marcos Rocha

28/06/2012

Bom dia,
Importei o http://homologacao.ws.rodocred.com.br/r ... .asmx?WSDL
usando o wsdl importer Delphi 7 ao compilar da esse erro:

[img]http://www.brst.com.br/rodocred/Erro.png[/img]

Oq pode ser?


Grato
GOSTEI 0
Romulo Contro

Romulo Contro

28/06/2012

é um pouco problematico na hora de importar mesmo, por incompatibilidade do WS feito em C# pro Delphi... passei por esses problemas aí...

mas se vc notar, o tipo CNHCategoria está sendo declarado mais pra baixo aí, se nao me engano... entao chega ali ele fala que nao existe ainda...

pra chegar em um ponto que ficou certinho, eu tive que mudar MUITA coisa aí... vou deixar o meu wsdl importado aqui pra vc baixar, só que o meu é do delphi 2010, tem algumas diferenças lá em baixo na serialização... então recomendo que vc só use ele de base...

https://dl.dropbox.com/u/90732230/WSDL.rar

te recomendo levantar primeiro quais são os serviços que vc vai precisar usar do WS, aí vc dá a manutenção somente neles na unit do wsdl importado...
eu não fiz de todos os serviços, só fiz os que eu realmente preciso usar...
GOSTEI 0
Marcos Rocha

Marcos Rocha

28/06/2012

Opa, esse deu Certo, vou ver se consigo começar a os XMLs agora

Grato

GOSTEI 0
Marcos Rocha

Marcos Rocha

28/06/2012

oa noite, Salve galera
agora a acabei de ver um tal de mdfe
https://mdfe-portal.sefaz.rs.gov.br/Site/Sobre
a pergunta é é: esse mdfe é a mesma coisa que a rodocred faz só que de forma gratuita?
se for ótimo pois a Acbr já tem ele, e vou parar de fazer a homologação na rodocred ou TiketFrete


Grato
GOSTEI 0
POSTAR