2015-01-08 15 views
7

La classe TIdHttp di Indy ha - in una versione recente - una routine Delete(). Ma per qualche ragione, questa è una procedura, non una funzione. Put(), Get(), ecc. Sono tutte funzioni che restituiscono il contenuto del corpo della risposta. O come stringa o consegnata a un TStream. Non è possibile con Delete(), che è in contraddizione con definizione DELETE s':Come ottenere il testo di risposta di DELETE con TIdHttp?

Una risposta positiva DEVE pari a 200 (OK) se la risposta include un'entità che descrive lo stato, 202 (accettata) se l'azione non ha ancora stato emanato, o 204 (Nessun contenuto) se l'azione è stata emanata ma la risposta non include un'entità.

Source.

Ho quindi provato a utilizzare GetResponse(), ma che invece ha semplicemente chiuso la mia connessione con garbo, senza riempire la risposta.

Quindi, come faccio a leggere il contenuto del corpo della risposta da una risposta DELETE?

+0

Come su 'immobile TIdHttp.ResponseText'? in ogni caso cosa ti aspetti di trovare nel testo della risposta? (diverso dal test per il 'ResponseCode') – kobik

+0

' TIdHttp.ResponseText' non era apparentemente quello che pensavo. È strettamente correlato a 'ResponseCode', quindi su una risposta di 200,' TIdHttp.ResponseText' contiene 'HTTP/1.1 200 OK', non il corpo della risposta effettiva. Per ora, il mio lavoro in giro può funzionare senza i dati, ma è stato solo restituendo l'ID dell'elemento eliminato, così ho potuto verificare che cancellasse l'elemento giusto. – Svip

+0

Non ho mai usato il metodo 'DELETE', ma suppongo che tu possa restituire quell'ID nelle intestazioni di risposta. Inoltre, presumo che tu controlli il server, e non sono così sicuro del motivo per cui devi utilizzare il metodo 'DELETE' in primo luogo. perché non usare 'GET' o' POST' e indicare nei parametri della richiesta quale risorsa eliminare? – kobik

risposta

6

È necessario aggiornare l'installazione di Indy. Sovraccarichi per ottenere DELETE metodo risposte sono state aggiunte nel mese di settembre 2013, revisione SVN 5056 per questa richiesta di funzionalità:

Add overloads for TIdHTTP Delete() and Options() methods that can output a response's message body

Se non si desidera aggiornare Indy per qualche motivo, è possibile creare una sottoclasse del componente e aggiungere TIdHTTP un metodo che passare un flusso di risposta alla DoRequest metodo, ad esempio:

type 
    TIdHTTP = class(IdHTTP.TIdHTTP) 
    public 
    procedure DeleteEx(AURL: string; AResponseContent: TStream); 
    end; 

implementation 

{ TIdHTTP } 

procedure TIdHTTP.DeleteEx(AURL: string; AResponseContent: TStream); 
begin 
    DoRequest(Id_HTTPMethodDelete, AURL, nil, AResponseContent, []); 
end; 
+0

Ah. Grazie. Spero di riuscire ad ottenere l'upgrade di Indy. – Svip

Problemi correlati