2015-01-08 17 views
7

Indys TIdHttp Klasse hat - in einer aktuellen Version - eine Delete() Routine. Aber aus irgendeinem Grund ist dies eine Prozedur, keine Funktion. Put(), Get() usw. sind alle Funktionen, die den Inhalt des Antworttextkörpers zurückgeben. Entweder als String oder an eine TStream geliefert. Dies ist nicht möglich mit Delete(), die DELETE ‚s Definition widersprüchlich ist:Wie erhält man den Antworttext eines DELETE mit TIdHttp?

Eine erfolgreiche Antwort sollte 200 (OK), wenn die Antwort enthält eine Einheit beschreibt den Status, 202 (angenommen), wenn die Aktion hat nicht wurde jedoch in Kraft gesetzt oder 204 (Kein Inhalt), wenn die Aktion ausgeführt wurde, aber die Antwort keine Entität enthält.

Source.

Ich versuchte dann mit GetResponse(), aber das stattdessen meine Verbindung einfach geschlossen, ohne die Antwort zu füllen.

Also wie lese ich den Inhalt des Antworttext von einer DELETE-Antwort?

+0

Wie wäre es 'TIdHttp.ResponseText' Eigenschaft? Was erwarten Sie auf jeden Fall im Antworttext? (außer Tests für den "ResponseCode") – kobik

+0

'TIdHttp.ResponseText' war anscheinend nicht das, was ich dachte. Es ist eng mit 'ResponseCode' verwandt, also enthält 'TIdHttp.ResponseText' bei einer 200 Antwort 'HTTP/1.1 200 OK', nicht den eigentlichen Antworttext. Im Moment kann meine Arbeit ohne die Daten funktionieren, aber es wurde nur die ID des gelöschten Elements zurückgegeben, damit ich überprüfen konnte, ob das richtige Element gelöscht wurde. – Svip

+0

Ich habe nie 'DELETE' Methode verwendet, aber ich denke, Sie könnten diese ID in den Antwortheadern zurückgeben. Außerdem nehme ich an, dass Sie den Server kontrollieren, und ich bin nicht so sicher, warum Sie die DELETE-Methode überhaupt verwenden müssen. warum nicht 'GET' oder' POST' verwenden und in der Anfrage angeben, welche Ressource gelöscht werden soll? – kobik

Antwort

6

Sie müssen Ihre Indy-Installation aktualisieren. Überlastungen für immer DELETE Methode Antworten wurden im September 2013 in SVN-Revision 5056 für diese Funktion Anfrage hinzugefügt:

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

Wenn Sie Indy aus irgendeinem Grund aktualisieren wollen nicht, können Sie die TIdHTTP Komponente Unterklasse und fügen ein Verfahren, das eine Antwortstrom an die DoRequest Methode, zB passieren:

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. Vielen Dank. Hoffentlich kann ich Indy upgraden lassen. – Svip

Verwandte Themen