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

标签 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

提交后是这样的:

FirstName=%C4%8Drt

我不知道如何解决这个问题。我查看了 ExtJS 论坛,但没有关于此主题的内容。有人知道这类问题吗?

编辑:

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

EDIT2:

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

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

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

EDIT3:

我下载了 Indy10 的最新夜间构建。还是一样的问题。

EDIT4:

我不得不接受我自己的回答。

最佳答案

回答这个话题。

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

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

在“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;

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

关于javascript - Delphi indy10 http服务器和ExtJS表单提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2381017/

相关文章:

javascript - Object.assign(...as) 更改输入参数

javascript - 在nodejs中获取request.body值未定义?

delphi - 常量类实例

delphi - 您可以中断 Indy 连接通话吗?

delphi 在释放对象时失去值(value)

javascript - 使用 Javascript 获取 JSF 定义的组件

javascript - 如何启用页内编辑功能?

sencha-touch - Sencha Touch itemtap

javascript - 我想隐藏树状网格(带列的树面板)中非叶节点上的复选框

javascript - Sencha Touch 中 "config "和 "defaults"之间的区别?