通过示例理解Rest

3
我正在开发一个客户端-服务器网络服务。前端使用html/javascript/jquery/jqm构建,后端使用php/mysql。
当客户端启动时,它会有一个静态ID(永远不会改变)和一个动态令牌(可能会改变)。因此,每次客户端启动时,我们都会向我们的服务器注册它,并向我们的服务器发送一个POST请求,在请求正文中包含一个带有id和token的JSON文件。POST请求发送到一个名为myserver.com/register.php的php脚本中。php脚本接受id和token并查询数据库以查看它们是否存在。如果id不存在,则创建一个新记录。如果存在,则检查token是否已更改,然后更新。
从客户端,用户可以订阅多个事件(假设是10个)。事件以复选框列表的形式呈现。用户选择他想要订阅的事件并按下订阅按钮。当点击订阅按钮时,将向一个php脚本发送一个POST请求,请求正文中包含一个JSON文件,其中包含用户的ID和所有事件名称以及一个布尔值(订阅或不订阅)。
id: xxxxxx
event1: 1
event2: 0
event3: 0
event4: 1
...

这个php脚本看起来像这样:myServer/subscribe.php。当请求到达时,php文件读取收到的JSON,然后在数据库中搜索id,然后检查发送的事件名称和布尔值。如果是1,他会订阅用户。如果是0,他会取消用户的订阅。如果用户已经订阅,并再次订阅,则不会发生任何事情。取消订阅也是一样。
最后,当用户进入订阅页面时,将向服务器发出一个带有用户id的JSON文件的POST请求。该请求在一个看起来像myServer/whereSubsribed.php的php文件上进行。这个php文件获取id并查看在哪些事件中订阅了这个id。完成后,它通过一个json文件向客户端响应(做出回声),其中包含用户已经订阅的所有事件,以便在加载复选框时,用户已经订阅的事件可以被勾选。
上述服务是否为Restful?我非常难理解什么是Restful,什么不是。
我的理解:
我知道应该使用POST PUT DELETE GET,但我可以只使用POST来完成所有操作,就像你所看到的那样。那么为什么要使用它们?我知道Restful是关于名词而不是动词,是关于资源而不是行为。我不知道这在实践中意味着什么。
请问,在我描述的这种情况下,能否给出一个Restful Web服务的描述?怎么可能没有类似订阅/取消订阅/注册等操作?如果可以,请花点时间向我解释一下如何实现Restful服务?
谢谢你阅读这篇漫长的文章。
**如果你足够友好,给我一个答案,请不要给我一个定义或理论方法。我已经读了几乎所有需要阅读的东西。我也是一个新的html/php脚本编写者,所以如果您能给我一个与我描述的完全相同的服务的示例,我会非常感激。如果能够理解它如何成为Restful将是很好的理解方式。
编辑
我看到,我使用HTTP请求(POST)将某些数据(id、token等)推送到特定的操作/PHP脚本(subscribe、register、whereSubscribed)。
Restful应该是完全相反的吗?通过HTTP(post put delete update)将操作发送到资源(用户事件)。

这是否意味着所有编程都会改变?我不明白如何可能没有我编写的脚本。当您没有php脚本时,如何通过编程方式进行订阅?!


2
这里有一些关于REST最佳实践的绝佳说明:http://www.slideshare.net/landlessness/teach-a-dog-to-rest http://vimeo.com/17785736 - Stanislav Terletskyi
1
请参考以下链接了解REST:https://dev59.com/questions/q03Sa4cB1Zd3GeqPv4i7 - adamdehaven
2个回答

