具有不同请求集的REST API POST/PUT
创建/修改资源的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
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
{
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
{
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中引入层次结构呢。那是一辆汽车吗