我是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)
{
}
还有最后一个问题,我可以在同一个控制器内创建两个post方法,还是必须创建一个新方法?
对不起,如果问题看起来很简单,但是正如我所说,我是asp.net的新手。谢谢
答案 0 :(得分: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);
}
然后在数据层上,您可以执行以下操作:
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;
}
}
这不是最佳方法,但是我想在这里显示的是您可以在POST或PUT上插入资源。事实是,RESTful API的设计应遵循RESTful标准。如果使用PUT方法插入数据,则可能会遇到体系结构问题,并且API根本不是RESTful的。即使它使用HTTP方法进行通讯等等。
在RESTful API上遵循该标准非常重要。对于您和使用API的人。
您在这里获得了RESTful入门圣经。我通常将此邮件发送给希望了解RESTful世界的每个人:https://blog.octo.com/en/design-a-rest-api/
答案 1 :(得分:1)
Post()方法。
Put()能够更新RESTful服务中的内容