2015-01-08 11 views
7

Indy's TIdHttp klasa ma - w najnowszej wersji - rutynę Delete(). Ale z jakiegoś powodu jest to procedura, a nie funkcja. Put(), Get() itp. To wszystkie funkcje, które zwracają treść treści odpowiedzi. Albo jako ciąg znaków, albo dostarczony do TStream. Nie jest to możliwe z Delete(), co jest sprzeczne z definicją DELETE „s:Jak uzyskać tekst odpowiedzi DELETE z TIdHttp?

Skuteczna odpowiedź powinna być 200 (OK) jeżeli odpowiedź zawiera encję opisującą stan, 202 (zaakceptowane) jeśli akcja nie ma został uchwalony, lub 204 (brak treści), jeśli działanie zostało wprowadzone, ale odpowiedź nie zawiera podmiotu.

Source.

Próbowałem następnie użyć GetResponse(), ale zamiast tego po prostu zamknęło mi połączenie z wdziękiem, bez wypełniania odpowiedzi.

Jak mogę odczytać zawartość treści odpowiedzi z odpowiedzi DELETE?

+0

Jak o 'własności TIdHttp.ResponseText'? w każdym razie czego spodziewasz się znaleźć w tekście odpowiedzi? (inne niż testowanie 'ResponseCode') – kobik

+0

' TIdHttp.ResponseText' najwyraźniej nie było tym, co myślałem. Jest ściśle związany z 'ResponseCode', więc przy odpowiedzi 200,' TIdHttp.ResponseText' zawiera 'HTTP/1.1 200 OK', a nie rzeczywistą treść odpowiedzi. Na razie moja praca może działać bez danych, ale właśnie zwróciła identyfikator usuniętego elementu, więc mogłem zweryfikować, czy usunięto właściwy element. – Svip

+0

Nigdy nie użyłem metody "DELETE", ale myślę, że możesz zwrócić ten identyfikator w nagłówkach odpowiedzi. Ponadto zakładam, że kontrolujesz serwer i nie jestem pewien, dlaczego musisz najpierw użyć metody "DELETE". dlaczego nie użyć 'GET' lub' POST' i wskazać w parametrach żądania, który zasób usunąć? – kobik

Odpowiedz

6

Musisz zaktualizować instalację Indy. Przeciążenia na uzyskanie odpowiedzi DELETE metody zostały dodane we wrześniu 2013 roku w SVN rewizji 5056 dla tego żądania cecha:

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

Jeśli nie chcesz zaktualizować Indy z jakiegoś powodu, można podklasy komponent TIdHTTP i dodać metoda, która przejdzie strumień odpowiedzi na DoRequest metody, np:

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. Dzięki. Mam nadzieję, że uda mi się ulepszyć Indy. – Svip

Powiązane problemy