2013-05-26 39 views
1

我正在尝试学习如何创建REST风格的Web应用程序。我有一些疑问。设计一个REST风格的网站

  1. 说,我有一个要求在网站标题上显示用户的名称。我曾经这样做,通过将用户对象存储在会话中,然后在JSP中获取该名称。但现在,是不是存储会话数据并违反REST约定?只要用户登录(过度使用),我是否必须在每次响应中将名称发送给客户端?
  2. 我看过很多网站的网址,其中包括模式为questions/4135336/correct-rest-uri-design的SO。不会questions/4135336就够了,假设4135336是ID?那之后是什么?另一个ID?任何标准来生成它?
  3. 我读过一个特定的资源,说/学生/ {学生} CRUD操作应该使用GET(fetch),POST(更新),PUT(创建/覆盖),DELETE(删除)来完成。如果它的应用程序被人读过,我们是否需要这些约定。例如:不会通过发送适当的参数来进行删除吗?我们想要实现什么?

感谢提前:)

+0

为什么这个问题被降低了? – shazinltc

+0

不知道。我投票给你弥补它:-) –

+0

谢谢你:) – shazinltc

回答

1

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

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

谢谢,这是一个很好的答案。 – shazinltc

0

针对3号:经验法则说,你应该用GET与POST目前的数据和处理数据。这样创建和删除不需要是POST以外的其他任何东西。

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

0

对于数字3,你问我们试图通过使用http方法(最通用的除外)实现什么。我们实现的是优化潜力。

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

我们可以进一步梳理出可以优化的其他用例,例如,如果要删除特定对象,请使用DELETE方法。如果服务器没有响应,您可以再次尝试,而不用担心,因为如果对象不见了,您的请求可以被忽略,并且如果对象第一次没有被删除,它将在第二次尝试。如果删除请求被封装在通用信封中,客户端不知道语义(如HTML表单),则无法知道该信息。