.NET APIs Part 5 – All the CRUD APIs

In the previous posting we saw how to create an API to get all the cars in our database. In this posting we’ll look at the remaining CRUD (Create Review Update Delete) operations.

As you may remember, we created a controller named CarController. ASP.NET will strip off the word Controller, leaving us with Car, which we will use to access the endpoints of our API.

An endpoint is just a URL that takes us to the operation we want.

We looked at GetAll, let’s take a look at Get. In this case, we have an id for the car we want, but we want all the details of that car. Simple!

First we need a method in our controller:

[HttpGet("{id}")]
public async Task<ActionResult<Car>> Get(int id)
{
   var car = await _carRepository.Get(id);
   if (car == null)
   {
      return NotFound();
   }
   return car;
}


Notice that next to the HttpGet attribute we indicate that the endpoint will take the id of the car we want

[HttpGet("{id}")]

This means we need to modify the URL to access the endpoint by adding the actual id of the desired record.

The first thing we do is call the repository, passing in the id.

public async Task<Car?> Get(int id)
{
   var query = "select * from car where id=@id";
   using var db = databaseConnectionFactory.GetConnection();
   return await db.QuerySingleOrDefaultAsync<Car>(query, new {id});
}

In the Get method of the repo we create our query, get our connection and execute the query returning the value we retrieved (if any). This is very close to what we did previously.

Back in the controller, we check to ensure that we received a Car. If not, we return NotFound which is a shorthand way of returning a 404 message. Otherwise we return the Car as a Json object. You can see this in Postman:

We’ll issue a Get command passing in the URL, ending with the id of the car we want (in this case 4)

 

 

 

Notice that we get back a 200, indicating success. In the body of the returned Json we get back all the details of the Car. (If you decide to use DTOs you can get whatever subset of the information makes sense):

{
    “id”: 4,
    “name”: “subaru impreza”,
    “mpg”: “16”,
    “cylinders”: “8”,
    “displacement”: “304”,
    “horsepower”: “150”,
    “weight”: “3433”,
    “acceleration”: “12”,
    “model_year”: “22”,
    “origin”: “usa”,
    “is_deleted”: “0”
}

Post

Adding a Car to the database is quite similar. We need a method in the controller and one in the repo. Here is the controller method:

[HttpPost]
public async Task<ActionResult<Car>> Post([FromBody] Car car)
{
   try
   {
      car = await _carService.Insert(car);
   }
   catch (Exception e)
   {
      return BadRequest(e); 
   }

   return CreatedAtAction(nameof(Get), new { id = car.Id }, car);
}

