2015-01-08 4 views
7

インディーズのTIdHttpクラスは - 最近のバージョンで - Delete()ルーチンを持っています。しかし何らかの理由で、これは手続きであり、関数ではありません。 Put()Get()などは、すべて応答本体の内容を返す関数です。文字列として、またはTStreamに配信されています。これはDELETEの定義に矛盾するDelete()、では不可能である。TIdHttpでDELETEの応答テキストを取得するには?

成功応答があるべきである200(OK)応答アクションがなかった場合、ステータス、202(承認)を記述するエンティティを含む場合アクションが制定されているが、応答にエンティティが含まれていない場合は、204(No Content)となります。

Source

私はその後GetResponse()を使用してみましたが、それは代わりに、単に応答に入力せずに、優雅に私の接続を閉じました。

したがって、DELETE応答から応答本文の内容を読み取るにはどうすればよいですか?

+0

?いずれにしても、回答テキストには何が期待されますか? ( '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のインストールを更新する必要があります。 DELETE方法応答を取得するためのオーバーロードは、この機能要求のためのSVNのリビジョン5056で2013年9月に追加されました:

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

あなたには、いくつかの理由でインディを更新したくない場合は、あなたがTIdHTTPコンポーネントをサブクラス化して追加することができますDoRequest方法、例えばに応答ストリームを渡します方法:どのように `TIdHttp.ResponseText`プロパティに関する

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

関連する問題