设计一个RESTful网站

时间:2013-05-26 15:53:31

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

我正在努力学习创建RESTful Web应用程序。我有些疑惑。

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

回应第3号:经验法则说你应该使用GET呈现数据并使用POST操作数据。除此之外,创建和删除不需要任何其他内容。

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

答案 2 :(得分:0)

对于3号,您可以通过使用http方法(除最通用的方法之外)询问我们要实现的目标。我们所取得的是优化潜力。

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

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