2011-05-22 90 views
6

我需要知道如何从需要认证的服务器加载远程xml文件。 使用代码波纹管:加载远程xml文件

procedure TForm1.Button1CLICK(Sender: object); 
Var xmld : TXMLDocument; 
begin 
    xmld.LoadFromFile('http://mysite'); 
    xmld.active := true; 
end; 

我不知道从哪里把用户凭据。当我执行时,发生错误“访问被拒绝”。 任何人都可以请帮忙。 在此先感谢

+0

LoadFromFile接受本地磁盘上的路径。它不处理HTTP网址。 – 2011-05-22 20:08:40

+0

您可能想要接受一些答案,或者以后人们不会帮助您:) – 2011-05-29 15:20:17

回答

6

嗯,这其实是一个问题两个部分:

  1. 如何从互联网上的服务器 需要 验证下载文件?

  2. 如何将XML文档加载到 XmlDocument对象是否动态?

您可以使用IdHttp组件,该组件已经在Indy包中提供并与Delphi一起安装,以从服务器检索XML文档。为此,您可以调用其Get方法,将XML文档地址作为参数传递。您可以以字符串或流的形式检索结果。

如果服务器正在使用身份验证,那么您应该先检测它使用的是哪种身份验证方法;如果它使用HTTP身份验证,则IdHttp已允许您通过提供Request属性来定义HTTP请求参数。您可以使用此属性设置用户名\密码和其他参数。如果它使用基于cookie的身份验证,则可以将cookie管理器对象连接到IdHttp并将所需的cookie提供给服务器。服务器可能使用Web表单进行身份验证,并将cookie返回给您,或返回会话ID。所以重要的是你知道服务器正在使用什么认证方法。

如果您不知道服务器使用的身份验证方法,您可以询问他们的支持团队,或者您可以安装像Wireshark这样的嗅探器,并尝试使用网络浏览器连接到服务器,并捕获交换的数据在服务器和浏览器之间进行分析,并找出使用哪种方法。

无论如何,一旦您收到了XML数据,就可以使用它的LoadFromStream方法或其XML属性将它加载到TXmlDocument实例中。

+0

对于HTTP流量,我推荐Fiddler(http:// www。 fiddler2.com/fiddler2/)而不是WireShark – mjn 2011-05-23 09:15:48

0

TXMLDocument.LoadFromFile适用于简单情况。在你的情况下,你首先需要download(使用http)带有propper证书的xml文件,然后使用TXMLDocument.LoadFromStream或TXMLDocument.XML将xml加载到解析器中。

+0

以及下载文件并将其上传的最佳方式是什么? – riad 2011-05-22 11:16:18

+0

使用Indy Http客户端进行下载和上传。 – 2011-05-22 11:28:26

+0

最好取决于你的情况,但请参阅http://stackoverflow.com/questions/301546/whats-the-simplest-way-to-call-http-get-url-using-delphi或问一个新问题 – 2011-05-22 11:36:14

0

不知道这会工作,但你可以尝试:

http://user:[email protected]/file

这工作在我的情况与HTTP认证。

+1

user/URL中的密码不在HTTP标准中,不应该使用,这也是一个很大的安全漏洞,因为它将被记录在服务器和/或代理日志文件中 – mjn 2011-05-23 17:52:27

3

我编码这就像几天前。我正在实施自动更新程序。下面是代码的一块:

procedure TUpdateForm.GetPage(URL: string); 
var ms: TMemoryStream; 
    IdHTTP: TIdHTTP; 
begin 
    SRC.Free; 
    SRC:=TStringList.Create; 

    IdHTTP:=TIdHTTP.Create(); 
    IdHTTP.HandleRedirects:=True; 


    IdHTTP.Request.Username:='USERNAME'; 
    IdHTTP.Request.Password:='PASSWORD'; 

    ms:=TMemoryStream.Create; 
    IdHTTP.Get(URL,ms); 
    ms.Position:=0; 


    TEncoding.UTF8.ToString; 
    Src.LoadFromStream(ms,TENCODING.UTF8); 

    Src.Free; 
    ms.Free; 
    IdHTTP.Free; 
end; 

procedure TUpdateForm.GetXML; 
var TempNode: IXMLNode; 
    TempVersion: TVersion; 
    i,j:integer; 
begin 
    GetPage('http://www.w3sayit.wz.cz/updateinfo.xml'); 
    MainForm.XMLDocument.LoadFromXML(SRC.Text); 
    MainForm.XMLDocument.Active:=true; 
... 

第一个程序在网址加载文档到全球的TStringList(SRC)。 第二个解析XML(我把它的其余部分)。编辑:对不起,我刚刚阅读你想要一个身份验证。将尽快更新。完成。

+1

此代码会泄漏TIdHTTP,TStringlist和TMemoryStream实例 – mjn 2011-05-23 17:49:07

+0

+1的内存代码。但注意到内存泄漏。 – 2011-05-26 17:30:41

+0

对不起,我会尝试更新代码。尽管这个概念已经足够了:) – 2011-05-28 09:35:21