c# - 如何设计用于批量插入和更新的 Restful API?

标签 c# asp.net rest asp.net-web-api

我有一个 Web API 应用程序,我使用下面的 url 进行批量(数十或数百)插入和更新,它们只返回 OK 或 Failed。

POST api/v1/products

映射到我的操作:

public HttpResponseMessage PostProducts(PostProductsRequest request)
{

...
}

PostProductsRequest 对象包含 List 类型的 Products 属性。

如果某个属性存在 Id 属性,我会更新它,否则它会指示插入。

但我只是想知道我是否应该只将 Post 用于批量插入而将 Put 用于批量更新,不确定。每种方法的最佳实践和优势是什么?

如何设计用于批量插入和更新的 Restful API?

最佳答案

可以使用任何一种方法,具体取决于您的要求,但这并不意味着它们没有显着差异。 HTTP 方法不是 CRUD。 PUT 或 POST 不是创建和更新,反之亦然。

PUT 完全 用提供的实体替换给定 URI 处的资源,因此它可用于创建和更新,但前提是它包含完整表示。在 PUT 之后立即发出的 GET 请求应该返回相同的资源。表示可能完全相同,尽管服务可以添加 PUT 表示中缺少的默认值。

POST 告诉服务器所提供的实体从属于给定 URI 的资源,并且他们就应该如何处理达成了一致。它可能是任何东西,创建、更新、HTTP 本身未标准化的任何操作。

考虑到这一点,只有在替换由 URI 标识的整个集合时,使用 PUT 进行的批量插入或更新才是 RESTful。这不一定是与该媒体类型关联的整个收藏。 URI 可以有一个对数据集进行切片的查询字符串,并且您仅对该切片执行批量操作。

例如,如果您有以下集合资源:

GET /api/products

代表:

{'products': [product1, product2, product3]}

如果您想再添加三个产品,使用 PUT 的批量操作必须将您的新产品附加到现有产品并将整个集合发回:

PUT /api/products

{'products': [product1, product2, product3, product4, product5, product6]}

但是,如果你有一个过滤器约束,你可以应用到 /api/products ,它会在上面的 GET 上返回一个空集合,那么只用新的 PUT 就可以了产品到该过滤资源。例如,假设上面的产品可以按合作伙伴属性过滤,它们有合作伙伴 x,而您要为合作伙伴 y 添加:

在这种情况下,您可以这样做:

PUT /api/products?partner=y

{'products': [product4, product5, product6]}

然后 GET/api/products 返回:

{'products': [product1, product2, product3, product4, product5, product6]}

只要 GET/api/products?partner=x 返回:

{'products': [product1, product2, product3]}

GET/api/products?partner=y 返回:

{'products': [product4, product5, product6]}

这可能看起来很复杂,有时看起来使用 POST 而不是 PUT 更好,但请记住,上面的整个操作是标准化的。它完全按照预期的方式使用 PUT。使用 POST 的操作可以更直接,但它们不是标准化的,您必须为其设计和记录您自己的语法。

关于c# - 如何设计用于批量插入和更新的 Restful API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17292656/

相关文章:

c# - XAML 按钮在消除引用后未被垃圾回收

c# - 以两位小数显示货币,但保留所有可用的小数位

spring - Spring Security可以解析 header 并验证身份验证信息吗?

c# - C#中使用属性值调用方法

c# - TryInvokeMember 和 TryInvoke 之间的区别

asp.net - 设置 Textbox.text 时,带有 MaskedEditExtender 的文本框不显示值

json - 使用Excel从API中提取数据

javascript - 尽管映射正确,Node/Express Rest API 仍不断输入相同的 Controller 功能

C# GridView 垂直和水平交替背景颜色

c# - Entity Framework 在第一次查询时大约需要 30 秒