REST 最重要的约束是超媒体约束(“超文本作为应用程序状态的引擎”)。将您的 Web 应用程序视为一个状态机,其中每个状态都可以由客户端请求(例如 GET /user/1)。一旦客户端具有一个这样的状态(想想:用户正在查看网页),它就会看到一堆它可以跟随以进入应用程序中的下一个状态的链接。例如,可能存在来自“用户状态”的链接,客户端可以按照该链接进入详细信息状态。
这样,服务器在运行时一次向客户端呈现应用程序的状态机一个状态。聪明的事情是:由于状态机是在运行时发现的,因此服务器可以在运行时动态更改状态机。
话说回来...
1. 资源本质上代表您想要呈现给客户端的应用程序状态。这通常会与域对象(例如用户)紧密匹配,但请确保您了解为它们提供的表示不仅仅是序列化的域对象,而是您的 Web 应用程序的状态。
从 GET /users/123 的角度思考是可以的。不要在 URI 中放置任何操作。虽然没有害处(它只是一个不透明的字符串),但至少可以说是令人困惑的。
2. 正如布赖恩所说。您可能想看看 Atom Publishing Protocol RFC (5023),因为它很好地解释了创建/读取/更新周期。
3. 关注面向文档的消息。媒体类型是 REST 的重要组成部分,因为它们(完全)提供了应用程序语义。不要使用诸如 application/xml 或 application/json 之类的泛型类型,因为您将围绕通常隐含的模式耦合您的客户端和服务器。如果没有什么能满足你的需求,那就自己编一个吧。
也许您对我使用 UBL 一起破解的示例感兴趣:http ://www.nordsc.com/blog/?cat=13
on 4. 通常,使用 POST /users/ 进行创建。看看 RFC 5023 - 这将澄清这一点。这是一个易于理解的规范。
5. 由于您不能使用会话(有状态服务器)并且是 RESTful 的,因此您必须在每个请求中发送凭据。各种 HTTP 身份验证方案已经处理了这个问题。这对于缓存也很重要,因为 HTTP Authorization 标头对缓存具有特殊的指定语义(没有公共缓存)。如果你把你的凭据塞进一个 cookie 中,你就会丢失那个重要的部分。
所有 HTTP 状态码都有一定的应用语义。使用它们,不要通过 HTTP 隧道传输您自己的错误语义。
您可以访问#rest IRC 或加入 Yahoo 上的 rest-discuss 进行详细讨论。
简