用于在SQL Server中插入新数据的Post或Put方法?

Dim*_*Dim 0 c# asp.net asp.net-web-api

我是ASP.NET新手,我想问一下哪种方法更适合在SQL Server中插入新行.

我想避免的最大问题是将数据双重插入SQL Server.也许对于某些网络延迟,我会在客户端的应用程序中出现服务器错误,但服务器已收到我的数据并将其插入SQL Server.当我重试时,它将重新插入它们.

post或put方法可以避免这种情况吗?或者我需要创建自己的机制?

public void Post([FromBody]string value)
{
}

// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
Run Code Online (Sandbox Code Playgroud)

还有最后一个问题,我可以在同一个控制器中创建两个post方法,还是我必须创建一个新方法?

对不起,如果问题看起来很容易,但正如我所说,我是asp.net的新手.谢谢

Nic*_*iff 5

POST或PUT方法本身并没有解决任何问题.如果您想避免您描述的行为,您应该通过向该方法添加自己的逻辑来解决这个问题.如果数据存在与否,那么您的实现必须控制.

理想情况下,在REST API上,POST将用于创建资源,而PUT用于更新现有资源.

话虽如此,您可以根据谁调用该端点以及应用程序的实例来实现您的逻辑.例如,如果某人两次发送具有相同资源的POST,您可以检查该资源是否存在并发送描述该情况的HTTP状态.

编辑:

我将添加一些代码向您展示.它是如何工作的:

假设您要在应用程序中创建和更新用户.端点可以是:http:// localhost:8080/api/users /使用POST方法并在请求主体上将用户作为JSON发送.

你将有一个这样的UsersController:

    public HttpResponseMessage Post([FromBody]UserModel user)
    {
        SQL.InsertUser(user);

        return Request.CreateResponse(HttpStatusCode.OK);
    }
Run Code Online (Sandbox Code Playgroud)

然后在数据层上你可以做这样的事情:

    public static void InsertUser(UserModel user)
    {
        try
        {
            using (_conn = new SqlConnection(_connectionString))
            {
                _conn.Execute(@"IF EXISTS(SELECT * FROM USER WHERE ID = @ID)
                                BEGIN
                                    /*DO THE UPDATE*/
                                END
                            ELSE
                                BEGIN
                                    /*DO THE INSERT*/
                                END", user);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这不是最佳方法,但我在此尝试显示的是,您可以在POST或PUT上插入资源.问题是RESTful API是按照RESTful标准设计的.如果您使用PUT方法插入数据,那么您可能会遇到架构问题,并且您的API根本不是RESTful.即使它使用HTTP方法进行通信等等.

RESTful API遵循该标准非常重要.对于您和使用API​​的人.

这里有一本RESTful入门圣经.我通常会将此发送给那些希望展现RESTful世界的人:https://blog.octo.com/en/design-a-rest-api/