Delphi实现REST服务器

4
我在服务器上有一个MySQL数据库,使用我编写的脚本向其中插入数据。为了创建新资源,我需要打开www.mywebsite.com/rest/create.php?param=value&param2=value2,然后打开另一个PHP文件来编辑项目等等。这是基本的方法:一个PHP文件获取一些参数,然后将文件存储在数据库中。
我正在使用TIdHTTP,因为我有可能执行以下操作:
TIdHTTP1.Get(www.mywebsite.com/rest/create.php?param=value&param2=value2);
create.php页面返回一些以json编码的数据。我已经在我的Android应用程序中创建了一个REST客户端,可以解析响应php页面接收到的json。例如,如果我调用.../show.php?id=3,页面的结果是一个包含我的数据的json,稍后android应用程序将解析它们并向用户显示一些结果。
问题

我想做的是,不使用*.php文件名,而是像这样使用第二种URI www.mywebsite.com/rest/create/?param=value&param2=value2来代替调用www.mywebsite.com/rest/create.php?param=value&param2=value2。基本上我不想使用*.php文件名,但我想使用第二种没有文件名的URI。

问题在于这是我第一次尝试这样做,我真的不知道该怎么办。

可能的解决方案。在阅读Expert Delphi之后,我发现了一个可能的解决方案。我可以为Linux创建一个WebBroker服务器(以便我可以导出Apache模块*.so),实现一些操作,如下所示:

enter image description here

当有一个请求到达/rest/create/时(使用OnAction事件),我可以运行TIdHTTP1.Get(www.mywebsite.com/rest/create.php?param=value&param2=value2);并储存结果。通过这种方式,我可以按照需要打开www.mywebsite.com/rest/create/并保存数据。即使在linux机器(作为Apache模块)上,indy是否能够执行get请求?我已经看到独立服务器在indy下运行,因此我想indy应该能够在Apache模块上工作。

不幸的是,我对这些事情还比较新,实际上我也不知道该找什么样的解决方案。我的解决方案可能有效,但我相信有一种更好的方法来做到这一点。

注意:这只是我通过一些研究所得到的想法,我不确定这是我需要做的正确方法。除了上面所写的,我只需在PHP或Apache中做一些事情吗?创建REST服务还有其他标准(最佳)方法吗?

我猜最常见的方法是重写URI。如果你使用Apache,那么可以找mod_rewrite模块。 - bepe4711
1
Indy 包含一个 HTTP 服务器组件(TIdHTTPServer),您可以在独立的可执行文件中使用它(无需 Apache 模块),这使得测试变得容易。然后,对于诸如 HTTPS 和 URL 重写之类的其他功能,您可以使用 Apache HTTP 服务器作为反向代理。(我是使用 Indy 和 Free Pascal 而不是 Delphi 实现的) - mjn42
@mjn42 感谢您的帮助 :) 所以基本上我可以创建服务器和一切,但最后必须使用Apache来设置正确的URL。 Apache是管理URI的那个对吧? - Emma Rossignoli
TIdHTTPServer 能够根据 HTTP 头中包含的路径,在不同的 URI 路径上提供不同的内容。例如,如果您有多个本地 HTTP 服务运行(在 localhost:8080、localhost:8081 等),需要映射到 443 上的不同 URI 路径,则 Apache 对于端口和路径映射非常有帮助。 - mjn42
你听说过Delphi的Datasnap吗?你可以用它来创建Rest服务。 - Henrikki
1个回答

2
您的问题不在Delphi端,而在服务器端。
如果您想要一个URL /rest/create/,您只需在服务器上创建一个名为“create”的文件夹,并在其中放置一个index.php文件。
或者您可以在.htaccess文件中使用URL重写规则。

这就是REST服务的实现方式吗?只需要一个带有index.php文件的文件夹层次结构吗?无论如何,谢谢! :) - Emma Rossignoli
HTTP路径与文件系统位置无关,它们是独立的。也许PHP在这方面有限制,但一般情况下并非如此。 - mjn42
1
PHP没有限制,它取决于你的架构复杂性。有时我们只有一个位于根目录下的index.php文件,并使用URL重写来分发路径。有时候你只需要简单的目录结构。这是你开始编程或小型API项目的最简单方式。 - Patrick PREMARTIN
@PatrickPrémartin 谢谢,我想我正在寻找URL重写。只是为了知道,您如何构造它?您是否将所有PHP文件放在一个文件夹中,然后使用URL重写来访问它们? - Emma Rossignoli
这取决于项目的复杂性,如果有使用框架的话也会影响。我无法为此给出一个规则。 - Patrick PREMARTIN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接