2011-05-22 21 views
6

Necesito saber cómo cargar el archivo xml remoto desde un servidor que necesita autenticación. Utilizando el código de abajo:Cargar archivo xml remoto

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

I no sabe dónde poner las credenciales de usuario. Cuando ejecuto, aparece el error "acceso denegado". ¿Alguien puede ayudar por favor? Gracias de antemano

+0

LoadFromFile acepta una ruta en su disco local. No maneja las URL HTTP. –

+0

Es posible que desee aceptar algunas respuestas, o las personas no lo ayudarán en el futuro :) –

Respuesta

6

Bueno, esto es realmente una pregunta de dos partes:

  1. Cómo descargar un documento desde un servidor de Internet que requiere autenticación ?

  2. Cómo cargar un documento XML en Objeto XmlDocument de forma dinámica?

Puede utilizar el componente IdHttp, que ya está disponible en el paquete de Indy y se instala con su Delphi, para recuperar el documento XML desde el servidor. Para hacer esto, puede llamar a su método Get, pasando la dirección del documento XML como parámetro. Puede recuperar el resultado como una cadena o una secuencia.

Si el servidor usa autenticación, primero debe detectar qué tipo de métodos de autenticación está utilizando; si usa autenticación HTTP, IdHttp ya le permite definir parámetros de solicitud HTTP al proporcionar una propiedad Solicitud. Puede establecer Nombre de usuario \ Contraseña y otros parámetros usando esta propiedad. Si utiliza una autenticación basada en cookies, puede conectar un objeto de administrador de cookies a IdHttp y proporcionar la cookie requerida al servidor. El servidor puede usar un formulario web para autenticación y devolverle la cookie, o devolver una identificación de sesión. Por lo tanto, es importante que sepa qué método de autenticación está usando el servidor.

Si no tiene idea sobre el método de autenticación utilizado por el servidor, puede preguntar a su equipo de soporte, o puede instalar un sniffer como Wireshark e intentar conectarse al servidor utilizando su navegador web y capturar los datos intercambiados entre el servidor y su navegador, y analizarlo para averiguar qué método se utiliza.

De todos modos, una vez que ha recibido los datos XML, puede cargarlos en una instancia de TXmlDocument utilizando su método LoadFromStream o su propiedad XML.

+0

Para tráfico HTTP, recomiendo Fiddler (http: // www. fiddler2.com/fiddler2/) en lugar de WireShark – mjn

0

TXMLDocument.LoadFromFile es para situaciones simples. En su caso, necesita download (usando http) el archivo xml con las credenciales apropiadas primero y luego use TXMLDocument.LoadFromStream o TXMLDocument.XML para cargar el xml en el analizador.

+0

y cuál es la mejor manera de descargar el archivo y subirlo? – riad

+0

Utilice el cliente Indy Http para descargar y cargar. –

+0

Mejor depende de su situación, pero vea http://stackoverflow.com/questions/301546/whats-the-simplest-way-to-call-http-get-url-using-delphi o haga una nueva pregunta –

0

No sé si esto va a funcionar, pero se puede probar:

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

Esto funciona en mi caso con la autenticación HTTP.

+1

user/la contraseña en las URL no está en el estándar HTTP y no debe usarse, también es un gran agujero de seguridad ya que se registrará en el servidor y/o en el archivo de registro proxy. – mjn

3

He codificado esto como hace unos días. Estaba implementando un auto-updater. Aquí es un trozo de código:

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; 
... 

El primer procedimiento se carga un documento en el URL a un TStringList mundial (SRC). El segundo analiza el XML (corté el resto).

EDIT: lo siento, acabo de leer que desea una auth. Se actualizará pronto.Hecho.

+1

Este código pierde memoria para las instancias TIdHTTP, TStringlist y TMemoryStream – mjn

+0

+1 para el código. Pero fíjate en las pérdidas de memoria que se observan. –

+0

Disculpa, intentaré actualizar el código. Sin embargo, es suficiente para el concepto :) –

Cuestiones relacionadas