Delphi indy10 http服务器和ExtJS表单提交

Run*_*ner 5 javascript delphi extjs submit indy10

我有一个问题,我不知道如何解决.

我有一个Indy10 HTTP服务器.我在许多应用程序中使用过Indy9和Indy10 HTTP服务器,从未遇到任何问题.但现在我使用带有ExtJS javascript RAI框架的Indy10 HTTP服务器.

问题是当我提交包含非ansi字符的数据时.例如,当我在1250代码页(斯洛文尼亚语,克罗地亚语......)中提交字母"č"时,我在Indy的"未解决的参数" - >"%C4%8D"中得到以下内容.这是utf-8编码中"č"字母的正确十六进制表示.我的所有页面都是utf-8,我从未向Indy提交表单数据时遇到任何问题.我调试了代码,发现我实际上得到了一个像这样的字节序列:[37,67,52,37,56,68].这是字符串"%C4%8D"的字节表示.但是当然Indy无法正确编码为UTF-16.举个例子.实际表格字段:

FirstName=?rt
Run Code Online (Sandbox Code Playgroud)

提交后出现如下:

FirstName=%C4%8Drt
Run Code Online (Sandbox Code Playgroud)

我不知道如何解决这个问题.我查看了ExtJS论坛,但这个主题没有任何内容.有人对这类问题一无所知吗?

编辑:

如果我对params ad JSON进行编码,则它们会正确到达.我也尝试对params进行URL解码,但结果不正确.也许我错过了什么.我会再看看这个.是的,似乎ExtJS URL编码参数

编辑2:

好的,我发现了更多.我比较了帖子数据的实际内容.它是这样的:

Delphi 2006 (Indy10): FirstName=%C4%8D
Delphi 2010 (Indy10): FirstName=%C4%8D
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,未解析的参数都是相同的.我打开了ParseParams,在BDS2006中它们被正确解析,但在2010年它们没有.这是使用delphi进行的Indy10.这个版本有错误还是我做错了什么?

编辑3:

我下载了最新的夜间版本Indy10.仍然是同一个问题.

编辑4:

我不得不接受自己的答案.

Run*_*ner 4

就这个话题来回答一下。

这绝对不能像在 unicode 下那样工作。Indy 在内部使用 unicode 字符串。问题在于参数被解码为 TStringList 时。问题是这一行:

Params.Add(TIdURI.URLDecode(s));
Run Code Online (Sandbox Code Playgroud)

在“TIdHTTPRequestInfo.DecodeAndSetParams”中找到。它无法正确解码参数,可能是因为它正在处理 unicode 字符串。

我发现的解决方法是使用“HTTPApp.pas”中的“HTTPDecode”。

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;
Run Code Online (Sandbox Code Playgroud)

但我无法相信这样一个常见的任务无法正常工作。有人可以确认这确实是一个错误还是我只是做错了什么?

  • 即使在 VCL 的 Ansi 版本中,TIdHTTPServer 的解码功能也存在尚未解决的已知问题。 (2认同)