从idhttp get获取字符串

时间:2014-07-29 06:11:14

标签: delphi delphi-xe2 indy10

目前我可以运行一个命令,但我无法弄清楚如何将结果变成一个字符串。

我这样做是

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只是一个字符串var。

编辑完整代码

按钮点击  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不知道这是否重要。 感谢

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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;