Ir para conteúdo
  • Cadastre-se

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

Recommended Posts

  • Membros Pro
Postado

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

 

 

  • Fundadores
Postado

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);

  • Curtir 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.

  • Membros Pro
Postado
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

 

 

  • Fundadores
Postado

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);      

 

 

  • Curtir 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.

  • Membros Pro
  • Solution
Postado
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!!

  • Curtir 1

Valdir Dill

Rio de Janeiro - RJ

 

 

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.