2010-03-04 7 views
5

Ho un problema che non so come risolvere.Delphi server http indy10 e modulo ExtJS inviare

Possiedo un server HTTP Indy10. Ho usato entrambi i server HTTP Indy9 e Indy10 in molte applicazioni e non ho mai avuto problemi. Ma ora sto usando il server HTTP Indy10 con il framework RAI javascript di ExtJS.

Il problema si verifica quando invio dati che contengono caratteri non ansi. Per esempio quando invio la lettera "č" che è una lettera nel 1250 codepage (slovena, croata ...) ottengo il seguente in Indy sotto "parametri non analizzati" -> "% C4% 8D". Questa è la corretta rappresentazione esadecimale della lettera "č" nella codifica utf-8. Tutte le mie pagine sono utf-8 e non ho mai avuto problemi ad inviare i dati del modulo a Indy. Ho eseguito il debug del codice e ho visto che effettivamente ottengo una sequenza di byte come questa: [37, 67, 52, 37, 56, 68]. Questa è la rappresentazione in byte della stringa "% C4% 8D". Ma ovviamente Indy non può codificarlo correttamente in UTF-16. Quindi, ad esempio. Il campo di modulo attuale:

FirstName=črt 

viene fuori come questo quando submited:

FirstName=%C4%8Drt 

non so come risolvere questo. Ho guardato i forum di ExtJS, ma non c'è nulla su questo argomento. Qualcuno sa qualcosa su questo tipo di problema?

EDIT:

Se ho codificare params annuncio JSON arrivano in modo corretto. Ho anche provato a decodificare l'URL dei parametri, ma il risultato non è corretto. Forse mi sono perso qualcosa. Lo guarderò di nuovo. E sì, sembra che ExtJS URL codifica i params

EDIT2:

Ok, ho scoperto di più. Ho confrontato il contenuto effettivo dei dati del post. È così:

Delphi 2006 (Indy10): FirstName=%C4%8D 
Delphi 2010 (Indy10): FirstName=%C4%8D 

In entrambi i casi i parametri non analizzati sono identici. Ho attivato ParseParams e nel BDS2006 sono stati analizzati correttamente, ma non nel 2010. Questo è Indy10 gonfiato con delphi. C'è un bug in questa versione o sto facendo qualcosa di sbagliato?

Edit3:

ho scaricato l'ultima nightly build od Indy10. Ancora lo stesso problema.

edit4:

sono costretto ad accettare la mia risposta personale.

risposta

4

Per rispondere a questo argomento.

Questo non funziona come dovrebbe in Unicode. Indy usa stringhe unicode internamente. Il problema è quando i parametri vengono decodificati su TStringList. Il problema è la linea:

Params.Add(TIdURI.URLDecode(s)); 

trovato nel "TIdHTTPRequestInfo.DecodeAndSetParams". Non decodifica i parametri correttamente, probabilmente perché funziona su stringhe Unicode.

La soluzione che ho trovato è utilizzare "HTTPDecode" da "HTTPApp.pas".

Params := TStringList.Create; 
try 
    Params.StrictDelimiter := True; 
    Params.Delimiter := '&'; 

    // parse the parameters and store them into temporary string list 
    Params.DelimitedText := UTF8ToString(HTTPDecode(UTF8String(Request.UnparsedParams))); 
    // do something with params... 
finally 
    Params.Free; 
end; 

Ma non posso credere che un compito così comune non funzioni correttamente. Qualcuno può confermare che questo è davvero un bug o sto facendo qualcosa di sbagliato?

+2

Le capacità di decodifica di TIdHTTPServer, anche nelle versioni Ansi della VCL, hanno problemi noti che non sono ancora stati risolti. –

+0

Grazie per le informazioni. Ero preoccupato che stavo facendo qualcosa di sbagliato :) – Runner

1

Sembra la stringa è codificato URL, in modo da utilizzare il seguente codice da decodificare:

uses 
    idURI; 

value := TIdURI.URLDecode(value); 

modificare

Sembra ci sia un caso in cui il decoder non decodifica correttamente il doppio byte come un singolo carattere. Guardando la fonte, sembra che decodificherebbe correttamente se il personaggio è codificato come% UC48D ma nel mio test questo non viene ancora decodificato correttamente. Ciò che è interessante è che il TidURI.La funzione ParamsEncode genera la codifica corretta, ma questa codifica non è reversibile utilizzando le routine corrette nell'ultima versione di Indy 10.

+0

Sì, le stringhe sono codificate URL. Ci proverò subito. Ho provato a inviare parametri come JSON e arrivano correttamente, quindi probabilmente hai ragione. – Runner

+0

Dalla documentazione questo dovrebbe funzionare. Ma non è così. Hm cosa mi sto perdendo? – Runner

+0

Sembra che ci sia un bug in Indy con decodifica caratteri a doppio byte. Questo problema emerge anche con Synapse. – skamradt

1

Sto usando Delphi 7 e migrare verso Indy 10. ho trovato probabile problema con i caratteri portoghese e risolvere questo cambiando la fonte di seguito:

procedure TIdHTTPRequestInfo.DecodeAndSetParams(const AValue: String); 
    ... 
    //Params.Add(TIdURI.URLDecode(s)); //-- UTF8 supose 
    Params.Add(TIdURI.URLDecode(s,TIdTextEncoding.Default)); //-- ASCII worked 
    ... 

fine;

Problemi correlati