1
根据你的描述,不是REST。在REST中,URL就像指向资源的地址。实际上,URL是名词,HTTP方法是动词。
按照REST思想,你的资源包括令牌和订阅等内容。如果要使用REST,每个订阅都应有清晰明确的URL。
例如,订阅的URL可能为“/path/to/subscriptions/”,其中会被具体订阅ID替换。当客户端想要订阅某些内容时,会将内容PUT到该URL中。
如果客户端想要进行订阅但不知道确切的位置,则会POST到类似“/path/to/subscriptions”的一般位置,HTTP响应将包含一个Location头,指向正确的“/path/to/subscriptions/”位置。
PHP不太适合RESTful编程。PHP脚本存在于特定路径并执行操作(动词)。你需要费点功夫才能拥有美观的URL,以反映资源的名词性质。希望这可以帮到你!

我非常清楚你在前三段中所说的内容。我也完全同意你最后一段所说的,即PHP存在于特定路径并执行操作=>动词!你说订阅URL应该看起来像/path/to/subscriptions/<subscription_id>。但是,在这个URL背后是什么?又是一个使订阅生效的php脚本吗?我确信Rest不仅仅是关于看起来像名词或动词的漂亮URL名称。因此,即使按照你描述的方式,在这些URL下,你不会执行与我执行相同的代码吗? - Johny Jaz
REST不关心它的实现方式 - 你所指的“后台”。它关心的是响应。那么当你GET /path/to/subscriptions/X时,你会收到什么?REST会说你会收到资源subscriptions/X的表示形式。当你PUT到subscriptions/X时会发生什么?REST会说你用HTTP请求体覆盖subscriptions/X。把URL想象成一个文件名。当你写入文件时会发生什么?答案是你不关心操作系统做了什么,只要它用你提供的内容覆盖掉原来的内容 - 这就是PUT。 - jimbo
是的,但再次强调这只是理论上的。我问的是实际情况下会发生什么:p如果不是我的脚本在这些url后面,那背后是什么?这就是我无法理解的地方。 - Johny Jaz

1

您在对上一个答案的评论中说得非常正确:

我确信REST并不是关于看起来像名词或动词的漂亮URL名称。

RESTful意味着充分利用HTTP的全部潜力,就像下面的帖子中提到和解释的那样:

例如,让我们想象一下,我们有一个由Web服务管理的用户数据库。使用非RESTful方法,它可能看起来像这样:

/user_create
/user?id=xxx
/user_edit?id=xxx
/user_delete?id=xxx

/user 
/user/xxx

如果您想创建新用户,只需向该URL发送POST请求并使用要创建的数据。如果您想检索用户,则向/user/xxx发送GET请求。如果您想更新用户,只需使用PUT请求发送要更新的字段到/user/xxx。如果您想删除它,则发送DELETE请求而不是其他请求。
更具体的例子,在RESTful应用程序中,您永远不会使用GET请求修改数据。这就是PUT、POST和DELETE的作用。然而,大多数Web应用程序经常这样做,因此它们不是RESTful。
摘自: 什么是RESTful编程? 说了这么多,RESTfull意味着正确地使用以下所有操作: http://en.wikipedia.org/wiki/Http_protocol#Request_methods

enter image description here

这也是一篇很好的帖子,回答了许多关于REST API的问题:

http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven


好的,我理解这个概念。我们发送请求时会将操作和资源(url)指向。例如,如果要更新用户,则发出PUT请求到/user/xxx。这是我不理解的地方。/user/xxx下面是什么?在我的情况下,我有一个脚本,例如/user/subscribe.php,它以id作为输入并执行其功能。在您所描述的内容中,这个链接是什么?是php脚本中的方法吗?是一个类吗?还是一个实际的php文件? - Johny Jaz
它可以是PHP脚本(Zend框架或常规PHP),也可以是CGI脚本,任何在服务器端的东西。 - Mehdi Karamosly
我从未使用过框架。你认为通过使用框架,这些事情对我来说会更容易理解吗?框架是否提供了解决方案? - Johny Jaz
不需要使用框架,您可以使用简单的PHP,但我相信您会喜欢使用框架,特别是MVC框架,如Zend MVC框架(它们将模型(数据)、视图(HTML模板/CSS)和控制器(服务器计算操作)分开,它们易于扩展和维护)。 - Mehdi Karamosly

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