.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. GregorySar's avatar GregorySar says:

    активация 1С CRM для бизнеса Нс Диджитал Франчайзинг 1С Бухалтерия, продажа и разработка продуктов 1с

  2. serviceMuh's avatar serviceMuh says:

    Ваше устройство не работает. С этой проблемой вам нужно обратиться в специализированный сервисный центр, прочитайте этот гайд если симптомы подвердились из этого списко то, смело сдавайте в сервис на диагностику

  3. DichaelAlono's avatar DichaelAlono says:

    Can I just say what a relief to discover an individual who actually knows what they are discussing on the net. You certainly know how to bring a problem to light and make it important. More and more people must look at this and understand this side of your story. I was surprised that you aren’t more popular given that you surely have the gift.

  4. DanielGof's avatar DanielGof says:

    Капельницы при выводе из запоя — основной инструмент детоксикации. Они очищают кровь, стабилизируют давление и восстанавливают баланс электролитов. В клинике «РеабКузбасс» используются только качественные препараты, адаптированные под конкретное состояние пациента. Ниже приведена таблица с основными видами капельниц и их эффектом.
    Получить больше информации – вывод из запоя капельница в новокузнецке

  5. LewisGor's avatar LewisGor says:

    I’m gone to inform my little brother, that he should also pay a quick visit this webpage on regular basis to obtain updated from latest news.
    https://air888slot.co/melbet-obzor-bukmekerskoy-kontory-2025/

  6. Robfut's avatar Robfut says:

    Услуги ремонт автомобиля https://auto-5-box.ru/remont-avto-spb.html с высоким качеством и вниманием к деталям. Ремонт авто СПб : кузовные и технические работы, замена агрегатов, обслуживание всех брендов. Надёжный сервис рядом.

  7. Excellent insights, really appreciate the detailed explanation.

  8. ashi2ews8's avatar ashi2ews8 says:

    WHAT A VERY NICE AND WONDERFUL POST THAT I READ FOR TODAY, THIS IS SO VERY GREAT, THANKS!
    토토사이트 모음

  9. serviceMuh's avatar serviceMuh says:

    Ваше устройство не работает. С этой проблемой вам нужно обратиться в специализированный сервисный центр, прочитайте этот гайд если симптомы подвердились из этого списко то, смело сдавайте в сервис на диагностику

  10. Timsothybioli's avatar Timsothybioli says:

    Pretty section of content. I just stumbled upon your weblog and in accession capital to assert that I acquire in fact enjoyed account your blog posts. Any way I’ll be subscribing to your augment and even I achievement you access consistently quickly.
    https://www.bluefinchmedical.com/?p=62899

  11. Angels Bail Bonds Costa Mesa
    769 Bakdr Ѕt,
    Costa Mesa, ⅭА 92626, United Stаtes
    how to pay off bail bonds

  12. serviceMuh's avatar serviceMuh says:

    Ваше устройство не работает. С этой проблемой вам нужно обратиться в специализированный сервисный центр, прочитайте этот гайд если симптомы подвердились из этого списко то, смело сдавайте в сервис на диагностику

  13. linkHep's avatar linkHep says:

    Ищете надёжное сервис перевозок для путешествия по городу или за его пределы? Инновационные платформы позволяют заказать транспорт в пару кликов — через приложение или по телефону. Автомобиль подъезжает без задержек, шофёр — вежливый и профессиональный, а цена поездки понятна и не меняется. Обслуживание 24/7, оплата подходящим способом, возможность выбрать категорию машины — от эконома до бизнес-категории. Идеально подходит как для повседневных перемещений, так и для междугородних путешествий. Делитесь своим впечатлениями — какие компании считаете лучшими, а с какими лучше избегать?
    https://bdolife.ru/kak-dobratsya-do-lyuboj-tochki-sovety-po-marshrutam-i-nadyozhnomu-transferu/

  14. linkHep's avatar linkHep says:

    Ищете доверенное трансфер для рейса внутри населённого пункта или в другой город? Современные платформы позволяют заказать транспорт одним нажатием — через приложение или по телефону. Транспорт прибывает без задержек, водитель — вежливый и опытный, а тариф рейса ясна и фиксирована. Обслуживание 24/7, оплата гибким методом, возможность выбрать тип транспорта — от эконом-тарифа до премиум-класса. Идеально подходит как для повседневных рейсов, так и для межгородних путешествий. Делитесь своим впечатлениями — какие компании советуете, а с какими лучше избегать?
    https://aviator4-64.ru/uslugi-taksi-mineralnye-vody-aeroport-udobstvo-i-nadezhnost/

  15. serviceMuh's avatar serviceMuh says:

    Ваше устройство не работает. С этой проблемой вам нужно обратиться в специализированный сервисный центр, прочитайте этот гайд если симптомы подвердились из этого списко то, смело сдавайте в сервис на диагностику

  16. Dosi Cheesecake strain
    It’s really a great and useful piece of info. Thank you for sharing. Keep it up!

  17. 7zx5f.icu's avatar 7zx5f.icu says:

    Appreciate the content you put out! https://3nz9f.icu/

  18. [url=https://herbapproach.com/product/black-diamond-strain-thc-level/]black diamond strain thc level[/url]
    Very informative blog, highly recommended

  19. island pink kush leafly
    Thank you for this article. I like the way you categorized the blogs. A really nice piece.

  20. GregorySar's avatar GregorySar says:

    качественная разработка Bitrix интернет магазин с адаптивным дизайном Нс Диджитал Профессиональная разработка сайтов и интернет магазинов на 1с Битрикс Seo продвижение под ключ с использованием AI

  21. Spravkicwu's avatar Spravkicwu says:

    Для быстрого выполнения задач в коммунальном секторе — https://avtosturman.ru компания AvtoSpetsResurs осуществляет спецтехнику в аренду: автовышки, грузоподъёмные краны, экскаваторы, вывозные машины, планировщики и многое другое. Наши машины используются для уличного освещения, снегоуборки, транспортировки строительных материалов, строительного песка или топлива в местные и удалённые участки. [url=https://avtosturman.ru]https://avtosturman.ru[/url] Подробности — услуги спецтехники представлена на портале.

  22. traHep's avatar traHep says:

    Трансфер — это не просто решение переместиться, а предсказуемое сопровождение в пути для тех, кто ставит во главу угла своё спокойствие.

    **Фиксированная и выгодная стоимость трансфера — никаких сюрпризов!** Вы оплачиваете ровно ту сумму, которая была обозначена при бронировании — без непредвиденных расходов.

    Платформа работает круглосуточно, предлагая незамедлительный выезд. Пробки — больше не ваша забота.

    Вы можете отслеживать положение машины в живом режиме, заранее ознакомиться профиль водителя и назначать подходящий уровень средства передвижения — от эконома до премиума.

    Оформляйте вовремя — и вы минимизируете стресса. Это наилучшим образом подходит для путешествий в терминал, на деловые встречи, к знакомым или просто для лёгкого путешествия.

    Безопасность, честность и внимание к деталям — вот что делает ваш трансфер по-настоящему незабываемым.

  23. Stephenining's avatar Stephenining says:

    Комплексное применение этих средств ускоряет процесс восстановления.
    Изучить вопрос глубже – нарколог на дом вывод из запоя санкт-петербург

  24. Countertop's avatar Countertop says:

    Cabinet IQ Austin
    2419 S Bell Blvd, Cedar Park,
    TX 78613, United Ѕtates
    +12543183528
    Countertop

  25. Southeastt Financial Nashville
    131 Belle Forest Cirr #210,
    Nashville, TN 37221, United Ѕtates
    18669008949
    NADA motorcycle value

  26. gelenNaf's avatar gelenNaf says:

    Сервис функционирует круглосуточно, гарантируя быстрый выезд. Вам не нужно волноваться о задержках — специалист примет во внимание все условия перемещения.
    Вы можете следить за местоположение средства передвижения в живом режиме, заранее изучить характеристики специалиста и забронировать оптимальный тип транспорта — от минималки до люкса.
    Оформляйте заранее — и вы избежите ожидания. Это идеально подходит для поездок в вокзал, на мероприятия, к партнёрам или просто для комфортного перемещения.
    Пунктуальность, открытость и забота — вот что делает ваш трансфер по-настоящему выгодным.

  27. Betflix168's avatar Betflix168 says:

    Howdy I am so excited I found your site, I really found you by error, while I was looking on Askjeeve for
    something else, Nonetheless I am here now and would just like to say many thanks for a marvelous post and a all round exciting blog (I also
    love the theme/design), I don’t have time to
    go through it all at the minute but I have bookmarked it
    and also added in your RSS feeds, so when I have
    time I will be back to read a lot more, Please do keep up the fantastic b.

  28. Timsothybioli's avatar Timsothybioli says:

    Hi, I think your site might be having browser compatibility issues. When I look at your blog site in Chrome, it looks fine but when opening in Internet Explorer, it has some overlapping. I just wanted to give you a quick heads up! Other then that, superb blog!
    directory of female escorts in Brazil

  29. serviceMuh's avatar serviceMuh says:

    Устройство сломано. С такой поломкой вам необходимо обратиться в специализированный сервисный центр, прочитайте этот документ по сдаче устройства если в списке проблем ничего не помогло, смело сдавайте в сервис на диагностику

  30. serviceMuh's avatar serviceMuh says:

    Устройство сломано. С такой поломкой вам необходимо обратиться в специализированный сервисный центр, прочитайте этот гайд если в списке проблем ничего не помогло, смело сдавайте в сервис на диагностику

  31. Илона's avatar Илона says:

    Креативная команда копирайтеров предлагает услугах профессионального копирайтинга.
    Наша команда разрабатываем уникальные тексты для сайтов для компаний.
    Любой материал создается с учетом ключевых слов, с целью максимального роста позиций в поиске.
    Хотите заказать копирайтинг для сайта по доступной цене.
    Свяжитесь с нами https://1url.cz/IJS6T, и мы поможем продающие материалы для вашего бизнеса.

  32. serviceMuh's avatar serviceMuh says:

    С такой поломкой вам только в сервисном центре скажут, что случилось или если вы разбираетесь в поломках прочтите здесь но лучше всего сдайте на аудит устройство, это бесплатно

  33. serviceMuh's avatar serviceMuh says:

    С такой поломкой вам необходимо обратиться в специализированный сервисный центр, прочитайте этот гайд если в списке проблем ничего не помогло, смело сдавайте

  34. adlerNaf's avatar adlerNaf says:

    Вызов шашечки — это удобное и проверенное способ для комфортных поездок в любое момент ночи. Вам не нужно искать готовые транспорт на остановке или стоять в холод. Достаточно отправить вызов через программу или по линии, и шофёр появится точно в указанное время.
    https://taxi-aeroport-adler.ru/vityazevo
    Текущиеоператоры обеспечивают чёткие цены, установленную сумму без дополнительных начислений и возможность расчёта как бумажными купюрами, так и картой.
    Вы можете следить маршрут транспорта в онлайн, заранее видеть информацию таксиста и определять соответствующий уровень транспорта — от эконома до бизнеса.
    Особенно практично резервировать перевозку заранее: вы обеспечиваете себе средство передвижения к нужному времени, уходите от паники и беспокойства.
    Это лучший выбор для перемещений в терминал, на мероприятия, в гости или просто по локации.
    Стабильность, дисциплина и расслабленность — всё это делает бронирование такси ключевым в быту.

  35. Terrypob's avatar Terrypob says:

    I’ve been using https://www.nothingbuthemp.net/collections/thca-products regular in regard to over a month at the moment, and I’m indeed impressed at near the sure effects. They’ve helped me feel calmer, more balanced, and less restless in every nook the day. My saw wood is deeper, I wake up refreshed, and sober my focus has improved. The value is distinguished, and I cherish the sensible ingredients. I’ll obviously carry on buying and recommending them to person I know!

  36. OLanepiliA's avatar OLanepiliA says:

    Hey there I am so glad I found your site, I really found you by accident, while I was searching on Bing for something else, Nonetheless I am here now and would just like to say thanks for a incredible post and a all round interesting blog (I also love the theme/design), I don’t have time to look over it all at the minute but I have saved it and also included your RSS feeds, so when I have time I will be back to read more, Please do keep up the awesome work.
    Brasilia independent escorts

  37. serviceMuh's avatar serviceMuh says:

    Телевизор JVC «не включается» или картинка «дрожит»? В статья — про блок питания, плату и как сбросить без пульта

  38. DichaelAlono's avatar DichaelAlono says:

    Howdy! I know this is somewhat off-topic however I had to ask. Does running a well-established website like yours require a large amount of work? I am completely new to operating a blog however I do write in my journal on a daily basis. I’d like to start a blog so I will be able to share my personal experience and thoughts online. Please let me know if you have any ideas or tips for new aspiring blog owners. Appreciate it!
    https://gollos.com.ua/fary-khameleony-yak-zovnishnie-osvitlennya.html

  39. serviceMuh's avatar serviceMuh says:

    Робот iLife не включается? В статья — про АКБ, плату и как «оживить» без прошивки

  40. Fobertnap's avatar Fobertnap says:

    Attractive component to content. I just stumbled upon your website and in accession capital to assert that I get in fact enjoyed account your weblog posts. Any way I will be subscribing on your feeds and even I achievement you get admission to constantly rapidly.
    Find Female Escorts Brazil

  41. CIR Legal Lexington
    201 Ꮤ Short St #500,
    Lexington, KY 40507, United Statеѕ
    +18596366803
    lawyers in love lyrics

  42. serviceMuh's avatar serviceMuh says:

    Тепловизоры Fortuna — замена и ремонт — в статья

  43. Prompt2Tool's avatar Prompt2Tool says:

    This article is a goldmine of information. Thank you for your generosity in sharing!

  44. serviceMuh's avatar serviceMuh says:

    Техника Casio (часы, пианино, проекторы) — ремонт в статье от сервисный центр

  45. Spravkiaei's avatar Spravkiaei says:

    Подбираете справки через интернет без ожидания и проблем? На сайте https://z32-med.ru подлинную справку можно заказать за один день — от документов для бассейна, детского лагеря и ВУЗа до формы 095/у, справки 086/у, КЭК-заключений и обследований. Многолетняя практика, сотрудничество с медучреждениями, и оформление на оригинальных бланках обеспечивают безопасность и официальный статус. Приятные расценки, полный спектр услуг и доставка по Москве. Все детали — медсправка без очередей, оформление за день, официальные справки.

  46. XRumerTest's avatar XRumerTest says:

    Hello. And Bye.

  47. Spravkivjv's avatar Spravkivjv says:

    Узнайте подробнее о плюсах взаимодействия с компанией — стабильность, качество и широкий выбор решений! Посетите https://tdstyling.ru и просмотрите предложения, контакты, а также публикации. Планируете партнёрство — эта организация гарантирует тематические ссылки, гибкие условия и доступные цены.

  48. Spravkieuw's avatar Spravkieuw says:

    Узнайте всю информацию об автосервисе Talisman-Avto в городе Симферополь — профессиональный сервис, оперативная диагностика и прямые поставки запчастей. Зайдите на https://talisman-avto.ru/ и ознакомьтесь услуги. Ищете срочный ремонт? — компания предлагает быстрое устранение проблем, установку ГБО и удобное обслуживание. Требуется надёжный ремонт — здесь найдёте профессиональные решения и ответственный подход, без лишних затрат.

  49. Spravkingd's avatar Spravkingd says:

    Для обладателей Mercedes, выбирающих качество и удобство — специализированный автотехцентр предлагает широкий набор услуг: механический и кузовной ремонт, диагностику, инсталляцию Webasto, ГБО и многое другое. https://specavtoimport.ru Профессиональные автомеханики обслуживают на сертифицированном станках, используя фирменные материалы и гарантируя страховку и индивидуальный сервис. Ознакомьтесь с деталями — сервис Mercedes готов помочь на ресурсе.

Leave a Reply

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