1

我正在尝试学习创建 RESTful Web 应用程序。我有几个疑问。

  1. 比如说,我需要在网站标题上显示用户名。我曾经通过将用户对象存储在会话中然后在 JSP 中获取名称来做到这一点。但是现在,这不是存储会话数据并打破 REST 约定吗?只要用户登录(矫枉过正),我是否必须在每个响应中将名称发送给客户端?
  2. 我在许多网站中都看到过 URL,包括模式中的 SO questions/4135336/correct-rest-uri-design。还questions/4135336不够,假设4135336是ID?那之后是什么?另一个身份证?生成它的任何标准?
  3. 我已经阅读了对于特定资源的内容,例如 /students/{student} CRUD 操作应该使用 GET(获取)、POST(更新)、PUT(创建/覆盖)、DELETE(删除)来完成。如果它是人类阅读的应用程序,我们是否需要这些约定。例如:POST 不会通过发送适当的参数来进行删除吗?我们要达到什么目标?

提前致谢 :)

4

3 回答 3

1

REST背后的整个想法是,从服务器的角度来看,每个请求都完全独立于其他请求。客户端负责维护状态(如果有)。对于给定的请求,服务器向客户端传输满足请求所需的信息,并且还可以传输允许客户端通过发出更多请求来找到附加信息的信息。考虑到这一点:

  1. 这取决于您网站的设计,以及什么被认为是“资源”。如果客户端请求一个页面,并且该页面被视为单个资源单元,那么是的,服务器需要返回用户名作为任何请求的响应的一部分。如果设计是客户端可以分段请求内容,那么客户端有责任在请求中请求用户名,然后将其呈现在标头中。页面其余部分的内容将通过额外的单独请求呈现。
  2. 身份证就够了。URL 的其余部分仅用于人类可读性,因为人类不容易记住“415336”是标题为“Correct Rest Uri Design”的文章的 ID。服务器不使用 URL 中的这些额外信息来查找项目;仅使用 ID。因此,它本身并不是 REST 的一部分,它只是网站提供的一个细节。
  3. 理想情况下,REST 应该与客户端无关;理论上,您可以编写一个通用 REST 客户端,它可以导航任何支持 REST 的服务器,并且该客户端将能够发现服务器上的资源并能够操作它们。正如您所指出的,这是可能的,因为 REST 利用 HTTP 动词的标准词汇表来表示常见的 CRUD 操作。如果您重载 HTTP 动词以表示其他内容,那么通用客户端可能无法浏览该站点。此外,如果您重载 GET 以产生更新或删除信息等副作用,那么一个通用客户端(想想一个网络爬虫)最终可能会通过试图找出网站上可用的内容来破坏信息。这从来都不是一个好主意。
于 2013-05-26T16:38:51.263 回答
0

针对第 3 点:经验法则说您应该使用 GET 呈现数据并使用 POST 操作数据。像这样的创建和删除不需要除了 POST 之外的任何东西。

但是永远不要使用 GET 操作数据,否则您的链接 ( somesite.com/users/delete?user=1) 可能会被索引,并且您的整个数据库将变得一团糟。使用 GET 呈现数据还允许您的用户为特定结果添加书签并提供链接以发送给其他人。

于 2013-05-26T16:00:36.823 回答
0

对于第 3 点,您问我们试图通过使用 http 方法(除了最通用的方法)来实现什么。我们实现的是优化潜力。

最通用的方法是 POST。post 可以做任何事情,包括检索只读内容。为了优化它,我们创建了 GET。GET 结果可以被缓存,因为每个人的结果都是一样的,并且多个 GET 请求总是给出相同的结果(对于静态文件、非静态文件,服务器必须告诉缓存它们的有效期)。

我们可以进一步梳理出其他可以优化的用例,例如,如果要删除特定对象,请使用 DELETE 方法。如果服务器没有响应,你可以再试一次,因为如果对象消失了,你的请求可以被忽略,如果对象第一次没有被删除,它会在第二次尝试。您无法知道删除请求是否包装在通用信封中,客户端不知道其语义(例如 html 表单)。

于 2013-06-10T19:30:26.173 回答