【问题标题】:Delphi indy10 http server and ExtJS form submitDelphi indy10 http服务器和ExtJS表单提交
【发布时间】:2011-01-23 18:33:15
【问题描述】:

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

我有一个 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

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

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

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

EDIT3

我下载了最新的夜间版本 od Indy10。还是同样的问题。

EDIT4

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

【问题讨论】:

    标签: javascript delphi extjs submit indy10


    【解决方案1】:

    我正在使用 Delphi 7 并迁移到 Indy 10。我发现葡萄牙语字符可能存在问题,并通过更改以下源来解决此问题:

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

    结束;

    【讨论】:

      【解决方案2】:

      字符串似乎是 URL 编码的,因此您使用以下代码进行解码:

      uses
        idURI;
      
      value := TIdURI.URLDecode( value );
      

      编辑

      似乎存在解码器无法将双字节正确解码为单个字符的情况。查看源代码,如果字符编码为 %UC48D ,它确实会正确解码,但在我的测试中,它仍然无法正确解码。有趣的是,TidURI.ParamsEncode 函数会生成正确的编码,但使用最新版本的 Indy 10 中的正确例程,这种编码是不可逆的。

      【讨论】:

      • 是的,字符串是 URL 编码的。我会马上试试。我尝试将参数作为 JSON 发送并且它们正确到达,所以你可能是正确的。
      • 从文档中这应该可以工作。但事实并非如此。嗯,我错过了什么?
      • Indy 中似乎存在双字节字符解码的错误。 Synapse 也会出现这个问题。
      • 是的,我认为这也是一个错误。它在 BDS2006 下工作正常,所以它必须是 unicode 相关的。奇怪的是我还没有看到任何关于这方面的报道。
      【解决方案3】:

      回答这个话题。

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

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

      【讨论】:

      • TIdHTTPServer 的解码能力,即使在 Ansi 版本的 VCL 中,也存在尚未解决的已知问题。
      • 感谢您的信息。我担心我做错了什么:)
      猜你喜欢
      • 2010-12-18
      • 2012-08-10
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 2012-02-08
      • 2013-06-03
      • 2013-03-17
      • 2014-05-17
      相关资源
      最近更新 更多