通过一个例子来理解休息

时间:2013-06-20 16:07:56

标签: php rest

我正在开发一个客户端 - 服务器Web服务。 前端使用html/javascript/jquery/jqm构建,后端使用php/mysql构建。

当客户端启动时,它有static id(从不更改)和dynamic-token(这意味着它可能会也可能不会更改)。出于这个原因,每次客户端启动我们将他注册到我们的服务器时,我们向我们的服务器发出POST请求,在我们的服务器中,我们有一个带有id and token的JSON文件。 post请求是一个如下所示的php脚本:myserver.com/register.php,php脚本接受id and token并查询数据库以查看它们是否存在。如果id不存在creates新记录。如果存在,则会检查token是否已更改为updates

从客户端,用户可以订阅许多事件(比方说10)。事件显示在带有复选框的列表中。用户检查他希望订阅的事件并按下订阅按钮。点击订阅按钮时,会向一个php脚本发出POST请求,该脚本在正文中有一个json文件,其中包含用户的id以及带有布尔值的所有事件名称(subscribe)或不属于某人)例如

id: xxxxxx
event1: 1
event2: 0
event3: 0
event4: 1
...

php脚本如下所示:myServer/subscribe.php。当请求到达时,php文件读取收到的JSON。他在数据库中搜索id,然后检查事件的名称和发送的布尔值。如果是1,则订阅用户。如果为0则取消订阅用户。如果用户已经订阅并且他再次订阅则没有任何反应。取消订阅也是如此。

最后,当用户进入订阅页面时,会向服务器发出POST请求,其中正文中的JSON文件包含用户的id。请求是在一个看起来像myServer/whereSubsribed.php的php文件上发出的。这个php文件获取id并在数据库中查找订阅此id的事件。完成后,它会使用json文件响应(回显)客户端,该文件包含用户已订阅的所有事件,以便在加载复选框时,用户已订阅的事件似乎可以检查。

上述服务是否休息?我真的很难理解什么是休息,什么不是。 我的理解:

我知道我应该使用POST PUT DELELE GET但是我可以用你看到的POST来做所有事情。那为什么要使用它们?我知道休息是关于名词而不是动词,关于资源而不是行动。我不知道这意味着什么实践。

在我描述的这个特定情况下,有人可以请说明Rest Web服务的外观吗?我怎么可能没有订阅/取消订阅/注册等行动?

我希望通过给我一个例子,我终于可以理解什么是Rest。在这一点上,也许我应该说我不知道​​什么是SOAP。当我开始开发我的服务时,我就是这样做的,因为这就是我认为正确的方法。然后我了解了休息/肥皂的事情。那么休息是另一种方式,我的服务可以完成,如果是,请花一些时间,并解释我如何?

非常感谢您阅读这篇长篇文章。

**如果你能给我一个答案,请不要给我一个关于这个问题的定义或理论方法。我读过几乎所有需要阅读的内容。我也是一个新的html / php脚本编写者,所以如果你能给我一个与我描述的完全相同的服务的例子,我将不胜感激。如果它是宁静的话会怎样才能理解我的想法。

修改


我看到它的方式,我使用HTTP请求(POST)将一些数据(id,token等)推送到特定的action / php脚本(subscribe,register,whereSubscribed)。

休息应该是准确的相反?通过HTTP(post put delete update)向资源(用户和事件)发送动作。

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

2 个答案:

答案 0 :(得分:1)

正如你所描述的那样,不是它不是REST。在REST中,URL就像指向资源的地址。实际上,URL是名词,HTTP方法是动词

您所描述的系统包含动词的脚本。例如,subscribe.php执行某些操作。

RESTful思考,您的资源包括令牌和订阅等内容。如果您想要执行REST,则每个订阅都应该有一个明确且明确的URL。

例如,订阅的网址可能为/path/to/subscriptions/<subscription_id>,其中<subscription_id>将替换为相关订阅的特定ID。当客户想要订阅某些内容时,他们会将某些东西放到该URL上。

如果客户想要订阅,但不知道确切的最终位置,他们会发送一些类似/path/to/subscriptions的通用内容,而HTTP响应会包含一个指向正确方向的Location标头/path/to/subscriptions/<subscription_id>

PHP不会立即有助于RESTful编程。 PHP脚本位于特定路径并执行操作(动词)。你必须不遗余力地拥有反映资源名词的漂亮网址。

希望这有帮助!

答案 1 :(得分:1)

在你对上一个答案的评论中,你是完全正确的:

  

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

RESTfull意味着使用HTTP的全部潜力,如下面的帖子中提到并解释的那样:

  

例如。让我们假设我们有一个用户数据库   由Web服务管理。使用非宁静的方法   可能看起来像这样:

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

/user 
/user/xxx
  

如果您想创建新用户,只需向其发送POST请求即可   包含您要创建的数据的URL。如果你想检索一个   用户向/ user / xxx发送GET请求。如果要更新用户   您只需使用PUT请求发送要更新的字段即可   /用户/ XXX。如果要删除它,请发送DELETE请求   代替。

     

一个更具体的例子。在RESTful应用程序中,您永远不会   使用GET请求修改数据。这就是PUT,POST和DELETE   对于。但是,大多数Web应用程序都会这样做   因此不是RESTful。

取自:What exactly is RESTful programming?

由于这很难过,RESTfull意味着正确使用以下所有操作: http://en.wikipedia.org/wiki/Http_protocol#Request_methods

enter image description here

这也是回答很多关于REST Apis的问题的好文章:

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