Look at the attribute in the parameter ([FromBody]. This indicates to the API that the data needed to insert this Car will be in the body of the call. The alternative is FromQuery. You can, in fact, use both in one call.

Note: CreatedAction causes a return code of 201, which is what we want. Here’s the body we’ll insert:

{
        “name”: “chevrolet chevelle malibu”,
        “mpg”: “18”,
        “cylinders”: “8”,
        “displacement”: “307”,
        “horsepower”: “130”,
        “weight”: “3504”,
        “acceleration”: “12”,
        “model_year”: “70”,
        “origin”: “usa”,
        “is_deleted”: “0”
    }

When we click Send this data is sent to the API which returns 201 (created) and in the body of the returned data we see the new id assigned to this car

{
    “id”: 409,
    “name”: “chevrolet chevelle malibu”,
    “mpg”: “18”,
    “cylinders”: “8”,
    “displacement”: “307”,
    “horsepower”: “130”,
    “weight”: “3504”,
    “acceleration”: “12”,
    “model_year”: “70”,
    “origin”: “usa”,
    “is_deleted”: “0”
}

Service Class

Notice that this time, instead of calling the Repo directly, the method in the controller calls into a service class. A service class is a great way to get the logic out of the controller, where it does not belong, without putting it into the repo, where it also does not belong.

Here’s the top of the CarService

public class CarService : ICarService
{
   private readonly ICarRepository _carRepository;

   public CarService(ICarRepository carRepository)
   {
      _carRepository = carRepository;
   }

   public async Task<Car> Insert(Car car)
   {
      var newId = await _carRepository.UpsertAsync(car);
      if (newId > 0)
      {
         car.Id = newId;
      }
      else
      {
         throw new Exception("Failed to insert car");
      }
   return car;
   }

All the logic associated with this insert (e.g., making sure we get back a legitimate id from the repository, etc.) is encapsulated in the service.

This leaves the repository free to just talk to the database,

public async Task<int> UpsertAsync(Car car)
{
using var db = databaseConnectionFactory.GetConnection();
var sql = @"
DECLARE @InsertedRows AS TABLE (Id int);
MERGE INTO Car AS target
USING (SELECT @Id AS Id, @Name AS Name, @Model_Year AS Model_Year, 
@Is_Deleted AS Is_Deleted, @Origin AS origin ) AS source 
ON target.Id = source.Id
WHEN MATCHED THEN 
UPDATE SET 
Name = source.Name, 
Model_Year = source.Model_Year, 
Is_Deleted = source.Is_Deleted,
Origin = source.Origin
WHEN NOT MATCHED THEN
INSERT (Name, Model_Year, Is_Deleted, Origin)
VALUES (source.Name, source.Model_Year, 
source.Is_Deleted, source.Origin)
OUTPUT inserted.Id INTO @InsertedRows
;

SELECT Id FROM @InsertedRows;
";

var newId = await db.QuerySingleOrDefaultAsync<int>(sql, car);
return newId == 0 ? car.Id : newId;
}

Rather than having an insert and an update method, we combine that logic into this upsert method. This is a common idiom for database manipulation.

Note: to make this work, be sure to fill in all the fields for a car (or at least as many as you want to have in the Database.

Delete

As noted earlier, we will implement a soft delete; that is, rather than actually removing the data from the database, we’ll just set the is_deleted column to true. This allows us to reverse the action, and make the row not-deleted by simply changing that value to false.

[HttpDelete(“{id}”)]
public async Task<IActionResult> Delete(int id)
{
try
{
await _carService.Delete(id);
}
catch (Exception e)
{
return BadRequest(e);
}
return NoContent();
}

As you would expect, the endpoint takes an id (the id of the car we want to delete). The controller then hands that off to the service, which calls the repository which, in turn, marks that id as deleted:

public async Task<int> DeleteAsync(int id)
{
   using var db = databaseConnectionFactory.GetConnection();
   var query = "UPDATE car SET Is_Deleted = 1 WHERE Id = @Id";
   return await db.ExecuteAsync(query, new { Id = id });
}

If you are comfortable with SQL none of this will be very surprising. The key walkaway is:

Summary

In this post we saw that endpoints are just URLs with (potentially) data in the body of the request. The controller handles the URL and in our case passes the id or other data to the service. The service handles the (business) logic and then delegates talking to the database to the repository.

Book

This posting is excerpted from my forthcoming book Building APIs with .NET and C# to be released next year by Packt.

Unknown's avatar

About Jesse Liberty

** Note ** Jesse is currently looking for a new position. You can learn more about him at https://jesseliberty.bio Thank you. Jesse Liberty has three decades of experience writing and delivering software projects and is the author of 2 dozen books and a couple dozen online courses. His latest book, Building APIs with .NET, is now available wherever you buy your books. Liberty was a Team Lead and Senior Software Engineer for various corporations, a Senior Technical Evangelist for Microsoft, a Distinguished Software Engineer for AT&T, a VP for Information Services for Citibank and a Software Architect for PBS. He is a 13 year Microsoft MVP.
This entry was posted in Essentials. Bookmark the permalink.

2,765 Responses to .NET APIs Part 5 – All the CRUD APIs

  1. Kevinvinge's avatar Kevinvinge says:

    parasite infection medication: trusted ivermectin pharmacy – trusted ivermectin pharmacy

  2. Kevinvinge's avatar Kevinvinge says:

    fast delivery amoxicillin usa: bacterial infection medication – amoxicillin capsules online

  3. Kevinvinge's avatar Kevinvinge says:

    stromectol delivery united states: trusted ivermectin pharmacy – ivermectin tablets online

  4. Kevinvinge's avatar Kevinvinge says:

    amoxil 500mg tablets usa: amoxicillin capsules online – bacterial infection medication

  5. Kevinvinge's avatar Kevinvinge says:

    amoxicillin capsules online: generic amoxicillin online – trusted antibiotic pharmacy usa

  6. Kevinvinge's avatar Kevinvinge says:

    stromectol south africa: trusted ivermectin pharmacy – Stromectol

  7. Kevinvinge's avatar Kevinvinge says:

    cost of prednisone tablets: corticosteroid medication online – prednisone online india

  8. Kevinvinge's avatar Kevinvinge says:

    ivermectin oral tablets usa: stromectol delivery united states – Stromectol

  9. JeffreyRuize's avatar JeffreyRuize says:

    BorderValue RX: BorderValueRX – mexico border medications usa access

  10. JeffreyRuize's avatar JeffreyRuize says:

    buying from canadian pharmacies: verified india drug manufacturers – reputable canadian online pharmacies

  11. Jameslen's avatar Jameslen says:

    https://trustedindiacarerx.com/# canadian pharmacy near me

  12. DanielCeree's avatar DanielCeree says:

    pharmacy orlando: india medication delivery to usa – online pharmacy china

  13. DanielCeree's avatar DanielCeree says:

    buying drugs from canada: trusted indian pharmacy usa – canada pharmacy 24h

  14. JamesHEPLY's avatar JamesHEPLY says:

    https://bordervaluerx.com/# affordable border pharmacy mexico

  15. vergo tech's avatar vergo tech says:

    WOW just what I was searching for. Came here by searching for technology

  16. Jameslen's avatar Jameslen says:

    https://trustedindiacarerx.com/# legit mexican pharmacy

  17. DanielCeree's avatar DanielCeree says:

    canadian pharmacy drugs online: canadian medication delivery to usa – certified canadian pharmacy usa

  18. DanielCeree's avatar DanielCeree says:

    canadian medication delivery to usa: certified canadian pharmacy usa – canadian pharmacy uk delivery

  19. JeffreyRuize's avatar JeffreyRuize says:

    certified canadian pharmacy usa: trustworthy canadian pharmacy – canadian medication delivery to usa

  20. JamesHEPLY's avatar JamesHEPLY says:

    https://certifiedmaplerx.shop/# licensed canadian drug suppliers

  21. Jameslen's avatar Jameslen says:

    https://certifiedmaplerx.com/# medication canadian pharmacy

  22. Hey! I know this is somewhat off topic but I was wondering which blog platform are
    you using for this website? I’m getting fed up of WordPress because I’ve had problems with hackers and I’m looking at options for another platform.
    I would be fantastic if you could point me in the direction of a good platform.

  23. DanielCeree's avatar DanielCeree says:

    BorderValue RX: BorderValue RX – pharmacies in mexico

  24. esportenet's avatar esportenet says:

    Howdy, There’s no doubt that your site might be having browser compatibility issues. Whenever I look at your website in Safari, it looks fine however, if opening in I.E., it’s got some overlapping issues. I simply wanted to give you a quick heads up! Apart from that, fantastic site!

  25. moverbet's avatar moverbet says:

    After looking into a number of the articles on your web site, I honestly appreciate your way of blogging. I added it to my bookmark webpage list and will be checking back in the near future. Please visit my website as well and let me know how you feel.

  26. DanielCeree's avatar DanielCeree says:

    CertifiedMaple RX: canadian pharmacies – canadian medication delivery to usa

  27. DanielCeree's avatar DanielCeree says:

    pharmacy discount coupons: trusted indian pharmacy usa – rx pharmacy no prescription

  28. ダッチワイフ 激安 ここに素晴らしいブログがあります!また、あなたのサイトは非常に速くロードされます!どのウェブホストを使用していますか?

  29. DanielCeree's avatar DanielCeree says:

    legit online pharmacy: india medication delivery to usa – canadian pharmacy

  30. JeffreyRuize's avatar JeffreyRuize says:

    canadian medication delivery to usa: online canadian pharmacy review – buy canadian drugs

  31. Jameslen's avatar Jameslen says:

    https://trustedindiacarerx.shop/# online pharmacy australia

  32. DanielCeree's avatar DanielCeree says:

    canadian pharmacy levitra: india medication delivery to usa – canadian pharmacy online reviews

  33. DanielCeree's avatar DanielCeree says:

    certified canadian pharmacy usa: trustworthy canadian pharmacy – certified canadian pharmacy usa

  34. DanielCeree's avatar DanielCeree says:

    CertifiedMaple RX: canadian pharmacy ltd – canadianpharmacyworld com

  35. DanielCeree's avatar DanielCeree says:

    mexico border medications usa access: BorderValue RX – BorderValue RX

  36. OLanepiliA's avatar OLanepiliA says:

    Wonderful, what a blog it is! This website provides helpful information to us, keep it up.
    adult xxx video porn site xxx sex video

  37. DanielCeree's avatar DanielCeree says:

    pharmacia mexico: affordable border pharmacy mexico – affordable border pharmacy mexico

  38. DanielCeree's avatar DanielCeree says:

    medication in mexico: BorderValue RX – BorderValue RX

  39. mood gummies's avatar mood gummies says:

    The CBD aggregation – mood gummies offers a variety of formats that fill someone’s needs other preferences, and each undivided feels grandly executed. The oil appears dry-clean and consistent, the packaging materials discern sturdy, and the connivance is unostentatious besides elegant. The products are quiet to assemble and go with, thanks to obvious lids and thick sizing. Total, the brand delivers a polished and carefully crafted feel without unrequired extras.

  40. Edwardcom's avatar Edwardcom says:

    https://primeindiameds.com/# canadian pharmacy tampa

  41. Matthewjap's avatar Matthewjap says:

    BorderCare RX: mexican pharmacy – mexican pharmacies no prescription

  42. Michaelblide's avatar Michaelblide says:

    recommended canadian pharmacies: NorthCareRx – NorthCareRx

  43. Michaelblide's avatar Michaelblide says:

    best canadian pharmacy to order from: reputable indian online pharmacy – canadian pharmacy phone number

  44. Matthewjap's avatar Matthewjap says:

    canada drugs: Prime India Meds – canadianpharmacy com

  45. Michaelblide's avatar Michaelblide says:

    pharmacy canadian: cheapest online pharmacy india – canada drug pharmacy

  46. Michaelblide's avatar Michaelblide says:

    canadian pharmacy world: NorthCareRx – NorthCareRx

Leave a Reply

Your email address will not be published. Required fields are marked *