使用 IIS 在 Delphi 2009 中创建 REST Web 服务
Posted
技术标签:
【中文标题】使用 IIS 在 Delphi 2009 中创建 REST Web 服务【英文标题】:Creating a REST web service in Delphi 2009 using IIS 【发布时间】:2011-05-18 02:23:59 【问题描述】:是否可以在 IIS 上运行的 Delphi 2009 中创建 REST Web 服务?我已经查看了网络代理和网络快照网络服务器应用程序,但到目前为止还无法弄清楚。如果可能的话,我将如何让它发挥作用?
【问题讨论】:
【参考方案1】:REST Web 服务在 Delphi 中非常简单……实际上太简单了,因为有时它在复杂的 WebSnap 演示中被掩盖和隐藏了。您可以使用 Web 代理、WebSnap、Indy、Synapse 或其他通用 HTTP 服务器组件。我不会在您的第一次 RESTful 郊游中使用 WebSnap。我会坚持使用 WebBroker,或者更简单的 Indy。
File->New->Other WebBroker->Web Server Application
您可以选择 ISAPI DLL 或 Web App Debugger...对于您的第一个,我推荐 WAD 应用程序。 (事实上,任何 Web 应用程序都应该从服务器的 WAD 开始,然后创建一个客户端测试器应用程序以使您以后的调试更容易。)如果您选择 WAD,则给它一个名称 - 例如 MyFirstREST。这将创建一个具有默认 Web 模块的项目,该模块以简单的 html 文档响应任何请求。
右键单击 web 模块,单击 Action Editor 弹出菜单项,然后通过自定义 PathInfo 设置创建您的 RESTful 命令。然后您只需定义事件以响应这些命令。
对于 Indy,只需启动一个新的 Windows 服务应用程序并在服务数据模块上放置一个 TidHTTPServer 组件。然后为简单的 HTTP GET 请求定义一个 OnCommandGET (http://yourserver/customer?id=1) 并为 POST 请求定义一个 OnCommandOther。
有一个 TIdHTTPResponseInfo 和一个 TIdHTTPResponseInfo 发送到事件中...只需查看 QueryParams 以获取 GET 以提取传入的参数并填充响应的 ContentStream(或 ContentText)以及 ContentType。
许多关于 REST 实现的教程可以在网上找到 - 一个来自 IBM:http://www.ibm.com/developerworks/webservices/library/ws-restful/
通常您使用 RESTful 服务器来处理 XML 请求和响应,但对于如何实现服务器没有任何限制。这一切都取决于客户的期望。如果您也在控制客户端,那么您甚至可以通过序列化 TObject 后代来来回传递对象。
【讨论】:
@Darian - “实际上太简单了,因为有时它会被掩盖并隐藏在复杂的 WebSnap 演示中” - 为此 +1 - Embarcadero 仍然没有得到 KISS ......但我认为 REST在 XE 中实现的客户端代理非常适合 Delphi2Delphi 并且非常容易设置 - 使用 KBMemTable csv 流,我能够使用 XE REST 客户端通过网络发送整个数据集,并且只需要几行代码 - 向导生成的代理处理了所有肮脏的工作。 @Mikey 演示是opensource,请随时贡献。 :-) @TOndrej - 但我找不到任何文件there :( @daemon_x 使用 Subversion 客户端从存储库中签出 (instructions)。 感谢您的回答,非常有帮助。我曾尝试创建 WAD,但每当我单击 localhost:8081/ServerInfo.ServerInfo 链接时,Internet Explorer 打开时页面无法显示。还有什么我需要做的吗?以上是关于使用 IIS 在 Delphi 2009 中创建 REST Web 服务的主要内容,如果未能解决你的问题,请参考以下文章
如何在Delphi2009+Vista中创建一个简单的听写板
使用 Delphi 在 Google 日历中创建事件 - 错误 401
如何在 Delphi 中创建 TMS TAdvPage 的派生组件
Delphi - 优雅地关闭服务中创建的进程。 (使用 tprocess / createProcess)
在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常)