为复杂嵌套数据编写REST API

时间:2014-05-30 15:19:34

标签: node.js rest express

所以,我正在Angular中构建一个应用程序,它将在后面利用一个REST API,在Node上运行。在设计此API时我遇到了处理数据复杂性的问题,可以使用一些帮助。

以下是不同的资源。

  1. 医生(每位医生可能有多名患者)
  2. 患者(每位患者可能有多位医生)
  3. 约会(医生自然会有约会)
  4. 提醒(提醒可能会从医生发送给患者,而不是相反)
  5. 现在,以下是应用程序可能执行的一些操作,因此API的要求是明确的。

    1. 每位医生必须能够要求所有患者或特定患者。
    2. 每位患者必须能够要求所有医生或特定医生。
    3. 每位医生必须能够在特定日期或所有日期(如有必要)要求所有约会(查看所有患者)。
    4. 每位患者必须能够在特定日期或所有日期(如有必要)请求所有约会(见所有医生)。
    5. 每位医生必须能够要求单一患者进行所有预约。
    6. 每位患者必须能够向一位医生请求所有预约。
    7. 每位医生都必须能够向特定患者请求所有提醒。
    8. 请记住,请求自然可以是POST,GET,DELETE或PUT。现在,这是我到目前为止的地方。我只提到了URL,每次发送POST时的操作,GET,DELETE或PUT都是不言自明的。

      1. /doctors/
      2. /doctors/:id
      3. /doctors/:id/patients(返回/patient/:id
      4. 列表
      5. /doctors/:id/appointments
      6. /patients/
      7. /patients/:id
      8. /patients/:id/doctors(返回/doctors/:id
      9. 列表
      10. /patients/:id/appointments
      11. 现在,我对上述内容感到满意。这是我的问题。

        1. 如何设置任务编号7的URL而不使用/doctors/:id/patients/:id/appointments
        2. 之类的嵌套
        3. 此外,我可以很容易地通过以上方式获得医生或患者的所有预约。特定约会怎么样? /doctors/:id/appointments/:id/patients/:id/appointments/:id感觉不太对劲。
        4. 另外,看某位患者或某位医生的约会怎么样?
        5. 那个特定日期的每个医​​生或病人的预约呢?
        6. 我觉得嵌套太多了。请帮忙。

2 个答案:

答案 0 :(得分:3)

您的端点列表看起来不错。我想对你提出的问题可以有不同的看法。

以下是我对可以采取的措施的看法:

  

如何设置任务编号7的URL而不嵌套/doctors/:id/patients/:id/appointments

我认为会有一系列提醒,并按如下方式定义:

/doctors/:doctorid/reminders
/doctors/:doctorid/reminders/:patientid
  

此外,我可以很容易地通过以上方式获得医生或患者的所有预约。特定约会怎么样?   / doctors /:id / appointmentments /:id或/ patients /:id / appointmentments /:id   感觉不对。

无需将端点复杂化到该级别。如果您已经知道预约ID,为什么要通过医生或患者终点来达到这个目的?没关系,你直接通过它的集合到达项目。

/appointments/:appointmentid
  

另外,约会看某位患者或某位医生怎么办?

您可以利用查询参数的强大功能来处理此类问题。并非所有内容都是URL模板的一部分。可以将诸如过滤特定记录的特征添加到查询参数中。例如

/doctors/:doctorid/appointments?pantientName=
/patients/:patientid/appointments?doctorName=
  

那个特定日期的每位医生或患者的预约呢?

同样的事情,你可以这样:

/patients/:patientid/appointments?from=&to

或者对于非常了解的案例有特殊的终点,例如,今天的约会,本周,本月的约会:

/patients/:patientid/appointments/:year
/patients/:patientid/appointments/:year/:month
/patients/:patientid/appointments/:year/:month/:day

后者实际上可以重复使用相同的逻辑来实现一系列日期之间的约会。

答案 1 :(得分:2)

URI结构不是REST问题,因为根据统一接口约束,它必须与客户端分离。

重要的是:

  • 特定URI(包括路径和查询)只能识别单个资源。
  • URI被映射到资源而不是操作,所以如果你使用人类可读的优秀URI,那么它们只包含名词。
  

如何在没有嵌套的情况下为任务编号7设计URL   /医生/:ID /患者/?ID /约会

您可以映射缩小现有约会集合,如下所示:

  • /appointments?doctor=1&patient=1
  • /appointments/doctor:1/patient:1
  

对于特定的每个医生或患者的约会怎么样?   日期?

您可以使用日期过滤器执行此操作:

  • /appointments?date=2014-09-02
  • /appointments/date:2014-09-02