2011-02-10 20 views
9

Estoy usando idhttp (Indy) para hacer una verificación de sitios web. Todo lo que quiero es verificar el código de respuesta del servidor después de enviar mi solicitud, no quiero tener que recibir el resultado HTML del servidor, ya que solo estoy monitoreando un código 200 OK, cualquier otro código que significa que hay un problema de alguna forma.IdHttp Simplemente obtenga el código de respuesta

He buscado documentos de ayuda de idhttp y la única forma de hacerlo posible sería asignar el código a MemoryStream y luego borrarlo directamente, sin embargo, eso no es muy eficiente y usa memoria eso no es necesario ¿Hay alguna manera de simplemente llamar a un sitio y obtener la respuesta, pero ignorar el HTML enviado de vuelta que es más eficiente y no desperdicia memoria?

Actualmente el código sería algo como esto. Sin embargo, este es solo un código de muestra que aún no he probado, solo lo uso para explicar lo que trato de hacer.

Procedure Button1Click(Sender: TObject); 

var 
http : TIdHttp; 
s : TStream; 
url : string; 
code : integer; 

begin 

    s := TStream.Create(); 
    http := Tidhttp.create(); 
    url := 'http://www.WEBSITE.com'; 

    try 

    http.get(url,s); 
    code := http.ResponseCode; 
    ShowMessage(IntToStr(code)); 

    finally 

    s.Free(); 
    http.Free(); 

end; 

Respuesta

12

TIdHTTP.Head() es la mejor opción. Sin embargo, como alternativa, en la última versión puede llamar al TIdHTTP.Get() con un destino nulo TStream, o un TIdEventStream sin controladores de eventos asignados, y aún leerá los datos del servidor pero no los almacenará en ningún lado.

De cualquier forma, también tenga en cuenta que si el servidor devuelve un ResponseCode fallido, TIdHTTP generará una excepción (a menos que use el parámetro AIgnoreReplies para especificar los valores específicos de ResponseCode que le interesen), así que debe tener en cuenta así, por ejemplo:

procedure Button1Click(Sender: TObject); 
var 
    http : TIdHttp; 
    url : string; 
    code : integer; 
begin 
    url := 'http://www.WEBSITE.com'; 
    http := TIdHTTP.Create(nil); 
    try 
    try 
     http.Head(url); 
     code := http.ResponseCode; 
    except 
     on E: EIdHTTPProtocolException do 
     code := http.ResponseCode; // or: code := E.ErrorCode; 
    end; 
    ShowMessage(IntToStr(code)); 
    finally 
    http.Free(); 
    end; 
end; 

procedure Button2Click(Sender: TObject); 
var 
    http : TIdHttp; 
    url : string; 
    code : integer; 
begin 
    url := 'http://www.WEBSITE.com'; 
    http := TIdHTTP.Create(nil); 
    try 
    try 
     http.Get(url, nil); 
     code := http.ResponseCode; 
    except 
     on E: EIdHTTPProtocolException do 
     code := http.ResponseCode; // or: code := E.ErrorCode; 
    end; 
    ShowMessage(IntToStr(code)); 
    finally 
    http.Free(); 
    end; 
end; 
+0

acabo estado jugando con el código más. Todo esto se ejecuta dentro de un hilo, sin embargo, si hay algo más que una respuesta de 200 códigos, p. Ej. 404, 302 etc. o un error de socket hace que el hilo salga. – jskrwyk

+0

Cualquier código de respuesta que no indique un retreive exitoso generará una excepción. Si su hilo no está manejando excepciones, o al menos no está manejando el tipo de excepción particular que realmente se genera, entonces sí, el hilo se cerrará (y se establecerá la propiedad 'TThread.FatalException'). En mi ejemplo, solo está manejando las excepciones 'EIdHTTPProtocolException'. Expanda su código de secuencia para manejar otros tipos de excepciones si es necesario. –

+0

@RemyLebeau ¿Qué pasa si recibimos una respuesta 'Continuar' '100'? Tendremos que intentarlo de nuevo, ¿verdad? – PSyLoCKe

8

intento con http.head() en lugar de http.get().

+0

voy a darle una oportunidad gracias – jskrwyk

Cuestiones relacionadas