Fórum Integração API Rest utilizando Json #488651

12/08/2014

0

Olá, estou com um problema em fazer uma integração utilizando uma API que utiliza Rest e trafega conteúdo no formato Json.

Nesta API eu tenho que enviar um Json e pegar no retorno outro Json.

Eu consigo conectar e enviar o conteúdo mas o retorno está vindo em branco.

Não sei se estou fazendo algo errado, estou quebrando a cabeça a 3 dias e nada.

Segue código abaixo:


var 
  URL, Retorno: String; 
  JsonStreamRetorno, JsonStreamEnvio: TStringStream; 
begin 
  URL := 'https://endereço da API'; 
  JsonStreamEnvio := TStringStream.Create('AQUI VAI O CONTEÚDO NO FORMATO Json'); 
  JsonStreamRetorno := TStringStream.Create(''); 

  // Init request: 
  try 
    idHttp.Request.ContentType := 'application/json'; 
    idhttp.Request.Charset := 'UTF-8'; 
    IdHttp.IOHandler := IdSSLIOHandlerSocketOpenSSL1; 

    // Set username and password: 
    idHttp.Request.Clear; 
    idHttp.Request.BasicAuthentication := False; 
    idHttp.Request.Username := 'usuario'; 
    idHttp.Request.password := 'senha'; 

    idHttp.Response.ContentType := 'application/json'; 
    idHttp.Response.CharSet := 'UTF-8'; 

    idHttp.Post(URL, JsonStreamEnvio, JsonStreamRetorno); 

    //> Também tentei assim mas tb não funcionou 
    //>Retorno := idHttp.Post(URL, JsonStreamEnvio); 
   finally 
     //> Nenhuma dessas formar funciou para pegar o retono 
     memo2.Lines.LoadFromStream(JsonStreamRetorno); 
     memo2.Lines.add('1=' + JsonStreamRetorno.DataString); 
     memo2.Lines.add('3=' + Retorno); 
   end; 
end; 
Jonas Schen

Jonas Schen

Responder

Posts

12/08/2014

Jonas Schen

Olá,
Descobri uma parte do problema, na verdade o meu código está certo.
O problema é que dentro da API possui um tratamento de regra de negócio e caso alguma regra não seja satisfeita, ele retorna o erro 422 e retorna dentro do Json uma mensagem de erro.

O problema é que aparentemente o componente idHttp interpreta isto como um erro e "estoura" uma exceção e mostra uma mensagem de erro, e não devolve o retorno do POST.

Alguém já passou por isso? Tem como fazer o componente não gerar esta exceção ?
Responder

Gostei + 0

12/08/2014

William

Não é a melhor maneira e nem a mais apropriada, mas tente capturar esse exception dentro do bloco try ... except.. e não trate essa exceção, deixe em branco.
Responder

Gostei + 0

12/08/2014

Jonas Schen

Claro, se colocar a chamado do POST dentro de um try..except não irá mostrar a exceção do componente.
Mas se pegar o E.message irá mostrar apenas o erro HTTP, ou seja, "HTTP 1.1 422 - Unknown error".
Mas o que eu preciso é a mensagem que retorna no conteúdo do Json, por exemplo, "Cliente não localizado."
Responder

Gostei + 0

13/08/2014

Jonas Schen

Resolvido.

Contribuição muito valiosa do meu colega Thiago Blom.

  try
    idHttp.Post(URL, JsonStreamEnvio, JsonStreamRetorno);
  except
    on E:EIdHTTPProtocolException do
      ShowMessage(e.ErrorMessage);
  end;
Responder

Gostei + 0

13/08/2015

Roberto Fermino

Jonas, estou tentando utilizar o código acima, aparentemente fiz tudo que indicou aqui, mais o retorno vem vazio, será que conseguiria me ajudar, preciso muito entregar este trabalho, grato.
Responder

Gostei + 0

04/05/2017

Robson Morais

Caraca, testei também e está retornando vazio....o que pode ser ?
Responder

Gostei + 0

24/07/2019

Eduardo Alves

Caraca, testei também e está retornando vazio....o que pode ser ?


só faltou pegar a resposta:

sResposta := idHttp.Post(URL, JsonStreamEnvio, JsonStreamRetorno);
Responder

Gostei + 0

29/08/2022

Sergio Lopes

Caraca, testei também e está retornando vazio....o que pode ser ?


só faltou pegar a resposta:

sResposta := idHttp.Post(URL, JsonStreamEnvio, JsonStreamRetorno);



Boa tarde ! Estou com o mesmo problema, não consigo pegar o retorno da API quando dá excessão, o erro 422 retorna um json que tem o motivo do erro e não consigo pegar o retorno, alguem conseguiu resolver,? o exemplo acima não deu certo. obrigado!!!
Responder

Gostei + 0

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

Aceitar