Jump to content

Delphi chamada_delphi.png acbr.png

C6 chamada_c6.png botao.png

Busca CEP


Go to solution Solved by Valdir Dill,
  • Este tópico foi criado há 2057 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro

Bom dia,

Sei que a dúvida que estou postando não tem relação direta com o ACBR, mas se alguém pudere analisar e me dar uma dica, agradecerioa muito.

É o seguinte: estou tentando fazer uma busca de CEP com Firemonkey para Android.

Fiz uma rotina utilizando a classe THTTPSend e me baseiei nas rotinas do próprio acbrCEP. Funcionou 100% em Windows. Porém, quando fui complicar em Android, notei que essa classe (hpttpSend.pas) não pode ser usada para Android.

Então tentei com o componente TidHttp. Funciona tanto em Windows, como Android. Veja a rotina abaixo. Traz todos os dados do WS KingHost.
O problema neste caso, é que ele traz errado os dados que têm caractere com acento. Veja o bairro no print que estou anexando.

Rotina com TidHTTP.
prcedure BuscaCEPKIngHost;
Const
 urlKingHost = 'http://webservice.kinghost.net/web_cep.php?auth=' + VmyKey + '3c1a01713160cab43caea3d24f3baf4e&formato=xml&cep=82650520';
var
 str : String;
begin
 idHTTP1.Request.Accept := 'text/html, */*';
 idHTTP1.Request.ContentType := 'text/xml; charset=iso-8859-1';
 idHTTP1.Request.ContentEncoding := 'iso-8859-1';
 IdHTTP1.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 9.0)';
 IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
 str := IdHTTP1.Get(urlKingHost);
 Memo1.Text := str;
end; 

Pergunto:
1 - Realmente não tem como usar httpSend no Androi?
2 - No meu exemplo acima com idHttp estou fazendo algo errado na chamada? Qual a sugestão?

Obrigado

Response.png

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Fundadores

A classe Synapse deveria se compatível com Android... pois é compatível com Linux

no seu caso, vc não está considerando o "encoding" no header da mensagem HTTP

'text/xml; charset=iso-8859-1';

 

Tente:

 Memo1.Text := ACBrStr(str);

  • Like 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link to comment
Share on other sites

  • Membros Pro
1 hora atrás, Daniel Simoes disse:

A classe Synapse deveria se compatível com Android... pois é compatível com Linux

no seu caso, vc não está considerando o "encoding" no header da mensagem HTTP

'text/xml; charset=iso-8859-1';

 

Tente:

 Memo1.Text := ACBrStr(str);

Bom dia e obrigado Daniel,

no seu caso, vc não está considerando o "encoding" no header da mensagem HTTP
'text/xml; charset=iso-8859-1';

Pode me passar uma dica de como fazer isso?

Tente Memo1.Text := ACBrStr(str);
Não funcionou. O str volta como foi, sem alterações.

Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Fundadores

Não sei como seria na Indy.. vc precisa ler o Header da resposta do HTTP, e verificar se o Encoding que o Servidor está usando, é o mesmo que você espera...

99% dos servidores Web usam UTF8.. (e o Delphi não)... então tente converter a resposta de UTF8 para String

No ACBrSoket.pas, veja o método   " function GetHeaderValue( AValue : String ) : String ;"

    // Verifica se a Resposta está em ANSI //
    CT     := LowerCase( GetHeaderValue('Content-Type:') );
    IsUTF8 := (pos('utf-8', CT) > 0);      

 

 

  • Like 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link to comment
Share on other sites

  • Membros Pro
  • Solution
Em 27/09/2016 at 10:05, Daniel Simoes disse:

A classe Synapse deveria se compatível com Android... pois é compatível com Linux

no seu caso, vc não está considerando o "encoding" no header da mensagem HTTP

'text/xml; charset=iso-8859-1';

 

Tente:

 Memo1.Text := ACBrStr(str);

Obrigado, consegui resolver...

Olha a função que criei. Funciona tanto no Win como Android. Compartilho para ajudar outros, se precisarem.

class procedure TFuncoes.BuscaCEPKIngHost(VCEP : String; Const VResult : TCEP);
Const
 VChave = 'XXXXXX';
 VUrl = 'http://webservice.kinghost.net/web_cep.php?auth=';
Var
 VStream : TStringStream;
 VRetorno : String;
 VIdHttp : TIdHTTP;
 VURLFinal : String;
begin
 VResult.FQtdeEnder := 0;
 VCEP := SomenteNumeros(VCEP);
 if length(VCEP) <> 8 then exit; //se não é um CEP válido nem analisa.

 VStream := TStringStream.Create('', TEncoding.ANSI{tem q ter esse ANSI para não dar erro no Android});
 VIdHttp := TIdHTTP.Create(nil);

 try
  VURLFinal := VUrl + VChave + '&formato=xml&cep=' + VCEP;
  VIdHttp.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 9.0)';
  VIdHttp.Get(VURLFinal, VStream);
  VRetorno := VStream.DataString;

  VResult.FQtdeEnder := StrToIntDef(LerTagXML(VRetorno, 'resultado'), 0);
  if VResult.FQtdeEnder > 0 then
   begin //obs LerTagXML é uma função do acbrUtil
    VResult.FTipoLogr := LerTagXML(VRetorno, 'tipo_logradouro');
    VResult.FLogr := LerTagXML(VRetorno, 'logradouro');
    VResult.FCompl := LerTagXML(VRetorno, 'complemento');
    VResult.FBairro := LerTagXML(VRetorno, 'bairro');
    VResult.FCidade := LerTagXML(VRetorno, 'cidade');
    VResult.FUF := LerTagXML(VRetorno, 'uf');
   end;
 finally
  VStream.DisposeOf; VIdHttp.DisposeOf;
 end;
end;

Obrigado!!

  • Like 1

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Este tópico foi criado há 2057 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

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
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.