2010-03-04 14 views
5

Mam problem, nie wiem jak rozwiązać.Delphi indy10 serwer http i formularz ExtJS złożyć

Mam serwer HTTP Indy10. Używałem zarówno serwerów HTTP Indy9, jak i Indy10 w wielu aplikacjach i nigdy nie miałem żadnych problemów. Ale teraz używam serwera HTTP Indy10 z frameworkiem javascript RAI ExtJS.

Problem polega na tym, że przesyłam dane zawierające znaki inne niż ansi. Na przykład, gdy przesyłam list "č", który jest listem w 1250 stronie kodowej (słoweński, chorwacki ...), otrzymuję następujące w Indy w "niezapisane parametry" -> "% C4% 8D". Jest to poprawna szesnastkowa reprezentacja litery "č" w kodowaniu utf-8. Wszystkie moje strony są utf-8 i nigdy nie miałem problemów z przesłaniem danych formularzy do Indy. Debugowałem kod i zobaczyłem, że otrzymałem sekwencję takich bajtów: [37, 67, 52, 37, 56, 68]. Jest to reprezentacja bajtowa ciągu "% C4% 8D". Ale oczywiście Indy nie może zakodować tego poprawnie do UTF-16. Tak więc jako przykład. Rzeczywiste pole formularza:

FirstName=črt 

wychodzi tak, gdy zgłosił:

FirstName=%C4%8Drt 

nie wiem jak rozwiązać ten problem. Spojrzałem na fora ExtJS, ale nie ma na ten temat nic. Ktoś wie coś na temat tego rodzaju problemu?

EDIT:

Gdybym kodować JSON reklam params przylatują poprawnie. Próbowałem również URL dekodować parametry, ale wynik nie jest poprawny. Może coś przeoczyłem. Spojrzę na to jeszcze raz. I tak wydaje się, że koduje ExtJS URL params

EDIT2:

ok, odkryłem więcej. Porównałem rzeczywistą zawartość danych pocztowych. To jest tak:

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

W obu przypadkach niezaprogramowane parametry są identyczne. Mam ParseParams włączony i w BDS2006 są poprawnie przetwarzane, ale w 2010 roku nie są. To jest Indy10 w pakiecie z delphi. Czy w tej wersji występuje błąd lub czy robię coś nie tak?

Edit3:

Pobrałem najnowszą nightly build OD Indy10. Wciąż ten sam problem.

EDIT4:

jestem zmuszony przyjąć własną odpowiedź.

Odpowiedz

4

Aby odpowiedzieć na ten temat.

To zdecydowanie nie działa tak, jak powinno, pod Unicode. Indy używa wewnętrznych znaków unicode. Problem polega na tym, że parametry są dekodowane do TStringList. Problemem jest linia:

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

znaleźć w "TIdHTTPRequestInfo.DecodeAndSetParams". Nie dekoduje poprawnie paramsów, prawdopodobnie dlatego, że pracuje nad ciągami Unicode.

Rozwiązaniem, które znalazłem, jest użycie "HTTPDecode" z "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; 

Ale nie mogę uwierzyć, że takie wspólne zadanie nie działa poprawnie. Czy ktoś może potwierdzić, że to naprawdę błąd, czy robię coś złego?

+2

Możliwości dekodowania TIdHTTPServer, nawet w wersjach VSI systemu Ansi, mają znane problemy, które nie zostały jeszcze rozwiązane. –

+0

Dzięki za informacje. Obawiałem się, że robię coś złego :) – Runner

1

Wydaje się, że łańcuch jest zakodowany w adresie URL, więc można użyć następującego kodu do dekodowania:

uses 
    idURI; 

value := TIdURI.URLDecode(value); 

edit

Wydaje się, że jest to przypadek, gdy dekoder nie poprawnie dekodować podwójna bajtów jako pojedynczy znak. Patrząc na źródło, wygląda na to, że będzie on poprawnie dekodowany, jeśli znak jest kodowany jak% UC48D, ale w moich testach nadal nie dekoduje się poprawnie. Co ciekawe, to TidURI.Funkcja ParamsEncode generuje odpowiednie kodowanie, ale kodowanie to nie jest odwracalne przy użyciu odpowiednich procedur w najnowszej wersji Indy 10.

+0

Tak, ciągi są zakodowane za pomocą adresu URL. Spróbuję tego od razu. Próbowałem wysłać parametry w postaci JSON-a i one dotarły poprawnie, więc prawdopodobnie masz rację. – Runner

+0

Z dokumentacji powinno to zadziałać. Ale tak nie jest. Hm czego mi brakuje? – Runner

+0

Wygląda na to, że w Indy jest błąd z dwubajtowym dekodowaniem znaków. Ten problem pojawia się również w Synapse. – skamradt

1

jestem przy użyciu Delphi 7 i migrować do Indy 10. Znalazłem prawdopodobny problem z postaciami portugalskiej i rozwiązać ten problem zmieniając źródło poniżej:

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

koniec;

Powiązane problemy