【问题标题】:Get string from a idhttp get从 idhttp 获取字符串
【发布时间】:2014-07-29 06:11:13
【问题描述】:

目前我能够运行命令,但我不知道如何将结果转换为字符串。

我就是这样

idhttp1.get('http://codeelf.com/games/the-grid-2/grid/',TStream(nil));

一切似乎运行正常,在wireshark 中我可以看到该命令的结果。现在如果我这样做了

HTML := idhttp1.get('http://codeelf.com/games/the-grid-2/grid/');

它会冻结应用程序,在wireshark中我可以看到它发送了GET并得到了响应,但不知道它为什么会冻结。 HTML 只是一个字符串变量。

编辑完整代码

按钮点击 login(EUserName.Text,EPassWord.Text);

    procedure TForm5.Login(name: string; Pass: string);
var
 Params: TStringList;
 html : string;
begin
  Params := TStringList.Create;
  try
    Params.Add('user='+name);
    Params.Add('pass='+pass);
    Params.Add('sublogin=Login');


    //post password/username
     IdHTTP1.Post('http://codeelf.com/games/the-grid-2/grid/', Params);
    //get the grid source
     HTML := idhttp1.Get('http://codeelf.com/games/the-grid-2/grid/');

  finally
    Params.Free;
  end;
llogin.Caption := 'Logged In';
end;

响应 我得到的回复说Transfer-Encoding: chunked\r\nContent-Type: text/html\r\n 不知道这是否重要。 谢谢

【问题讨论】:

  • 为什么要谈备忘录?你知道如何使用备忘录吗?或者是 GET 的问题?专注于一个问题,让事情变得简单。我怀疑这是GET。你真的找不到示例代码吗?就好像你根本没有研究一样。
  • 问题中的代码很好,分配给 HTML 的行。您的问题出在我们看不到的代码中。大概。您是否尝试过制作一个只调用 Get 的非常简单的程序?
  • @DavidHeffernan 这是我从冻结和不冻结更改的所有代码,我什至不在其他任何地方使用 HTML。我将发布大约 10 行的所有代码..给我一秒钟来更新它
  • @DavidHeffernan 现在你能明白我为什么把它贴在这里了吗?我不明白为什么它会冻结。也没有示例可以告诉我?
  • 分块 Http 响应导致 Get 阻塞。持久连接不断地从服务器接收数据。

标签: delphi delphi-xe2 indy10


【解决方案1】:

Indy 支持某些类型的流式 HTTP 响应(请参阅 New TIdHTTP hoNoReadMultipartMIME flag),但这只有在服务器使用 multipart/* 响应时才有帮助。链接的博客文章进一步解释了细节,还展示了 Indy HTTP 组件如何为 MIME 解码器提供连续响应流。

如果这不适用于您的情况,解决方法是深入到“原始”TCP 层,这意味着使用 TIdTCPClient 组件发送 HTTP 请求,然后逐行(或逐字节)读取响应) 来自 IOHandler。这可以完全控制响应处理。请求和响应应该在一个线程中处理,以将其与主线程解耦。

【讨论】:

    【解决方案2】:

    TIdHTTP.Post()返回响应数据,你不应该调用TIdHTTP.Get()单独检索它:

    procedure TForm5.Login(name: string; Pass: string);
    var
      Params: TStringList;
      html : string;
    begin
      Params := TStringList.Create;
      try
        Params.Add('user='+name);
        Params.Add('pass='+pass);
        Params.Add('sublogin=Login');
    
        //post password/username
        HTML := IdHTTP1.Post('http://codeelf.com/games/the-grid-2/grid/', Params);
      finally
        Params.Free;
      end;
      llogin.Caption := 'Logged In';
    end;
    

    【讨论】:

    • 从我在wireshark上观看时看到的情况来看,一旦我登录它,它就发送了一个数据不多的回复。我不记得它到底是什么,但似乎你登录了..也许是cookies或其他东西..但我必须运行一个get才能重新加载?我猜.. 页面,并获得 HTML 的响应.. 我会试试这个,但我认为它只会给我第一个回复的文本,这似乎什么都没有
    • 在获取另一个 URL 之前必须登录到一个 URL 并不少见。但是,POST 然后 GET 到同一个 URL 并不常见。 HTTP 重定向通常用于处理这种情况,TIdHTTP 可以为您处理重定向。如果没有看到实际的 Wireshark 捕获,很难说出实际发生的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多