Jump to content
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; 

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other 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;

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.