Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jonasschen

Integração API Rest utilizando Json

Recommended Posts

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; 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 ?

Compartilhar este post


Link para o post
Compartilhar em outros sites
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;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa

Em 12/08/2014 at 15:29, jonasschen disse:

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; 

Boa Tarde! Jonas esse envio está usando certificado? pois existe o IdSSLIOHandlerSocketOpenSSL1, ele serve para inserir um certificado né? Estou usando o componente RESTRequest para enviar, mas não uso certificado e preciso assinar e enviar via HTTPS. 

Procurei e não achei um exemplo que faça isso com Delphi.

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.