Integração API Rest utilizando Json
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:
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
Curtidas 1
Respostas
Jonas Schen
12/08/2014
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 ?
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 ?
GOSTEI 0
William
12/08/2014
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.
GOSTEI 0
Jonas Schen
12/08/2014
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."
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."
GOSTEI 0
Jonas Schen
12/08/2014
Resolvido.
Contribuição muito valiosa do meu colega Thiago Blom.
Contribuição muito valiosa do meu colega Thiago Blom.
try
idHttp.Post(URL, JsonStreamEnvio, JsonStreamRetorno);
except
on E:EIdHTTPProtocolException do
ShowMessage(e.ErrorMessage);
end;
GOSTEI 0
Roberto Fermino
12/08/2014
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.
GOSTEI 0
Robson Morais
12/08/2014
Caraca, testei também e está retornando vazio....o que pode ser ?
GOSTEI 0
Eduardo Alves
12/08/2014
Caraca, testei também e está retornando vazio....o que pode ser ?
só faltou pegar a resposta:
sResposta := idHttp.Post(URL, JsonStreamEnvio, JsonStreamRetorno);
GOSTEI 0
Sergio Lopes
12/08/2014
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!!!
GOSTEI 0