2015-01-08 1 views
7

Indy's TIdHttp класс имеет - в последней версии - a Delete() рутину. Но по какой-то причине это процедура, а не функция. Put(), Get() и т. Д. - все функции, возвращающие содержимое тела ответа. Либо в виде строки, либо доставить ее до TStream. Это невозможно с Delete(), что противоречит DELETE «ы определения:Как получить текст ответа DELETE с помощью TIdHttp?

В случае успешного ответа ДОЛЖЕН быть 200 (ОК), если ответ включает объект, описывающий состояние, 202 (Accepted), если действие не имеет все же было принято или 204 (без содержимого), если действие было принято, но ответ не включает сущность.

Source.

Я тогда попытался использовать GetResponse(), но вместо этого просто закрыл мое соединение изящно, не заполняя ответ.

Как я могу прочитать содержимое тела ответа из ответа DELETE?

+0

Как насчет 'собственности TIdHttp.ResponseText'? в любом случае, что вы ожидаете найти в тексте ответа? (кроме тестирования для 'ResponseCode') – kobik

+0

' TIdHttp.ResponseText', по-видимому, не так, как я думал. Он тесно связан с «ResponseCode», поэтому в ответе 200 «TIdHttp.ResponseText» содержит «HTTP/1.1 200 OK», а не тело ответа. На данный момент моя работа может работать без данных, но она просто возвращала идентификатор удаляемого элемента, поэтому я мог проверить, что он удалил нужный элемент. – Svip

+0

Я никогда не использовал метод DELETE, но я думаю, вы могли бы вернуть этот идентификатор в заголовках ответов. Кроме того, я предполагаю, что вы управляете сервером, и я не уверен, почему вам нужно использовать метод DELETE в первую очередь. почему бы не использовать 'GET' или' POST' и указать в параметрах запроса, какой ресурс удалить? – kobik

ответ

6

Вам необходимо обновить установку Indy. Перегрузки для получения ответов DELETE метода были добавлены в сентябре 2013 года в редакции 5056 SVN для этого запроса особенности:

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

Если вы не хотите, чтобы обновить Indy по какой-то причине, вы можете подкласс TIdHTTP компонента и добавить метод, который будет проходить поток ответа на DoRequest метода, например:

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

Ах. Благодарю. Надеюсь, я смогу улучшить Инди. – Svip

 Смежные вопросы

  • Нет связанных вопросов^_^