
Now let’s get began with our implementation. For our instance, we’ll use a easy purchasing cart utility.
Create the mannequin courses
Within the venture we created earlier, create the next courses within the Fashions folder.
public class Product
{
public int Product_Id { get; set; }
public string Product_Code { get; set; }
public string Product_Name { get; set; }
public double Product_Price { get; set; }
}
public class Order
{
public int Order_Id { get; set; }
public Checklist Merchandise { get; set; }
}
public class KeyStore
{
public string Key { get; set; }
public DateTime Expiry { get; set; }
}
Whereas the Product and Order courses are sometimes utilized in a ShoppingCart utility, the KeyStore class is used right here to retailer our idempotency keys. On this implementation, we’ll save these keys within the database (dbContext). Naturally, you could possibly change the implementation to retailer the keys within the cache or some other information retailer.
Create the controller class
Proper-click on the Controllers folder within the Resolution Explorer Window and create an API controller known as OrderController. Now, enter the next motion methodology within the OrderController class. This methodology creates a brand new order.
[HttpPost]
public IActionResult CreateOrder([FromBody] Order order, [FromHeader(Name = "X-Idempotency_Key")] string key)
{
if (string.IsNullOrEmpty(key))
{
return BadRequest("Idempotency secret is required.");
}
if (_dbContext.KeyStore.FirstOrDefault(okay => okay.Key == key)!= null)
{
var existingItem = _dbContext.Orders.FirstOrDefault(o => o.Order_Id == order.Order_Id);
return Battle(new { message = "Request has already been processed.", merchandise = existingItem });
}
_dbContext.KeyStore.Add(new KeyStore {Key = key, Expiry = DateTime.Now.AddDays(7)});
_dbContext.Add(order);
_dbContext.SaveChanges();
return Okay(order.Order_Id);
}
Look at the code above. An idempotency secret is generated on the shopper facet and handed within the request header. This key might be utilized by the server to make sure that repeated calls to the identical motion methodology won’t create duplicate information within the database. In different phrases, if the hot button is already current within the KeyStore, then the request for creation of the useful resource might be ignored. The presence of the important thing within the KeyStore signifies that the request was already processed earlier.
Takeaways
By embracing idempotency, you may construct APIs which can be strong, dependable, and fault-tolerant. Idempotent APIs are notably necessary and helpful in distributed methods, the place community points would possibly result in giant numbers of retried requests from the shopper facet. That mentioned, you need to all the time validate enter information to make sure information consistency earlier than storing information within the database.