【问题标题】:Calling REST Web API using Delphi使用 Delphi 调用 REST Web API
【发布时间】:2021-04-24 19:10:10
【问题描述】:

我有一个 ASP.NET MVC Web API,我需要使用 Delphi 6 调用它。我正在尝试使用 Indy 组件(版本 9.0.18),我正在使用 TIdHttp 组件。

我正在使用 REST 方法,例如 POST 来添加、PUT 来更新和 DELETE 来删除记录。我成功地添加、更新和获取我的记录,但我无法成功调用 DELETE 方法。它会引发错误“HTTP/1.1 400 Bad Request”。

我尝试调试 Web API,但显示请求没有到来,因为它没有在断点处停止。

我使用的Indy版本没有DELETE方法,所以我尝试使用DoRequest方法。

我的代码:

IdHTTP.DoRequest(hmDelete, 'http://localhost/myapp/api/user/1', nil, nil);

如果我使用 Fiddler 发出请求,它可以工作,所以我的 Web API 运行良好。

【问题讨论】:

  • 听起来你需要做一些调试。我会使用像 Wireshark 这样的工具来检查请求。您对 Stack Overflow 有什么疑问?
  • 如果我找到检查请求的方法将帮助我理解问题。我将尝试使用 Wireshark。但我的问题是如何使用 Indy 组件发出 DELETE 请求。有人已经这样做了吗?
  • 问题是我需要在Delphi和Indy上使用旧版本,无法更新。我知道较新的版本对发出 REST 请求有更好的支持。
  • 新的 Indy 版本可以与 Delphi 6(和 5)一起使用
  • 您可以使用 Wireshark 或 Fiddler 将有效的删除请求与无效的删除请求进行比较以找出差异

标签: rest delphi asp.net-web-api


【解决方案1】:

作为 Indy 的替代方案,我建议您使用“项目”菜单中的“导入类型库...”,然后选择“Microsoft XML”,这是可用的最高版本(我在我的机器上有版本 3 到 6目前开启)。禁用“生成组件包装器”,然后使用XMLHTTP 组件进行 REST 调用。例如:

uses ActiveX, MSXML2_TLB;

var
  r:XMLHTTP;
begin
  CoInitialize(nil);
  r:=CoXMLHTTP.Create;
  r.open('DELETE','http://localhost/myapp/api/user/1',false,'','');
  //r.setRequestHeader(...
  r.send(EmptyParam);
  if r.status=200 then

【讨论】:

  • 有效!因为我还有一个问题。使用哪个更好的 MSXML 版本?因为我有客户使用 Windows XP 到 Windows 10。哪个版本的兼容性最好?
  • 理论上 XMLHTTP 接口声明从版本 3 开始就已经存在,实时系统将您的调用传递给恰好存在的任何 msxml2.dll,因此对于自 Windows 2000 和 IE 以来的任何版本5.5 它应该按预期工作。
  • 这个理论似乎奏效了。我从 MSXML 4.0 导入了该库,并在没有安装 4.0 版的虚拟机中进行了测试,它可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多