GARANTIR DESCONTO

Fórum Problema passando e recebendo ARRAY DE OBJETOS em um webservice feito em C# #419078

28/06/2012

0

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

Responder

Posts

28/06/2012

Romulo Contro

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
Responder

Gostei + 0

02/07/2012

Romulo Contro

up!


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

Abraços!
Responder

Gostei + 0

02/07/2012

William

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?
Responder

Gostei + 0

02/07/2012

Romulo Contro

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
Responder

Gostei + 0

02/07/2012

William

Se puder poste um exemplo do XML de retorno.
Responder

Gostei + 0

02/07/2012

Romulo Contro

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>
Responder

Gostei + 0

02/07/2012

William

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.
Responder

Gostei + 0

02/07/2012

Romulo Contro

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...
Responder

Gostei + 0

02/07/2012

Romulo Contro

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á. =/
Responder

Gostei + 0

02/07/2012

William

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..
Responder

Gostei + 0

02/07/2012

Romulo Contro

Certo, enviei pra vc no e-mail o request e response com 2 motoristas.
Responder

Gostei + 0

03/07/2012

Romulo Contro

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
Responder

Gostei + 0

05/07/2012

Romulo Contro

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.
Responder

Gostei + 0

06/07/2012

Joel Rodrigues

Obrigado por compartilhar a solução com a comunidade, Romulo.
Responder

Gostei + 0

06/07/2012

Romulo Contro

Se precisar, tamo aí!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar