分层RESTful URL设计

我已经仔细阅读了有关这方面的问题,但我仍然没有确定的答案。

我有一个应用程序,并希望构建一个RESTful API来公开一部分信息。 我有三个资源:

  • 用户
  • 报告
  • 相片
  • 用户有报告和报告有照片。 照片不能存在于报告之外,报告不能存在于用户之外。

    我为我的要求设计了以下URL

    用户登录时,服务器使用在所有API调用的头部中发送的令牌进行响应

    GET example.com/api/
    

    获取用户信息

    GET example.com/api/users/{username}
    

    获取所有用户报告

    GET example.com/api/users/{username}/reports
    

    获取报告的所有照片

    GET example.com/api/users/{username}/reports/{report_id}/photos
    

    添加照片

    POST example.com/api/users/{username}/reports/{report_id}/photos
    

    删除照片

    DELETE example.com/api/users/{username}/reports/{report_id}/photos/{photo_id}
    

    修改照片说明

    PUT example.com/api/users/{username}/reports/{report_id}/photos/{photo_id}
    

    问题

  • 在URL中添加一个资源ID是否是一种好的做法,例如资源/ ID,还是应该将其添加为查询参数?
  • 这种链接资源的方法,即资源/ ID /子资源/ ID /等,可接受和良好,或者我应该把我所有的资源在顶层,并用查询参数指定其位置?

  • 恕我直言,你的建模很好。

    关于1我宁愿去与resource/id而不是查询参数。 但是,建模时必须考虑的一件事是代理等缓存机制。 所以不要忘记标题。

    我去查询参数进行过滤和这些排序。

    关于登录,证书应该在标题中,并且不需要特定的资源。 只需应用每个资源安全性。


    这个设计没有错,但是这会创建一个很长的URL,有时很难理解,并且API的用户需要知道层次结构。此外,API的使用者需要以一点点非标准方式编写更多代码(即使它可以完成,但会有点混乱)。 从不同的角度思考你有三个资源,每个资源都有它自己的身份。所以如果我们重构上面的URI,它将如下所示(我只演示GET)

    用户资源:

    获取用户列表

      GET example.com/api/users
    

    获取特定用户

      GET example.com/api/users/{username}
    

    报告资源:

    获取所有报告

     GET example.com/api/reports
    

    获取特定报告

     GET example.com/api/reports/{report_id}
    

    照片资源

    所有照片

    GET example.com/api/photos
    

    特定照片

    GET example.com/api/photos/{photo_id}
    

    用户所有报告

    GET example.com/api/reports?username={userName}
    

    用户的具体报告

    GET example.com/api/report?username={userName}&report_id={reportId}
    

    用户所有照片

    GET example.com/api/photos?username={userName}
    

    用户报告ID的所有照片(如果report_id是唯一的,不管用户如何,都可能不需要用户名,这将进一步简化URI)

    GET example.com/api/photos?username={userName}&report_id={reportId}
    

    报告的所有照片

    GET example.com/api/photos?report_id={reportId}
    

    这简化了理解,使用这种方法可以在消费者端编写更多标准代码。


    我没有看到你的计划有什么问题。

    现在大多数框架都使用类似的标准来指定url(比如Django)。

    在我个人看来,它使得URL更易读,更好用户。

    链接地址: http://www.djcxy.com/p/40969.html

    上一篇: Hierarchical RESTful URL design

    下一篇: RESTful APIs when multiple actions on the same URI