2015-01-08 41 views
7

Indy的TIdHttp類在最近的版本中有一個Delete()例程。但由於某種原因,這是一個程序,而不是一個功能。 Put()Get()等都是返回響應主體內容的函數。無論是作爲一個字符串還是將其交付給TStream。這是不可能的Delete(),這是矛盾的DELETE的定義:如何使用TIdHttp獲取DELETE的響應文本?

成功的響應應該是200(OK),如果所述響應包括描述狀態,202(已接受),如果動作具有不是實體尚未制定,或204(無內容),如果行動已頒佈但答覆不包括實體。

Source

然後,我嘗試使用GetResponse(),但是這只是優雅地關閉了我的連接,沒有填寫響應。

那麼如何從DELETE響應中讀取響應主體的內容呢?

+0

'TIdHttp.ResponseText'屬性怎麼樣?無論如何,你希望在回覆文本中找到什麼? (除了測試'ResponseCode') – kobik

+0

'TIdHttp.ResponseText'顯然不是我想的。它與'ResponseCode'密切相關,所以在200響應中,'TIdHttp.ResponseText'包含'HTTP/1.1 200 OK',而不是實際的響應主體。現在,我的工作可以在沒有數據的情況下工作,但它只是返回它刪除的項目的ID,所以我可以驗證它刪除了正確的項目。 – Svip

+0

我從來沒有使用過'DELETE'方法,但我想你可以在響應頭文件中返回該ID。另外,我假設你控制服務器,並且我不確定爲什麼你需要首先使用'DELETE'方法。爲什麼不使用'GET'或'POST'並在請求參數中指出哪些資源要刪除? – kobik

回答

6

您需要更新您的Indy安裝。在2013年9月加入了越來越DELETE方法應對重載在SVN版本5056,此功能要求:

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

如果你不想更新印出於某種原因,你也可以繼承的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

啊。謝謝。希望我能得到Indy的升級。 – Svip

相關問題