【问题标题】:delphi how to keep program connected to a site using tIdHTTPdelphi如何使用tIdHTTP保持程序连接到站点
【发布时间】:2013-10-10 22:48:19
【问题描述】:

我有一个问题,我可以使用 tIdhttp 毫无问题地连接到我想要的站点,但问题是我无法从其他按钮连接。

我已经在函数之外声明了这些变量..这会有所帮助,但它没有

var
  Form1: TForm1;
   HTTP : TIDHTTP;
 Cookie : TidCookieManager;

implementation

{$R *.dfm}

函数中的这个

    HTTP := TIDHTTP.Create(NIL);
     Cookie := TidCookieManager.Create(nil);



     HTTP.Request.UserAgent := 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729)';
     HTTP.Request.Accept := 'text/html, */*';
     HTTP.Request.CacheControl := 'no-cache';
     HTTP.AllowCookies := True;
     HTTP.HandleRedirects := True;
     HTTP.ProtocolVersion := pv1_1;
     HTTP.CookieManager := Cookie;
     HTTP.RedirectMaximum := 15;

    Data := TStringList.Create;
 Page := TStringList.Create;

 Data.Add('LoginForm[username]=xxxLoginForm[password]=xxx&LoginForm[rememberMe]=0');
Page.Text :=  HTTP.Post('http://somesite.com/login.html',Data);


 If Pos('>Logout', Page.Text) = 0 Then Result := False
 else Result := True;



 Page.Free;
 Data.Free;
// HTTP.Free;
end;

按钮2

HTTP.Get('http://somesite.cc/info/523364d0/'); // this does not work it show that im not connected ..but the function already connected to the site.

在 button1 中,我可以使用我的功能成功连接(登录到站点)然后我使用 HTTP.get 在 button2 中单击以获取文件,但它失败了,这表明我没有登录 所以我怎样才能让我的程序保持连接,所以我只能在没有再次登录的情况下调用获取页面(在其他按钮中)。

抱歉我的英语不好。

【问题讨论】:

  • 请粘贴单位的完整代码。
  • 好的,我已经在函数中发布了所有代码
  • 您可以使用网络浏览器登录吗?如果是这样,那么使用像 Wireshark 这样的数据包嗅探器来捕获该 HTTP 数据,然后您可以编写 TIdHTTP 来复制它。您可能遗漏了网络浏览器发送和/或网络服务器需要的内容。
  • 可以但不能?
  • 这可能只是一个拼写错误,但您的主机名不匹配(somesite.ccsomesite.com),而且您发布到 HTML 页面似乎很奇怪。确保您发布到表单的操作。你确定登录成功了吗?即使您可以将所有参数放在一行中,您也会缺少第一个和第二个参数之间的& 分隔符。

标签: delphi indy


【解决方案1】:

您的登录数据格式错误。您不仅在用户名和密码字段之间缺少&,而且您不应该一开始就将所有内容都放在一个TStringList 条目中。 TIdHTTP 期望每个字段在TStringList 中都有自己的条目,然后在格式化 HTTP 请求时将这些值编码和连接在一起。

换句话说,改变这个:

Data.Add('LoginForm[username]=xxxLoginForm[password]=xxx&LoginForm[rememberMe]=0');

到这里:

Data.Add('LoginForm[username]=xxx');
Data.Add('LoginForm[password]=xxx');
Data.Add('LoginForm[rememberMe]=0');

如果这仍然不起作用,那么问题必须与 HTTP 会话有关。服务器在登录时发送一个 cookie,TIdCookieManager 拒绝,或者TIdCookieManager 没有在后续请求中将 cookie 发送回同一 HTTP 服务器,或者后续请求可能需要指定一个设置为的 Referer以前的 URL(某些服务器确实需要)。

【讨论】:

  • 我的代码工作正常,我在按钮 ONE 中调用我的函数并成功登录,我想在按钮 TWO 中获得一个页面,但它说我已登录但在我的函数中的按钮中我已登录
  • 我的代码工作正常,我在按钮 ONE 中调用我的函数并成功登录,我想在按钮 2 中获取一个页面,但它说我没有登录但在我的函数中的按钮 ONE 中我已登录在我不想每次访问每个按钮中的页面时都登录
  • 你需要将TStringList的内容分开。不管你有什么“作品”,我展示的是TIdHTTP 所期望的(我应该知道,我写的)。此外,正如 Marcus 评论的那样,您的代码逻辑还存在一些其他问题(请求不同域中的 URL、发布到 HTML 页面等),这表明您显示的内容可能不是您的实际代码。真的吗?您是否像我建议的那样嗅探网络浏览器的流量以与TIdHTTP 流量进行比较?没有它,就很难知道什么是正确“有效”的,什么是缺失的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 2011-03-31
  • 2020-06-18
  • 2021-11-15
相关资源
最近更新 更多