RESTWeb服务API设计

RESTWeb服务API设计,rest,restapi,Rest,Restapi,只是想得到关于我计划如何构建API的反馈。下面是虚拟方法。结构如下: GET http://api.domain.com/1/users/ <-- returns a list of users POST http://api.domain.com/1/users/add.xml <-- adds user POST http://api.domain.com/1/users/update.xml <-- updates user DELETE (or POST?) http:

只是想得到关于我计划如何构建API的反馈。下面是虚拟方法。结构如下:

GET http://api.domain.com/1/users/ <-- returns a list of users
POST http://api.domain.com/1/users/add.xml <-- adds user
POST http://api.domain.com/1/users/update.xml <-- updates user
DELETE (or POST?) http://api.domain.com/1/users/delete.xml <-- deletes user
GEThttp://api.domain.com/1/users/ 
  • 在REST中,HTTP“动词”用于表示操作类型:您将无法仅用“GET”和“POST”来表示所有CRUD操作

  • 否:资源的URL通常是“文档标识符”应该出现的位置

  • 在创建/修改所述资源时,可以在HTTP响应头中传输“文档”的版本。服务器应该负责唯一地标识资源—在客户端尝试这样做将是一项艰巨的挑战,即保持一致性

  • 当然,在这个主题上有很多变化…

    1)在您的设计上可能没有。POST不是幂等的!因此,您不应该将其用于更新或删除,而应该使用PUT和delete from Rest

    2) 更好的选择是在WS调用上使用头内容类型,如:application/xml

    3) 在标题内容类型上,也可以使用它:application-v1.0/xml


    4) 不确定这是否是最好的,但最简单的方法可能是在中使用HTTP的内置身份验证机制。例如:

    我根据头进行了身份验证。差不多

    X-Username:happy-hamster
    X-Password:notmyactualpassword
    
    如果您担心安全性,请通过SSL来实现。 当然,还有其他实现。例如,Amazon及其S3:

    若你们并没有能力发出PUT和DELETE请求,那个么通过POST隧道发送它们被认为是一种很好的做法。在这种情况下,操作是在URL中指定的。如果我没记错的话,RoR就是这样做的:

    POST http://example.com/foos/2.xml/delete
    

    POSThttp://example.com/foos/3.xml/put
    ...
    纽巴
    

    这有点不着边际,但关于版本控制和REST总体来说,您可能需要看一看。在深入了解REST之前,这里有一个

    ,这里是一些您真正需要掌握的术语:

    资源-您希望在API中提供的内容/数据(在您的情况下是“用户”)

    URI—资源的通用唯一ID。不应提及正在执行的方法(例如,不应包含“添加”或“删除”)。然而,URI的结构并不能让你的应用程序或多或少保持RESTful——这是一个常见的误解

    统一接口—您可以在资源上执行的一组固定操作,在大多数情况下是这样的。每个HTTP方法都有明确的定义

    您的uri目前最没有效率的地方是,它们拥有关于正在执行的操作的信息。URI是ID,仅此而已

    让我们以现实世界为例。我叫内森。“Nathan”可以被认为是我的ID(或者用restful术语URI——在本例中,假设我是唯一的“Nathan”)。我的名字/身份证不会因您希望与我互动的方式而改变,例如,当您想问候我时,我的名字不会变为“NathanSayHello”

    其余的也一样。您要更新该用户时,由标识的用户不会更改为。您要更新该用户的事实由您正在使用的方法暗示(例如PUT)

    以下是我对您的URI的建议

    # Retrieve info about a user 
    GET http://api.domain.com/user/<id>
    
    # Retrieve set all users
    GET http://api.domain.com/users
    
    # Update the user IDed by api.domain.com/user/<id>
    PUT http://api.domain.com/user/<id>
    
    # Create a new user.  The details (even <id>) are based as the body of the request
    POST http://api.domain.com/users
    
    # Delete the user ID'd by api.domain.com/user/<id>
    DELETE http://api.domain.com/user/<id>
    
    #检索有关用户的信息
    得到http://api.domain.com/user/
    #检索并设置所有用户
    得到http://api.domain.com/users
    #通过api.domain.com/user更新用户ID/
    放http://api.domain.com/user/
    #创建一个新用户。细节(偶数)作为请求的主体
    邮递http://api.domain.com/users
    #删除api.domain.com/user指定的用户ID/
    删除http://api.domain.com/user/
    
    关于你的问题:

  • 在适当的时候使用PUT和DELETE,并避免在POST中断时重载POST来处理这些函数。HTTP是您的统一接口。这是您与API用户关于他们如何期望与您的服务交互的合同。如果你破坏了HTTP,你就破坏了这个合同

  • 完全删除“添加”。使用HTTP的Content Type标头指定发布数据的mime类型

  • 您指的是API的版本还是资源的版本?ETag和其他响应头可用于对资源进行版本设置

  • 这里有很多选择。基本HTTP身份验证(简单但不安全)、摘要身份验证、自定义身份验证(如AWS)。OAuth也是一种可能性。如果安全性非常重要,我将使用客户端SSL证书


  • 使用post创建和删除功能不是一个好的RESTAPI设计策略。使用Put创建、post更新和delete删除资源。
    有关设计rest API的更多信息,请参见链接-

    您对(1)的推理很弱。POST不是“非幂等”,而是“不一定幂等”。因为他定义了服务器端语义,所以他的文章可能是幂等的,这对于http和整个世界来说都很酷。@NasBanov,来自w3.org http方法文档。请看第9.1.2节幂等方法。Post从来没有显示为可能的幂等方法。@DiegoDias,9.1.2谈到GET/HEAD/PUT/DELETE,对Post没有任何影响。如果我说乔和莫是诚实的,那并不意味着比利是个骗子。[9.5]“POST方法执行的实际功能由服务器决定,通常取决于请求URI”-例如,如果我在那里有一个(触发器)灯开关,它将不是幂等的。但如果它是一个“开”按钮,则它将是幂等的。参见第9.6节:POST和PUT请求之间的根本区别体现在请求URI的不同含义上。POST请求中的URI标识将处理封闭实体的资源。。。相反,PUT请求中的URI标识了请求中包含的实体”。因此,如果要使用PUT,您需要提前知道userID并执行
    PUThttp://api.domain.com/
    
    # Retrieve info about a user 
    GET http://api.domain.com/user/<id>
    
    # Retrieve set all users
    GET http://api.domain.com/users
    
    # Update the user IDed by api.domain.com/user/<id>
    PUT http://api.domain.com/user/<id>
    
    # Create a new user.  The details (even <id>) are based as the body of the request
    POST http://api.domain.com/users
    
    # Delete the user ID'd by api.domain.com/user/<id>
    DELETE http://api.domain.com/user/<id>