Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用扁平化还是不扁平化主体调用HTTP POST API?_Api_Asp.net Core_Api Design - Fatal编程技术网

使用扁平化还是不扁平化主体调用HTTP POST API?

使用扁平化还是不扁平化主体调用HTTP POST API?,api,asp.net-core,api-design,Api,Asp.net Core,Api Design,我正在开发一个可以返回用户列表的API: "users": [ { "userId": 1, "name": "John Smith" "address": { "countryCode": "gb", "street": "Orford Street 20", "locality": "London" } "skills": [ { "skillId": 1, "name": "design" },

我正在开发一个可以返回用户列表的API:

"users": [
  {
    "userId": 1,
    "name": "John Smith"
    "address": {
      "countryCode": "gb",
      "street": "Orford Street 20",
      "locality": "London"
    }
    "skills": [
      { "skillId": 1, "name": "design" },
      { "skillId": 2, "name": "logotype" }
    ]
  }
]
考虑到我需要创建一个具有地址和技能的用户

哪种正文格式更常用?有点扁平化:

"users": [
  {
    "name": "John Smith"
    "addressCountryCode": "gb",
    "addressStreet": "Orford Street 20",
    "addressLocality": "London"
    "skills": [ "design", "logotype" ]
  }
]
可能与GET响应的格式相同:

"users": [
  {
    "name": "John Smith"
    "address": {
      "countryCode": "gb",
      "street": "Orford Street 20",
      "locality": "London"
    }
    "skills": [
      { "name": "design" },
      { "name": "logotype" }
    ]
  }
]
或者可以分步骤创建用户:

  • 创建用户
  • 向用户添加地址
  • 向用户添加技能
  • 我相信,即使API有steps端点,一个接受用户所有数据的端点也会阻止多个Post查询创建单个用户

    哪种方法更常用


    或者甚至可以使用另一种方法?

    如果您想遵循Rest设计,最好为每个操作都有一个端点,因此第三种方法是您应该使用的方法。 这种方式有一些优点:

  • 假设您有一个现有用户,并且希望为他分配一个地址。 如果您遵循第一种或第二种方法,那么现在需要创建另一个端点来获取用户ID和地址,以便将其添加到用户

    但是如果您遵循了第三种方法,那么已经有一个端点可以执行此操作,您可以在这种情况下重用它

  • 在第一种和第二种方法中,不清楚单个操作方法的作用是什么。有一个巨大的方法可以创建一个用户,创建一个地址并分配给用户,创建一些技能并分配给用户,然后

    在第三种方法中,很明显端点的作用是什么。一个端点创建用户,一个端点为用户创建地址,一个端点为用户创建技能,等等。 更改其中一个方法体只有一个原因

    你在这里遵守了单一责任原则

  • 第三种方法可能出现的一个问题是,通过这种方式,我们将有更多的API调用来创建用户并为其分配地址。至少会有2个API调用

    答案是,您可以使用批处理,只需一次API调用即可同时调用多个端点。有一些很好的批处理请求实现,您可以利用它们