【问题标题】:Designing a RESTful website [closed]设计一个 RESTful 网站 [关闭]
【发布时间】:2013-05-26 15:53:30
【问题描述】:

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

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

提前致谢:)

【问题讨论】:

  • 为什么这个问题被否决了?
  • 不知道。我投票赞成你来弥补它:-)

标签: java http rest restful-url restful-architecture


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这是一个很好的答案。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 2013-03-06
      相关资源
      最近更新 更多