向TIdHttp请求添加自定义标头,标头值包含逗号

10
我正在使用Delphi XE2和Indy 10.5.8.0。我有一个TIdHttp实例,并且我需要向请求中添加自定义标头。标头值中有逗号,因此它会被自动解析为多个标头。我不希望它这样做。我需要自定义标头的标头值仍然是一个字符串,而不是基于逗号分隔符拆分。
我尝试设置IdHttp1.Request.CustomHeaders.Delimiter := ';'但没有成功。有没有办法确保标头不被拆分?
procedure SendRequest;
const HeaderStr = 'URL-Encoded-API-Key VQ0_RV,ntmcOg/G3oA==,2012-06-13 16:25:19';
begin
  IdHttp1.Request.CustomHeaders.AddValue('Authorization', HeaderStr);
  IdHttp1.Get(URL);
end;

1
如果我没记错的话,你可以这样做:IdHttp1.Request.CustomHeaders.Value['Authorization'] := HeaderStr; 对于所有“自定义标头”都是如此,不要忘记SSL! - user497849
1
无论您使用 AddValue() 还是 Value[],最终字符串都会进入 TIdHeaderList.FoldAndInsert(),这是字符串被解析、分割成片段并添加到列表中的地方。 - Remy Lebeau
1个回答

6
我无法重现此问题,使用最新的Indy 10.5.8 SVN快照。 你展示的字符串在我的电脑上被分配为一行。
默认情况下,TIdHeaderList.FoldLines属性设置为True,在空格和逗号字符上折叠行,因此这就解释了为什么您的字符串会被拆分。据我所知,在您的Indy版本和SVN中的最新版本之间,未对折叠算法进行任何逻辑更改。

将FoldLines设置为False就解决了问题。Delphi中的Indy文档说,FoldLength是强制标题值换行的内容(而不是空格或逗号),所以我甚至没有尝试过折叠。这是一个很棒的未记录的技巧,谢谢Remy! - Sam M
TIdHeaderList.FoldLength 属性的默认值为 78。您正在添加的最终标题长度为 75,因此即使设置了 TIdHeaderList.FoldLines 属性为 True,它也不应该被折叠成多行。当我将 TIdHeaderList.FoldLength 属性缩短到 74 或更少时,我看到您的行按预期折叠。因此,在您的情况下,您可以将“FoldLength”设置为比 75 更高的值(如果尚未),或将其设置为“MaxInt”以另一种方式禁用折叠。 - Remy Lebeau
当一行被折叠时,它会在距离该行FoldLength位置最近的空格/逗号字符处折叠。 - Remy Lebeau
“TIdHeaderList.FoldLength”属性的默认值为78。自2013年9月以来,Indy现在在“TIdHTTP”中将默认的“FoldLength”设置为“MaxInt”,从而有效地禁用了折叠功能。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接