我正在使用Web API,我正在尝试创建一个执行upsert的操作。
我传递的是用户的名字和姓氏,如果我的表中存在该组合,我想更新该用户。如果组合不存在,我想创建该用户。 (是的,这是做作的,但是对于我正在建造的盲品酒品牌派对应用程序,不需要安全性)
鉴于Web API已分别映射POST和PUT来创建和更新操作,感觉这里有一点摩擦。我是专门使用POST操作,我应该用另一种方式吗?
// POST api/User
[ResponseType(typeof(User))]
public async Task<IHttpActionResult> PostUser(User user)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var current = await db.Users.FirstOrDefaultAsync(u => u.FirstName == user.FirstName && u.LastName == user.LastName);
int id;
if (current == null)
{
db.Users.Add(user);;
await db.SaveChangesAsync();
id = user.ID;
}
else
{
id = current.ID;
//Do some updates
current.Prop1 = "val";
await db.SaveChangesAsync();
user = current;
}
return CreatedAtRoute("DefaultApi", new { id = id }, user);
}
我想,另一种选择是让客户决定是否需要插入或更新。这将需要另一个Web API调用来确定对象的存在,然后使用适当的HTTP动词使用适当的Web API。
答案 0 :(得分:5)
虽然没有官方标准,但我会给我两分钱。
对于upsert,您应该使用PUT而不是POST。见this specification here。
PUT用于幂等操作或操作,如果请求被多次发送并且结果总是相同则无关紧要。
根据上述规范:
像我说的那样,这只是我的意见。如果你看一些其他主要的RESTful API,他们会采用不同的方式。例如,Salesforce REST API使用PATCH方法进行upsert。如果Request-URI指的已经存在的资源下,所述封闭实体的应被视为驻留在源服务器在所述一个的修改版本。如果Request-URI的不指向一个现有的资源,然后该URI是能够被定义为由请求的用户代理的新资源,的源服务器可以创建资源使用该URI。