Indy 10 手动将EditThisCookie导出Cookie添加到TIdHTTP Cookie管理器
问题排查
你的代码存在两处明确错误,是导入失败的核心原因:
- 赋值笔误:处理
value字段时,你错误将提取到的Cookie值赋值给了Path属性,不仅覆盖了之前正确设置的路径,还没有将值写入Cookie的Value字段:
// 错误写法 if Copy(StringList.Strings[i], 1, 8) = '"value":' then begin StringList.Strings[i] := Copy(StringList.Strings[i], 9, MaxInt); MyCookie.Path := GetBetween(StringList.Strings[i], '"', '"'); Continue; end; // 修正写法 if Copy(StringList.Strings[i], 1, 8) = '"value":' then begin StringList.Strings[i] := Copy(StringList.Strings[i], 9, MaxInt); MyCookie.Value := GetBetween(StringList.Strings[i], '"', '"'); Continue; end;
- 缺失去期时间处理:你没有解析
expirationDate字段,该字段是Unix时间戳格式,需要转换为Delphi的TDateTime类型赋值给MyCookie.Expires;如果session字段为true则不需要设置过期时间,直接将MyCookie.Session设为true即可。
额外建议:你当前逐行解析JSON的方式容错性极低,只要导出的JSON格式出现换行、空格变化就会解析失败,推荐使用Delphi自带的TJSONObject类处理JSON解析,稳定性更高。
TIdURI相关疑问解答
手动给TIdCookie的所有必填属性(Domain、Path、Name、Value等)赋值的场景下,不需要使用TIdURI实例。只有当你调用TIdCookieManager.AddServerCookie()这类方法,直接从HTTP响应的Set-Cookie头原始字符串导入Cookie时,才需要传入源URI来补全缺失的Domain、Path等属性,你当前的使用场景完全不需要用到TIdURI。
补充代码参考
可在原有逻辑中添加Unix时间戳转换逻辑和对应字段解析:
// 新增Unix时间戳转TDateTime函数 function UnixToDateTime(UnixTime: Integer): TDateTime; begin Result := EncodeDate(1970, 1, 1) + UnixTime / 86400; end; // 在InCookie的判断分支中新增以下逻辑 if Copy(StringList.Strings[i], 1, 16) = '"expirationDate":' then begin StringList.Strings[i] := Copy(StringList.Strings[i], 17, MaxInt); // 去掉末尾逗号后转换为时间 MyCookie.Expires := UnixToDateTime(StrToInt(Trim(Copy(StringList.Strings[i], 1, Pos(',', StringList.Strings[i])-1)))); Continue; end; if Copy(StringList.Strings[i], 1, 9) = '"session":' then begin StringList.Strings[i] := Copy(StringList.Strings[i], 10, MaxInt); MyCookie.Session := BoolStrToBool(StringList.Strings[i]); Continue; end;
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

