首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为批量插入和更新设计Restful API?

如何为批量插入和更新设计Restful API?
EN

Stack Overflow用户
提问于 2013-06-25 16:32:44
回答 4查看 20.8K关注 0票数 22

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

代码语言:javascript
运行
复制
POST api/v1/products

它映射到我的操作:

代码语言:javascript
运行
复制
public HttpResponseMessage PostProducts(PostProductsRequest request)
{

...
}

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

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

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

如何为批量插入和更新设计Restful API?

EN

回答 4

Stack Overflow用户

发布于 2013-11-05 18:47:34

任何一种方法都可以使用,这取决于您的必备条件,但这并不意味着它们没有显著的区别。HTTP方法不是CRUD。PUT或POST不是创建和更新,反之亦然。

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

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

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

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

代码语言:javascript
运行
复制
GET /api/products

表示为:

代码语言:javascript
运行
复制
{'products': [product1, product2, product3]}

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

代码语言:javascript
运行
复制
PUT /api/products

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

但是,如果您有一个过滤器约束,您可以应用于/api/products,它将在上面的GET上返回一个空集合,那么只对该过滤资源的新产品执行PUT就可以了。例如,假设上面的产品可以通过合作伙伴属性进行筛选,它们具有合作伙伴x,而您正在为合作伙伴y添加:

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

代码语言:javascript
运行
复制
PUT /api/products?partner=y

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

然后返回一个GET /api/products

代码语言:javascript
运行
复制
{'products': [product1, product2, product3, product4, product5, product6]}

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

代码语言:javascript
运行
复制
{'products': [product1, product2, product3]}

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

代码语言:javascript
运行
复制
{'products': [product4, product5, product6]}

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

票数 9
EN

Stack Overflow用户

发布于 2013-06-25 23:14:01

我建议使用POST来创建,使用PUT来更新(实际上是创建或更新,因为它是indempotent)。

来自RESTful Webservices Cookbook (O‘’Reilly):

使用POST和集合资源一次创建多个相似的资源。让客户端在请求中包含有关要创建的资源的信息。为创建的所有资源分配一个URI,并使用响应代码303将客户端重定向到集合(参见其他)。此资源的表示包括指向所有新创建的资源的链接。

要批量更新或删除许多相似的资源,请使用单个URI,该URI可以返回包含所有这些资源的信息的表示。向URI提交PUT请求和关于要更新资源的信息,或者提交删除那些资源的DELETE请求。在所有这些情况下,请确保请求的处理是原子的。

票数 6
EN

Stack Overflow用户

发布于 2013-06-26 21:45:08

我只是碰巧看着HTTP 1.1 method definition,突然想起了这个问题。

PUT方法请求将封闭的实体存储在提供的Request-URI下。如果请求URI引用已存在的资源,则应将包含的实体视为驻留在源服务器上的实体的修改版本。如果请求URI不指向现有资源,并且请求用户代理能够将该URI定义为新资源,则源服务器可以使用该URI创建资源。

这将向我表明,如果您要使用PUT,并且有效负载包含一个没有足够信息来创建它的资源,那么它应该被创建,因此PUT将是可以创建和更新资源的批量操作中的正确方法动词。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17292656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档