我正在设计一个Web应用程序,然后停下来思考我的API应该如何设计成REST风格的Web服务。目前,我的大多数URI都是通用的,可能适用于各种Web应用程序:
GET /logout // destroys session and redirects to /
GET /login // gets the webpage that has the login form
POST /login // authenticates credentials against database and either redirects home with a new session or redirects back to /login
GET /register // gets the webpage that has the registration form
POST /register // records the entered information into database as a new /user/xxx
GET /user/xxx // gets and renders current user data in a profile view
POST /user/xxx // updates new information about user
我有一种感觉,我做了很多错误的在这里后,戳周围的SO和谷歌。
从/logout
开始,也许因为我真的不知道GET
的任何东西-它可能是更合适的POST
一个请求到/logout
,销毁会话,然后GET
重定向。
那么/login
和/register
呢?我可以将/register
更改为/registration
,但这不会改变我的服务的基本工作方式--如果它有更深层次的问题的话。
现在我注意到我从来没有公开过/user
资源,也许这一点可以被利用,例如,以用户myUser
为例:
foo.com/user/myUser
或
foo.com/user
最终用户不需要URI中的额外冗余。但是,哪一个在视觉上更吸引人呢?
我注意到这里还有一些关于REST业务的其他问题,但是如果可能的话,我真的很感激关于我在这里所做的事情的一些指导。
谢谢你!
更新日期:
我还想就以下问题提出一些意见:
/user/1
对比
/user/myUserName
7条答案
按热度按时间8fsztsew1#
RESTful可用作构建URL的指导原则,您可以将 * 会话 * 和 * 用户 * 资源:
GET /session/new
获取包含登录表单的网页POST /session
根据数据库验证凭据DELETE /session
销毁会话并重定向到/GET /users/new
获取包含注册表单的网页POST /users
将输入的信息记录到数据库中,作为新的/用户/xxxGET /users/xxx
//获取并呈现配置文件视图中的当前用户数据POST /users/xxx
//更新有关用户的新信息我通常使用
/users
作为用户索引页面(如预期的那样),使用/sessions
查看谁登录了(如预期的那样)。在URL中使用名称而不是数字(
/users/43
与/users/joe
)通常是出于对用户或搜索引擎更友好的愿望,而不是任何技术要求。两者都可以,但我建议你保持一致。我认为,如果你使用注册/登录/注销或
sign(in|up|out)
,它就不能很好地与其他术语一起工作。wkyowqbh2#
有一件事特别突出,因为它不是REST式的:使用GET请求注销。
(from http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_methods)
一些方法(例如HEAD、GET、OPTIONS和TRACE)被定义为安全的,这意味着它们只用于信息检索,不应该改变服务器的状态。换句话说,它们不应该有副作用,除了相对无害的影响,如日志记录、缓存、提供横幅广告或增加Web计数器。[...]
[...服务器对GET请求的处理在技术上没有任何限制。因此,粗心或故意的编程可能会导致服务器上的不寻常的变化。这是不鼓励的,因为它可能会导致Web缓存、搜索引擎和其他自动代理的问题。
至于注销和重定向,您可以在您的注销URI上给予一个303响应,重定向到注销后的页面。
http://en.wikipedia.org/wiki/Post/Redirect/Get
http://en.wikipedia.org/wiki/HTTP_303
编辑以解决URL设计问题:
“我如何设计我的资源?”对我来说是一个重要的问题;“我如何设计我的URL?”是两个方面的考虑事项:
如果可能的话,用户将看到的URL不应该太难看和有意义;如果您希望在对某些资源的请求中发送Cookie,而不希望在对其他资源的请求中发送Cookie,则需要构建路径和Cookie路径。
如果
JRandomUser
想查看他自己的个人资料,而您希望URL比foo.com/user/JRandomUser
或foo.com/user/(JRandom's numeric user id here)
更漂亮,则可以为用户创建一个单独的URL,让用户查看自己的信息:在这个问题上,我会更容易地声称无知而不是智慧,但这里有一些资源设计考虑事项:
1.消费者:哪些资源应该直接在浏览器中查看,通过XHR加载,或者由其他类型的客户端访问?
1.访问/身份:响应依赖于cookie还是引用者?
brjng4g33#
会话不是REST风格的
正在创建用户
fbcarpbf4#
我将简单地谈谈我为我的客户集成各种REST Web服务的经验,无论它是用于移动的应用程序还是用于服务器到服务器的通信,以及为其他人构建REST API。以下是我从其他人的REST API以及我们自己构建的REST API中收集的一些观察结果:
由于REST被设计为服务,登录和注销等功能通常会返回成功/失败结果(通常为JSON或XML数据格式),然后消费者将对这些结果进行解释。
以上是我所谈的一些观点,希望能给大家提供一些启示。
至于REST的实现,以下是我遇到的典型实现:
在后台执行注销,返回JSON表示操作成功/失败
将凭据提交到后端。返回成功/失败。如果成功,通常还将返回会话令牌以及配置文件信息。
将注册提交到后端。返回成功/失败。如果成功,通常视为成功登录,或者您可以选择将注册作为一个单独的服务
获取用户配置文件并返回用户配置文件的JSON数据格式
以JSON格式发布更新后的配置文件信息,并在后端更新信息。向调用方返回成功/失败
ldxq2e6h5#
我相信这是一种RESTful的身份验证方法。对于LogIn,您使用
HttpPut
。当提供密钥时,可以使用此HTTP方法进行创建,并且重复调用是幂等的。对于LogOff,您在HttpDelete
方法下指定相同的路径。不使用动词。正确的集合复数。HTTP方法支持此目的。如果需要,您可以将current替换为active。
7fhtutme6#
我建议使用类似于twitter的用户帐户URL,其中用户帐户URL类似于
foo.com/myUserName
,就像您可以通过URL https://twitter.com/joelbyler访问我的twitter帐户一样我不同意注销需要POST。作为API的一部分,如果你要维护一个会话,那么UUID形式的会话ID可以用来跟踪用户,并确认所采取的操作是授权的。然后甚至GET也可以沿着会话ID传递给资源。
总之,我建议你保持简单,网址应该是短的一个难忘的。
x7rlezfr7#
ReST API本身代表Representational State Transfer,您可以在数据库之间来回传输资源的状态。
因此,每个动词都应该分配给一个资源,而在
/user/login
中,login
似乎不是将login
定义为资源的正确示例,其中user
是实际的资源。这是我所遵循的,这可能有点道理。
以上格式如下:[HTTP predicate ]/资源路径{正文(如果需要 *)}.
而对于注销,状态再次发挥作用,即在登录时不传输会话,而是JWT/AccessToken,这是一种客户端授权机制,您将其存储在前端作为本地存储,如果注销时未过期,则只需将其删除。
你不会有一个注销路径,这需要在你的API上请求,而是得到的到期时间处理或删除只在前端。