Fórum Problema passando e recebendo ARRAY DE OBJETOS em um webservice feito em C# #419078
28/06/2012
0
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
Curtir tópico
+ 0Posts
28/06/2012
Romulo Contro
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
02/07/2012
Romulo Contro
preciso disso com muita urgencia... ninguem nunca passou por isso mesmo? nenhuma boa alma pra me ajudar? :(
Abraços!
Gostei + 0
02/07/2012
William
Vc já tentou entrar em contato com o suporte da RodoCred?
Gostei + 0
02/07/2012
Romulo Contro
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
02/07/2012
William
Gostei + 0
02/07/2012
Romulo Contro
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
02/07/2012
William
Gostei + 0
02/07/2012
Romulo Contro
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
02/07/2012
Romulo Contro
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
02/07/2012
William
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
02/07/2012
Romulo Contro
Gostei + 0
03/07/2012
Romulo Contro
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
05/07/2012
Romulo Contro
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
06/07/2012
Joel Rodrigues
Gostei + 0
06/07/2012
Romulo Contro
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)