【发布时间】:2013-12-01 19:22:48
【问题描述】:
我有一个以前的员工创建的组件。它使用 Indy (IDTCPClient) 和以下方法来执行请求(其中“aReadHeader”是 在传入之前构建的预定义 Uri)。
function TMyConnector.GET(aRawHeader: String): String;
begin
if Not Connected then Connected := True;
if Connected then
begin
FRawRequest := 'GET /'+ aRawHeader + ' HTTP/'+HTTPVerText+#13#10+
'Host: '+FHost+#13#10+
'Cookie: UserHPos=IOGLO00003000090000C000BS; '+
'LOSID=qsBiy/wEDCq6tOXFzGbOlTD1lmo5AXdFnCkbzzPn6+qCeheYVyTcumRrjsqh+Hds4Fr2gZDazfDzGN1RA+nnHuQQeBy78ZUgctrZyyy9MnGl2qI/ulkV6EPxAfmmLg/lopRq99f5gAcG/dgtytAJjS+aD5DqtHGrAqjiqgtkwuA=; '+
'LoginHPos=IOGLO00003000090000C000BS; '+
'UIHPos=IOGLO00003000020000500003; '+
'LOSG=61939308-7C83-47ED-B909-2D2D10AD7026; '+
'fControllingBusiness=IOGLO000030000900001000050000200001'+#13#10+
'Connection: Close'+#13#10+
#13#10;
FSock.Socket.Write(FRawRequest);
FRawResponse := FSock.Socket.ReadLn(#13#10#13#10,nil);
Result := FRawResponse;
if ResponseStream = nil then ResponseStream := TMemoryStream.Create
else ResponseStream.SetSize(0);
FSock.Socket.ReadStream(ResponseStream,-1,True);
if Connected and (Not KeepAlive) then Connected := False;
end;
end;
质疑 FRawResponse 返回的问题
HTTP/1.0 200 OK 内容长度:5560 日期:2013 年 11 月 18 日星期一 15:05:07 GMT 内容类型:text/html; charset=UTF-8 ...,public
我如何才能真正将这个 html 内容从 ResponseStream 获取到 HTML
目前存在的一种方法是“GenerateJSON”(参见下面的代码)。我想创建一个名为“GenerateHTML”
Function StreamToArray(Strm:TStream):TArray<Byte>;
Begin
Strm.Position := 0;
SetLength(Result,Strm.Size);
Strm.Read(Result[0],Strm.Size);
End;
Procedure TMyConnector.GenerateJSON;
begin
if ResponseStream <> nil then
Begin
ResponseJSON_V := TJSONObject.ParseJSONValue(StreamToArray(ResponseStream),0) as TJSONValue; // Note ResponseJSON_V is declared as TJSONValue in TMyConnector);
End;
end;
所以,我需要
Procedure TMyConnector.GenerateHTML;
begin
if ResponseStream <> nil then
Begin
// result:= html from stream here
End;
end;
编辑:
Procedure TMyConnector.GenerateXML;
var
S: String;
begin
if ResponseStream <> nil then
Begin
try
while FSock.IOHandler.CheckForDataOnSource(30) do
begin
S := FSock.IOHandler.InputBufferAsString;
end;
finally
ResponseStr_v:= S;
end;
End;
end;
【问题讨论】:
-
请将您的两个问题分成两个不同的问题。
-
您为什么不使用专为此而设计的
TIdHTTP?否则,您似乎是在尝试重新发明轮子。 -
我应该换一种说法——为什么这篇文章的原作者选择不使用为此设计的
TIdHTTP?我知道这不是您的选择,但如果您进行此切换,也许您会发现这会容易得多。 -
您在编辑中添加的代码的目的是什么?你想问另一个问题吗?
-
@LIVESTUFF:如果你要开始抨击别人,请去其他地方。我将您的评论标记为“粗鲁或冒犯”。
标签: delphi sockets indy delphi-xe5