Idhttp metodo get está resultando quot;invalid requestq

Delphi

14/03/2005

Colegas, preciso de um grande favor.

estou criando uma form que faz um registro, ou cadastro, de um cliente via web, estou usando o idhttp com método get.

Tudo funciona tranquilo, mas se uma das variaveis do tipo string, como a razão do cliente , por exemplo, tiver um caracter ´ ´ espaço, tipo ´minha empresa´, então ocorre o erro de ´invalid request´. Se tiver acentos ou ç também da esse erro.

Tem alguma função que formata essas strings direitinho pra mim? tipo substitui ´ ´ espaço por ¬20, ou í por iacute, sei lá.

Tentei fazer uma função que suprimisse qualquer caracter acentuado. beleza, funcionou, mas na hora de substituir espaço por ¬20 deu outro erro moh estranho. Nem sei o que fazer. por enquanto estou substituindo espaço por ´_´.

Alguém tem alguma sugestão?

ValeW!!!


Vitor Rubio

Vitor Rubio

Curtidas 0

Respostas

Massuda

Massuda

14/03/2005

A classe TIdURI, definida na unit IdURI, possui uma função de classe para codificar parametros
uses
  IdURI,
....
var
  S: string;
....
  S :=  := TIdURI.ParamsEncode(´gn=grupo local&cidade=São Paulo´);
  // S contem ´gn=grupo¬20local&cidade=S¬E3o¬20Paulo´
Por ser uma função de classe, você não precisa ter um objeto/instância da classe.


GOSTEI 0
Vitor Rubio

Vitor Rubio

14/03/2005

Muito obrigado massuda, era algo assim que eu estava precisando. Não estou na firma agora então vou ter que testar depois. Mas surgiu outra dúvida:

Você disse que era uma função de classe e que eu não precisava criar uma instância desssa classe. O que significa um método de classe? Isso significa que eu não preciso criar uma variável do tipo TIdURI ? Como pode ser isso, por exemplo, como eu crio métodos assim, desse tipo, nas minhas classes?


Valew!


GOSTEI 0
Massuda

Massuda

14/03/2005

[quote:dd7547a581=´vitor^_^´]O que significa um método de classe? Isso significa que eu não preciso criar uma variável do tipo TIdURI ?[/quote:dd7547a581]Um método de classe é uma função ou procedure que não está atrelada a uma instância da classe ou, como você escreveu, não é preciso criar uma variável da classe para poder utilizar.

Isso tem alguns inconvenientes... por exemplo, você não pode fazer referencia direta aos membros e métodos normais da classe (pois eles estão atrelados a uma instância da classe). De certa maneira, não é muito diferente de implementar funções e procedures não-relacionadas com classes.

Normalmente isso é utilizado para agrupar grupos de funções/procedures com algo em comum ou que são helpers para uma classe (como no caso do TIdURI.EncodeParams).

Não tenho certeza se isso acontece com o Delphi para .Net, mas no C# onde tudo é uma classe, é comum encontrar métodos de classe.

[quote:dd7547a581=´vitor^_^´]Como pode ser isso, por exemplo, como eu crio métodos assim, desse tipo, nas minhas classes?[/quote:dd7547a581]use a palavra reservada [b:dd7547a581]class[/b:dd7547a581]:
type
  TExemplo = class
    ....
    FExemplo: TAbc;
    ....
    class function Exemplo1(...): TXyz; // função de classe
    class procedure Exemplo2(...); // procedure de classe
    ....
Lembrando que Exemplo1() e Exemplo2() não podem fazer referencia direta ao membro FExemplo; isso só é possível-se Exemplo1() ou Exemplo2() receberem como um dos argumentos uma instancia da classe TExemplo.


GOSTEI 0
Vitor Rubio

Vitor Rubio

14/03/2005

massuda, me ajuda de novo pls!!!

eu usei a função do jeito que vc falou, mas deu a seguinte exception:

eidhttpProtocolException com a mensagem:

<!DOCTYPE HTML PUBLIC ´-//IETF//DTD HTML 2.0//EN´>

o que é isso, estou usando protocolo 1_1, não existe 2_0, se é que é esse o problema...


Valew!


GOSTEI 0
Massuda

Massuda

14/03/2005

[quote:a5be5e9538=´vitor^_^´]eidhttpProtocolException...[/quote:a5be5e9538]O Indy gera essa exceção quando o servidor HTTP responde um código que o Indy desconhece.

Como você está usando Get, seria possível você abrir a URL que você está tentando acessar diretamente no seu navegador... experimente testar com a URL que o Indy está gerando.


GOSTEI 0
Vitor Rubio

Vitor Rubio

14/03/2005

Massuda, fiz o teste colocando a string gerada pela função no browser e funcionou legal. Eu estava concatenando as strings com os parametros da minha url num objeto do tipo tstringlist, na propriedade text, e estava dando esse erro. Aí eu troquei o tstringlist por uma string comum e funcionou. estrannho né? eu não estava usando o método add, nem o append.

de qualquer forma agora funcionou, Valew!!!


GOSTEI 0
Massuda

Massuda

14/03/2005

[quote:e7562b5c6c=´vitor^_^´]... Eu estava concatenando as strings com os parametros da minha url num objeto do tipo tstringlist, na propriedade text, e estava dando esse erro...[/quote:e7562b5c6c]Quando você pega uma lista de strings de um TStringList pela propriedade Text, a string resultante contem um par CR/LF (#1310) separando os itens da lista original. Por isso que mudar para um string normal resolveu.


GOSTEI 0
POSTAR