【问题标题】:What is the best practice to design REST URI for the following use case为以下用例设计 REST URI 的最佳实践是什么
【发布时间】:2020-03-21 07:00:18
【问题描述】:

用户可以在应用程序中注册 /用户

GET /id 获取用户详细信息

POST saveUserDetails

管理员可以创建事件供用户注册

/事件

POST 保存事件 PUT /{event-id} 用于更新事件

DELETE /{event-id} 删除事件

现在,问题是您会将用户放置到事件注册 uri 的什么位置?

会不会 /events/{event-id}/注册

或 /users/{user-id}/events?event-id=xxx

我还想获取用户注册的事件列表

请帮助我设计更好的 API

【问题讨论】:

    标签: json rest spring-boot


    【解决方案1】:

    这里没有正确的答案,所以我只是把我可能会使用的模式扔在帽子里:

    POST /user    - register a new user
    GET /user/:id - Get user info
    PUT /user/:id - Update user info
    
    POST /event       - create an event
    PUT /event/:id    - Update an event
    GET /event/:id    - Get event details
    DELETE /event/:id - Delete event
    
    GET /event/:id/attendees - Get list of attendees
    POST /event/:id/attendees - Add user to list of attendees
    
    GET /user/:id/event - Get list of events that user is attendee of
    

    【讨论】:

      【解决方案2】:

      您可以通过多种方式实现这一目标,但我认为最佳做法是您应该能够从 URL 本身了解您想要实现的目标。

      例如, 管理员想要创建一个事件:

      POST:{basePath}/a/events 或 {basePath}/admin/events

      • 一个 | admin:定义此操作由管理员执行
      • events:定义正在对事件实体执行的操作

      现在用户想要注册该活动,因此

      POST:{basePath}/u/events/{eventId} 或 {basePath}/user/events/{eventId}

      • 你 | user:定义这个动作是由用户执行的
      • events:定义正在对事件实体执行的操作。可以是多个实体,因此在路径变量中添加 eventId 以定义您需要注册的实体。

      现在在上面的示例中,我假设您可以在请求中获取用户详细信息 或从会话中捕获它,但如果您不想遵循这种情况,那么您可能需要使用下面的示例(假设路径变量是您获取用户上下文的唯一选项)

      POST:{basePath}/u/{Id}/events/{eventId} 或 {basePath}/users/{userId}/events/{eventId}

      如果您愿意,可以阅读更多关于命名指南的here

      【讨论】:

        【解决方案3】:

        主要目标是注册一个活动。那你应该从/events开始

        这就是为什么/events/{event-id}/register 在我看来很好。

        【讨论】:

        • 我还想获得用户注册的所有事件的列表 我应该如何建模? users/{user-id}/events?
        • /events/registered/{user-id}
        • 这会导致歧义,其中 user-id 可以假定为 event-id 以获取注册到特定事件的用户列表
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-21
        相关资源
        最近更新 更多