我是在德尔福XE6工作,需要下载xml数据,由服务器上的php脚本生成。我确实试过用Indy IdHTTP.Get,但它不能下载任何东西...当我尝试在浏览器或TWebBrowser中打开相同的链接时,它会显示生成的IdHTTP数据,但当我尝试使用xml直接拉取它时,没有任何东西被下载,就像没有生成的数据一样……
Memo1.Lines.Add := idHTTP.Get(url);
提供空的memo1。
有没有什么技巧或例子可以让你在生成数据的服务器上先执行php脚本,然后把结果拉下来?
发布于 2014-08-05 01:50:23
您可以这样做:
procedure TForm1.Button1Click(Sender: TObject);
var
dow: TIdHTTP;
xmlDoc: TXMLDocument;
xmlStrem: TMemoryStream;
begin
dow := nil;
xmlDoc := nil;
xmlStrem := nil;
try
try
dow := TIdHTTP.Create(Self);
dow.HandleRedirects := True;
xmlStrem := TMemoryStream.Create();
dow.Get('http://url.com/path/', xmlStrem);
xmlDoc := TXMLDocument.Create(Self);
xmlDoc.LoadFromStream(xmlStrem);
ShowMessage(xmlDoc.XML.Text);
except
on E: Exception do
begin
raise;
end;
end;
finally
if Assigned(dow) then FreeAndNil(dow);
if Assigned(xmlDoc) then FreeAndNil(xmlDoc);
if Assigned(xmlStrem) then FreeAndNil(xmlStrem);
end;
end;
发布于 2014-08-05 04:08:47
您调用的是返回UnicodeString
的TIdHTTP.Get()
版本,因此TIdHTTP
将接收原始数据,并使用指定的字符集将其解码为UTF16。如果在确定字符集和/或解码数据时出现问题,则可能会返回一个空白字符串,而不会引发异常。
XML是一种二进制格式,取决于其字符集。因此,您确实应该下载二进制形式的XML,例如使用TMemoryStream
,然后将其按原样传递给XML解析器进行处理。让它处理XML的字符集,而不是让Indy处理它。
发布于 2014-08-08 09:06:50
在尝试和寻找之后,我确实改变了
UserAgent而不是Mozilla/3.0到Mozilla/5.0
现在它起作用了。是的,xmlStream.Position := 0;
求救!
https://stackoverflow.com/questions/25123699
复制相似问题