Come controllare l’URL con IdHTTP?

Come posso verificare l’URL di destinazione per un codice di risposta specifico come 200 OK senza che Indy faccia fuori tutti i tipi di eccezioni. ConnectionTimeout, ConnectionClosedGracefully, ecc …

Ad esempio se l’URL non è corretto o il suo host non può essere trovato o non può essere raggiunto. Indy continuerà ad aumentare le eccezioni anche se ho cercato di ignorarle.

Quindi la mia domanda è come ignorare correttamente queste eccezioni.

1. Come ignorare tutte le eccezioni generate dal TIdHTTP?

Per gestire tutte le eccezioni e, come dici tu, ignorarle , puoi usare il codice che è quasi identico al codice dalla risposta di @ Stijn:

 procedure TForm1.Button1Click(Sender: TObject); var IdHTTP: TIdHTTP; begin IdHTTP := TIdHTTP.Create; try try IdHTTP.Get('http://www.example.com'); except // do just nothing here, if you really want to completely ignore all // exceptions thrown from inside the try..except block execution and // if you don't want to indicate somehow, that the exception occured end; finally IdHTTP.Free; end; end; 

2. Come gestire le eccezioni specifiche generate dal TIdHTTP?

Forse un giorno vorrete reactjs in qualche modo su certi tipi di eccezioni lanciate dalla class TIdHTTP , ad esempio reactjs solo su eccezioni del protocollo HTTP. Ed è quello che cercherò di elaborare qui.

Indy definisce molte classi di eccezioni per diverse occasioni, che possono verificarsi quando una determinata azione fallisce. Ecco un elenco di classi di eccezioni a cui potresti essere interessato quando lavori con il protocollo HTTP:

  1. EIdException : è la class di eccezione di base utilizzata dalla libreria Indy. Potrebbe essere utile per te quando vuoi distinguere tra le eccezioni generate da Indy e tutte le altre eccezioni generate dalla tua applicazione.

  2. EIdSocketError – da un punto di vista dell’astrazione del protocollo HTTP è una class di eccezione di basso livello, che copre tutte le eccezioni sollevate quando una determinata operazione di socket fallisce. Questo può essere utile per te per rilevare che c’è qualcosa di sbagliato a livello di rete.

  3. EIdConnClosedGracefully – le eccezioni sollevate da questa class indicano che il lato server ha chiuso la connessione con il client in un modo comune. Questo può essere utile quando devi reactjs a questa situazione, ad esempio riconnettendoti al server.

  4. EIdHTTPProtocolException : questa class di eccezioni viene utilizzata per le eccezioni generate quando si verifica un errore durante l’elaborazione di una risposta HTTP per una determinata richiesta. Ciò accade generalmente quando viene ricevuto un codice di risposta HTTP numerico imprevisto dalla risposta HTTP. Può essere utile, quando si desidera gestire in modo specifico gli errori del protocollo HTTP. Con questa gestione delle eccezioni, è ansible reactjs ad esempio su determinati codici di stato HTTP restituiti da una risposta del server.

Ecco lo scheletro del codice che mostra la gestione delle eccezioni elencate sopra. Certo, non devi mostrare messaggi, ma fare qualcosa di più utile. E non è necessario gestirli tutti; è su di te quali eccezioni e come gestirai:

 uses IdHTTP, IdException, IdStack; procedure TForm1.Button1Click(Sender: TObject); var IdHTTP: TIdHTTP; begin IdHTTP := TIdHTTP.Create; try try IdHTTP.Get('http://www.example.com'); except // this exception class covers the HTTP protocol errors; you may read the // response code using ErrorCode property of the exception object, or the // same you can read from the ResponseCode property of the TIdHTTP object on E: EIdHTTPProtocolException do ShowMessage('Indy raised a protocol error!' + sLineBreak + 'HTTP status code: ' + IntToStr(E.ErrorCode) + sLineBreak + 'Error message' + E.Message); // this exception class covers the cases when the server side closes the // connection with a client in a "peaceful" way on E: EIdConnClosedGracefully do ShowMessage('Indy reports, that connection was closed gracefully!'); // this exception class covers all the low level socket exceptions on E: EIdSocketError do ShowMessage('Indy raised a socket error!' + sLineBreak + 'Error code: ' + IntToStr(E.LastError) + sLineBreak + 'Error message' + E.Message); // this exception class covers all exceptions thrown by Indy library on E: EIdException do ShowMessage('Indy raised an exception!' + sLineBreak + 'Exception class: ' + E.ClassName + sLineBreak + 'Error message: ' + E.Message); // this exception class is a base Delphi exception class and covers here // all exceptions different from those listed above on E: Exception do ShowMessage('A non-Indy related exception has been raised!'); end; finally IdHTTP.Free; end; end; 

Una semplice prova / eccetto dovrebbe fare il trucco:

 try IdHttp1.Get(...); Result:=IdHttp1.ResponseCode=200; except on EIdException do Result:=false; end;