【问题标题】:How to get the response text of a DELETE with TIdHttp?如何使用 TIdHttp 获取 DELETE 的响应文本?
【发布时间】:2015-03-06 12:59:10
【问题描述】:

Indy 的 TIdHttp 类具有 - 在最近的版本中 - 一个 Delete() 例程。但由于某种原因,这是一个过程,而不是一个函数。 Put()Get()等都是返回响应体内容的函数。作为字符串或将其传递给TStream。这对于Delete() 是不可能的,这与DELETE 的定义相矛盾:

如果响应包含描述状态的实体,则成功响应应该为 200(OK),如果尚未执行该操作,则为 202(已接受),如果该操作已执行但响应为 204(无内容)不包括实体。

Source.

然后我尝试使用GetResponse(),但它只是优雅地关闭了我的连接,而不填写响应。

那么如何从 DELETE 响应中读取响应正文的内容?

【问题讨论】:

  • TIdHttp.ResponseText 属性怎么样?无论如何,您希望在响应文本中找到什么? (除了测试ResponseCode
  • TIdHttp.ResponseText 显然不是我想的那样。它与ResponseCode 密切相关,因此在 200 响应中,TIdHttp.ResponseText 包含“HTTP/1.1 200 OK”,而不是实际的响应正文。目前,我的解决方法可以在没有数据的情况下工作,但它只是返回它删除的项目的 ID,所以我可以验证它删除了正确的项目。
  • 我从未使用过DELETE 方法,但我想您可以在响应标头中返回该ID。另外,我假设您控制服务器,但我不太确定您为什么首先需要使用 DELETE 方法。为什么不使用GETPOST 并在请求参数中指明要删除哪个资源?
  • 因为这是一个 RESTful API,因此使用 DELETE 方法更有意义。 HTTP 方法存在并且是已知标准,为什么不使用它们?

标签: delphi indy


【解决方案1】:

您需要更新您的 Indy 安装。 2013 年 9 月在 SVN 修订版 5056 中为此功能请求添加了用于获取 DELETE 方法响应的重载:

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;

【讨论】:

  • 啊。谢谢。希望我可以升级 Indy。
猜你喜欢
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多