具有不同请求集的REST API POST/PUT

具有不同请求集的REST API POST/PUT,rest,api-design,Rest,Api Design,创建/修改资源的post或put方法能否接受不同的请求对象集 例如:我有一个名为“服务器”的资源。它可以通过其操作系统来区分。例如,我可以有两个资源实例-一个windows服务器和一个linux服务器。 我在这里的基本决定是将它们视为相同类型的资源,即服务器 现在可能会发生这样的情况:为了创建一个windows服务器,my POST API接受的请求对象与同一个API在linux服务器上接受的请求对象不同 对于创建windows服务器,我有- POST : /v1/server accepts

创建/修改资源的post或put方法能否接受不同的请求对象集

例如:我有一个名为“服务器”的资源。它可以通过其操作系统来区分。例如,我可以有两个资源实例-一个
windows服务器
和一个
linux服务器
。 我在这里的基本决定是将它们视为相同类型的资源,即
服务器

现在可能会发生这样的情况:为了创建一个windows服务器,my POST API接受的请求对象与同一个API在linux服务器上接受的请求对象不同

对于创建windows服务器,我有-

POST : /v1/server
accepts 
{
    name : win-server-1
    os : 'windows'
    ms-office: 'Office2009'
}
为了创建linux服务器,我使用相同的api,但使用不同的请求对象-

POST : /v1/server
accepts
{
   name : linux-server-1,
   os : 'linux'
   kernel-version : '3.10.0' 
}
正如您所看到的,对于windows和linux服务器,同一POST API接受的请求是不同的。我的业务逻辑将根据
'os'
属性处理这些请求。因此,从技术上讲,它将工作(与丑陋的开关情况)。
但它真的是宁静的吗?或者我应该有不同的API,比如
/v1/windows server
/v1/linux server
,并为它们各自定义了唯一的请求定义?

我会选择
/v1/server/linux
/v1/server/windows
。这将允许您为GET保留
/v1/server

POST:/v1/server
-正如您所说,这需要更多的代码和一些“丑陋的开关盒”。当有人要求您添加新类型的服务器时,这种方法也很难维护和开发


/v1/linux服务器
/v1/windows服务器
——我认为这也是一个很好的方法。只有两种类型,拥有独立的端点并不是什么大问题。对于较大的数量,
/v1/server/{os_type}
在文档中看起来更好,并且比X个独立端点的列表更可读。

我会选择
/v1/server/linux
/v1/server/windows
。这将允许您为GET保留
/v1/server

POST:/v1/server
-正如您所说,这需要更多的代码和一些“丑陋的开关盒”。当有人要求您添加新类型的服务器时,这种方法也很难维护和开发


/v1/linux服务器
/v1/windows服务器
——我认为这也是一个很好的方法。只有两种类型,拥有独立的端点并不是什么大问题。对于较大的数量,
/v1/server/{os_type}
在文档中看起来更好,并且比X个独立端点的列表更可读。

从客户端的POV来看,最好有一个端点。请注意,拥有单独的资源会将“丑陋切换”的必要性转移到客户端

我同意你目前的解决方案。客户端的便利性和API的清晰性/简单性比开发人员的更重要。API比实现更重要。我认为您当前的解决方案在这方面更好:

  • 创建:
    POST/v1/服务器
  • fetch:
    GET/v1/servers/{server\u id}
    POST/v1/servers/{server\u name}
    (给定的名称是唯一的)返回单个资源
  • 查询:
    GET/v1/servers/?{filter_expression}
    (例如
    GET/v1/servers/?os=linux
    )返回(已过滤)资源的集合(最好使用分页)
我要改变的一件事是将操作系统特定的内容提取到嵌套资源中。这将使实现更加简单,API更加清晰:

{
    name : win-server-1,
    os : 'windows',
    config: {
        ms-office: 'Office2009'
    }
}

{
    name : linux-server-1,
    os : 'linux',
    config: {
        kernel-version : '3.10.0' 
    }
}

从客户端的POV来看,最好只有一个端点。请注意,拥有单独的资源会将“丑陋切换”的必要性转移到客户端

我同意你目前的解决方案。客户端的便利性和API的清晰性/简单性比开发人员的更重要。API比实现更重要。我认为您当前的解决方案在这方面更好:

  • 创建:
    POST/v1/服务器
  • fetch:
    GET/v1/servers/{server\u id}
    POST/v1/servers/{server\u name}
    (给定的名称是唯一的)返回单个资源
  • 查询:
    GET/v1/servers/?{filter_expression}
    (例如
    GET/v1/servers/?os=linux
    )返回(已过滤)资源的集合(最好使用分页)
我要改变的一件事是将操作系统特定的内容提取到嵌套资源中。这将使实现更加简单,API更加清晰:

{
    name : win-server-1,
    os : 'windows',
    config: {
        ms-office: 'Office2009'
    }
}

{
    name : linux-server-1,
    os : 'linux',
    config: {
        kernel-version : '3.10.0' 
    }
}
但它真的是宁静的吗

测试这个问题的一个好方法是询问你所做的与网络的匹配程度

在这种情况下,类似的做法是使用两个不同的表单,将请求提交到form action属性所描述的同一个目标URI

windows: <form action="/v1/server" method="post">
    <!-- ... -->
    Office: <input type="text" name="config.office"><br>
    <input type="submit" value="Submit">
</form> 

linux: <form action="/v1/server" method="post">
    <!-- ... -->
    Kernel-version: <input type="text" name="config.kernel-version"><br>
    <input type="submit" value="Submit">
</form>
但它真的是宁静的吗

“真正的restful”与服务器如何处理请求关系不大——更重要的是理解服务器如何向客户机(aka)描述请求

但它真的是宁静的吗

测试这个问题的一个好方法是询问你所做的与网络的匹配程度

在这种情况下,类似的做法是使用两个不同的表单,将请求提交到form action属性所描述的同一个目标URI

windows: <form action="/v1/server" method="post">
    <!-- ... -->
    Office: <input type="text" name="config.office"><br>
    <input type="submit" value="Submit">
</form> 

linux: <form action="/v1/server" method="post">
    <!-- ... -->
    Kernel-version: <input type="text" name="config.kernel-version"><br>
    <input type="submit" value="Submit">
</form>
但它真的是宁静的吗


“真正的restful”与服务器如何处理请求关系不大——更重要的是理解服务器如何向客户机(aka)描述请求

谢谢回复!但如果我不想在url中引入层次结构呢。这是一个非常不必要的问题吗?因此,我可以使用/v1/linux服务器和/v1/windows服务器,而不是使用说/v1/server/linux的API。仍然保留GET的/v1/服务器。通常这部分
/v1/server/{here}
是为资源标识符保留的。我不会把过滤表达式放在那里。谢谢回复!但如果我不想在url中引入层次结构呢。那是一辆汽车吗