【问题标题】:IdHTTP and IdCookieManager miss one cookieIdHTTP 和 IdCookieManager 缺少一个 cookie
【发布时间】:2018-05-07 13:54:58
【问题描述】:

我使用 TIdHTTP 进行网络服务请求,认证后我必须保留会话信息,但 IdCookieManager 似乎总是丢失一个 cookie...

这是我非常简单的sn-p

procedure TForm1.Button5Click(Sender: TObject);
var
  i : Integer;
  Cookie : TIdCookies;
begin
  Memo1.Lines.Clear;
  try
    IdHTTP1.AllowCookies := true;
    IdHTTP1.CookieManager := IdCookieManager1;

    IdHTTP1.Get(Edit2.Text);

    if IdCookieManager1.CookieCollection.Count = 0
     then Memo1.Lines.Add('Empty');

    Cookie := IdCookieManager1.CookieCollection;


    for i := 0 to Cookie.Count -1 do
      Memo1.Lines.Add(Cookie.Cookies[i].Domain + ': ' + Cookie.Cookies[i].CookieName +
        '=' + Cookie.Cookies[i].Value);

  except
    on E : Exception do
      Memo1.Lines.Add(E.Message);
  end;
end;

例如,如果我执行IdHTTP1.Get('www.google.com');,我会得到两个 cookie (1P_JAR,NID),但如果我在 Web 浏览器上执行,则会得到三个 (1P_JAR,NID 和 CONSENT)。

这适用于所有 URL,似乎它总是“丢失”一个 cookie

【问题讨论】:

  • 据我所知,如果没有更多详细信息,您无法将 TIdHTTP(单个请求)与浏览器(可能的多个)请求进行比较。
  • 我正在尝试使用 TIdHTTP 发送 Web 服务请求。在我这样做之前,我必须登录并使用会话 ID(存储在 cookie 中)来处理以下请求。但是如果 CookieCollection 是空的,我就不能。
  • @MarcoAndreoli 如果可以,您应该添加一些更具体的代码/服务地址。无论如何,您使用的是哪个版本的 delphi/indy?
  • 上面的代码是一个例子,每个网站的CookieCollection 都有一个cookie。我使用 delphi 2007 和 Indy 10.6.2.0
  • 你试过用 Postman 代替浏览器吗?

标签: delphi indy shiro delphi-2007 indy10


【解决方案1】:

您正在尝试将单个 GET 请求响应与浏览器响应进行比较。这不是一回事。

如果您使用例如Postman 您将得到完全相同的结果(www.google.com 的 2 个 cookie)。

我认为如果你可以控制它,你应该修改服务服务器端,如果你不能控制它,你应该以不同的方式使用它。

【讨论】:

  • 好吧,你是对的(我也尝试过 Insomnia)。但是我的问题仍然存在,我必须拥有会话的 cookie 才能执行其他 ws 请求。我的后端是由 Apache Shiro 框架管理的,可能我必须搜索那个问题
  • 你首先应该看看@RemyLebeau cmets 你原来的问题。在没有更多具体细节的情况下回答您的问题并不简单,但您可以集成一个网络浏览器(例如 TWebBrowser 或 TChromium)并让它完成繁琐的工作;然后,您可以通过 javascript 'document.cookie' 检查 cookie。同样,这只是一个抽象的例子,没有更多细节我不能更具体。
  • 不管怎样,我认为你的问题已经解决了,你应该再问一个问题,因为这个问题是关于 TIdHTTP 的误解。
猜你喜欢
  • 1970-01-01
  • 2013-08-30
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 2014-01-17
  • 1970-01-01
相关资源
最近更新 更多