Web API和Upserts

时间:2013-12-31 18:39:18

标签: asp.net asp.net-web-api

我正在使用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。

1 个答案:

答案 0 :(得分:5)

虽然没有官方标准,但我会给我两分钱。

对于upsert,您应该使用PUT而不是POST。见this specification here

PUT用于幂等操作或操作,如果请求被多次发送并且结果总是相同则无关紧要。

根据上述规范:

  

如果Request-URI指的已经存在的资源下,所述封闭实体的应被视为驻留在源服务器在所述一个的修改版本。如果Request-URI的不指向一个现有的资源,然后该URI是能够被定义为由请求的用户代理的新资源,的源服务器可以创建资源使用该URI。

像我说的那样,这只是我的意见。如果你看一些其他主要的RESTful API,他们会采用不同的方式。例如,Salesforce REST API使用PATCH方法进行upsert。