目前我可以运行一个命令,但我无法弄清楚如何将结果变成一个字符串。
我这样做是
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\n
和Content-Type: text/html\r\n
不知道这是否重要。
感谢
答案 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;