.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

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 is a Senior SW Engineer for CNH and he was 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 Microsoft MVP.
This entry was posted in Essentials. Bookmark the permalink.

1,553 Responses to .NET APIs Part 5 – All the CRUD APIs

  1. RobertTup's avatar RobertTup says:

    Для наглядности ниже приведена таблица с основными направлениями медикаментозной терапии и их эффектами:
    Получить дополнительные сведения – наркологическая клиника стационар

  2. Bernardemuri's avatar Bernardemuri says:

    Сочетание медицинских и психотерапевтических мер создаёт устойчивую систему поддержки. Пациенты получают возможность постепенно восстановить утраченное здоровье и психологическую стабильность.
    Подробнее тут – наркологическая клиника наркологический центр

  3. Charlesnah's avatar Charlesnah says:

    Эта информационная заметка содержит увлекательные сведения, которые могут вас удивить! Мы собрали интересные факты, которые сделают вашу жизнь ярче и полнее. Узнайте нечто новое о привычных аспектах повседневности и откройте для себя удивительный мир информации.
    Всё, что нужно знать – https://yaello.com/2024/07/03/hello-world

  4. JulianALera's avatar JulianALera says:

    Статья знакомит с важнейшими моментами, которые сформировали наше общество. От великих изобретений до культурных переворотов — вы узнаете, как прошлое влияет на наше мышление, технологии и образ жизни.
    Как это работает — подробно – https://phhenv.co.uk/working

  5. Charlesnah's avatar Charlesnah says:

    Эта публикация дает возможность задействовать различные источники информации и представить их в удобной форме. Читатели смогут быстро найти нужные данные и получить ответы на интересующие их вопросы. Мы стремимся к четкости и доступности материала для всех!
    Рассмотреть проблему всесторонне – https://aspiringthought.com/7-different-sorts-of-travel

  6. JulianALera's avatar JulianALera says:

    Эта статья полна интересного контента, который побудит вас исследовать новые горизонты. Мы собрали полезные факты и удивительные истории, которые обогащают ваше понимание темы. Читайте, погружайтесь в детали и наслаждайтесь процессом изучения!
    Читать далее > – https://phhenv.co.uk/working

  7. MichaelBal's avatar MichaelBal says:

    Эта статья для ознакомления предлагает читателям общее представление об актуальной теме. Мы стремимся представить ключевые факты и идеи, которые помогут читателям получить представление о предмете и решить, стоит ли углубляться в изучение.
    Нажми и узнай всё – https://libramarketing.co.uk/2020/02/09/why-content-marketing-is-king

  8. CharlieRuish's avatar CharlieRuish says:

    В этом информативном тексте представлены захватывающие события и факты, которые заставят вас задуматься. Мы обращаем внимание на важные моменты, которые часто остаются незамеченными, и предлагаем новые перспективы на привычные вещи. Подготовьтесь к тому, чтобы быть поглощенным увлекательными рассказами!
    Читать далее > – https://nicolas-olano-boutique.com/le-guide-du-chino

  9. Bentondib's avatar Bentondib says:

    Этот информационный материал собраны данные, которые помогут лучше понять текущие тенденции и процессы в различных сферах жизни. Мы предоставляем четкий анализ, графики и примеры, чтобы информация была не только понятной, но и практичной для принятия решений.
    Подробности по ссылке – https://videoteach.eu/es/2023/08/02/2-boletin-de-videoteach

  10. MichaelBal's avatar MichaelBal says:

    Эта информационная статья охватывает широкий спектр актуальных тем и вопросов. Мы стремимся осветить ключевые факты и события с ясностью и простотой, чтобы каждый читатель мог извлечь из нее полезные знания и полезные инсайты.
    Смотри, что ещё есть – https://empirestudio.pl/lorem-ipsum

  11. Bentondib's avatar Bentondib says:

    Этот текст призван помочь читателю расширить кругозор и получить практические знания. Мы используем простой язык, наглядные примеры и структурированное изложение, чтобы сделать обучение максимально эффективным и увлекательным.
    Слушай внимательно — тут важно – https://jeeda.gulfrdc.com/2024/11/21/hello-world

  12. Jamesobexy's avatar Jamesobexy says:

    Этот информационный материал привлекает внимание множеством интересных деталей и необычных ракурсов. Мы предлагаем уникальные взгляды на привычные вещи и рассматриваем вопросы, которые волнуют общество. Будьте в курсе актуальных тем и расширяйте свои знания!
    Выяснить больше – https://mppee.gob.ve/?p=86126

  13. игры с модами на русскоязычном сайте — это отличный способ изменить игровой опыт.
    Особенно если вы играете на мобильном устройстве
    с Android, модификации открывают перед вами большие перспективы.
    Я часто использую взломанные игры,
    чтобы удобнее проходить игру.

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

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

    Это делает каждый игровой процесс лучше контролируемым, а возможности практически широкие.

    Рекомендую попробовать такие модифицированные
    версии для Android — это может открыть новые горизонты

  14. vpn cost uk's avatar vpn cost uk says:

    Hey! I could have sworn I’ve been to this site before but
    after checking through some of the post I realized it’s new to me.
    Anyhow, I’m definitely happy I found it and I’ll be book-marking and checking back often!

  15. Stephenviaps's avatar Stephenviaps says:

    Right here is the right blog for anyone who wants to find out about this topic. You understand a whole lot its almost tough to argue with you (not that I personally will need to…HaHa). You certainly put a brand new spin on a subject that has been written about for a long time. Great stuff, just excellent!
    https://jamadvice.com.ua/kak-kupit-bong-v-ukraine-polnoe-rukovodstvo-po-vyboru-v-internet-magazine/

  16. Hmm, wha іѕ thіs thing? Noot reaⅼly suгe.

    Totqlly not reⅼated to anything. Αnyway lol.

    Also visit myy website :: dangerous site

  17. Timsothybioli's avatar Timsothybioli says:

    Hello! I know this is kinda off topic however , I’d figured I’d ask. Would you be interested in trading links or maybe guest authoring a blog article or vice-versa? My website covers a lot of the same topics as yours and I feel we could greatly benefit from each other. If you might be interested feel free to shoot me an email. I look forward to hearing from you! Excellent blog by the way!
    купить виртуальный номер

  18. Can you be more specific about the content of your article? After reading it, I still have some doubts. Hope you can help me.

  19. This post is worth everyone’s attention. Where can I find out more?

  20. serviceMuh's avatar serviceMuh says:

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

  21. Timsothybioli's avatar Timsothybioli says:

    WOW just what I was looking for. Came here by searching for %meta_keyword%
    зеркало Banda Casino

  22. ShanepiliA's avatar ShanepiliA says:

    This is the perfect site for everyone who would like to understand this topic. You realize so much its almost hard to argue with you (not that I personally will need to…HaHa). You certainly put a brand new spin on a subject which has been written about for ages. Great stuff, just great!
    регистрация leebet casino

  23. OLanepiliA's avatar OLanepiliA says:

    Why users still use to read news papers when in this technological world the whole thing is existing on web?
    зеркало зума казино

  24. IsmaelNiz's avatar IsmaelNiz says:

    This site really has all the information I needed about this subject and didn’t know who to ask.
    ant-group.ru

  25. LhanepiliA's avatar LhanepiliA says:

    Cactus Casino — современная площадка для азартных игр
    Любители азартных развлечений могут играть в казино Кактус на удобной и надежной платформе, которая сочетает стильный интерфейс, широкий ассортимент игр и быстрые выплаты. Сайт предлагает сотни популярных слотов, карточные и настольные игры, а также live-раздел с реальными дилерами, что делает игровой процесс живым и увлекательным.
    Пользователи отмечают простоту регистрации и мгновенный доступ к играм, что особенно удобно для новичков, а опытные игроки ценят стабильность работы и разнообразие развлечений.
    Бонусы казино и акции
    Одним из ключевых преимуществ платформы являются бонусы казино, которые стимулируют активность игроков и увеличивают возможности для выигрыша.
    • Приветственный пакет — до 80 000 рублей и 125 фриспинов в слоте Fortune of Giza;
    • Промокоды для дополнительных бесплатных вращений;
    • Система лояльности и регулярные турниры для постоянных участников.
    Бонусная программа позволяет дольше наслаждаться слотами и другими играми, а также экономнее расходовать средства на игровой баланс.
    Разнообразие игр и провайдеры
    Cactus Casino https://kaktus-kazino.com сотрудничает с ведущими разработчиками: Pragmatic Play, BGaming, Wazdan, Spinomenal и Evoplay. Среди предложений:
    • Классические и современные видеослоты;
    • Автоматы с функцией Megaways;
    • Карточные и настольные игры (блэкджек, баккара, рулетка);
    • Live-шоу с настоящими ведущими;
    • Прогрессивные джекпоты и эксклюзивные слоты.
    Такой выбор позволяет каждому найти развлечение по вкусу и играть в слоты онлайн в безопасной и комфортной среде.

    Пополнение счета и вывод средств
    Платформа поддерживает различные способы оплаты:
    1. СБП и Piastrix;
    2. Банковские карты и Apple Pay/Google Pay;
    3. Криптовалюты и FK Wallet;
    4. Binance и другие электронные кошельки.
    Минимальный депозит — от 350 рублей, минимальная сумма вывода — 1000 рублей. Большинство платежей обрабатывается в течение часа, что обеспечивает высокий уровень доверия со стороны пользователей.

    Безопасность и лицензия
    Cactus Casino работает по международной лицензии, что гарантирует честность игр и защиту личных данных. Все финансовые операции проходят шифрование, а результаты слотов и настольных игр проверяются сертифицированными провайдерами.

    Итог: почему стоит выбрать Cactus Casino
    Платформа сочетает надежность, комфорт и разнообразие развлечений. Простая регистрация, прозрачные условия бонусов, быстрые выплаты и широкий ассортимент слотов делают Cactus Casino привлекательным вариантом как для новичков, так и для опытных игроков.
    Если вы ищете площадку для безопасной и интересной игры, официальный сайт Cactus Casino позволит насладиться азартом и шансом на выигрыши без лишних сложностей.

  26. WilmerDut's avatar WilmerDut says:

    Эта обзорная заметка содержит ключевые моменты и факты по актуальным вопросам. Она поможет читателям быстро ориентироваться в теме и узнать о самых важных аспектах сегодня. Получите краткий курс по современной информации и оставайтесь в курсе событий!
    Получить полную информацию – https://wilddragon.net/my-favorite-song

  27. WilmerDut's avatar WilmerDut says:

    Этот информативный текст выделяется своими захватывающими аспектами, которые делают сложные темы доступными и понятными. Мы стремимся предложить читателям глубину знаний вместе с разнообразием интересных фактов. Откройте новые горизонты и развивайте свои способности познавать мир!
    Где можно узнать подробнее? – https://taiko-ist-takuya.jp/de/news-de/684

  28. It’s going to be finish of mine day, however before
    finish I am reading this enormous paragraph to improve my
    know-how.

  29. Thanks for some other informative blog. Where else could I am getting that kind of information written in such a perfect way?
    I’ve a challenge that I am just now operating on,
    and I’ve been at the look out for such information.

  30. RichardZew's avatar RichardZew says:

    Служба вывода из запоя на дому Stop-Alko в Екатеринбурге работает без перерывов, выезжает в любой район города, оказывает помощь с учётом всех медицинских стандартов.
    Узнать больше – вывод из запоя на дому круглосуточно в екатеринбурге

  31. LhanepiliA's avatar LhanepiliA says:

    I blog frequently and I truly thank you for your content. Your article has really peaked my interest. I’m going to take a note of your website and keep checking for new information about once a week. I opted in for your Feed as well.
    https://euro-house.com.ua/yak-unyknuty-problem-z-ochyshchennyam-stekla-na-fa.html

  32. MauriceMam's avatar MauriceMam says:

    Публикация предлагает читателю не просто информацию, а инструменты для анализа и саморазвития. Мы стимулируем критическое мышление, предлагая различные точки зрения и призывая к самостоятельному поиску решений.
    Всё, что нужно знать – https://parquedasfloreslins.com.br/2019/08/07/caso-medico-raro-na-cidade-de-lins-e-acompanhado-pelo-oftalmologista-dr-raul-goncalves-paula-no-hospital-de-olhos-de-bauru-desde-2013

  33. Die Wirkung von Hondrolife in Salzburg ist erstaunlich.

    Meine Schmerzen sind deutlich geringer.

  34. kraken onion's avatar kraken onion says:

    кракен зеркало

    Feel free to visit my blog; kraken onion

  35. EarnestCor's avatar EarnestCor says:

    Hello to all, because I am actually eager of reading this weblog’s post to be updated regularly. It carries pleasant data.
    staffinggoals.com

  36. serviceMuh's avatar serviceMuh says:

    Сломался и отключается без причины? Sony сервис просто оставь заказ на обратный звонок, и всё уточнят

  37. SheldonWEd's avatar SheldonWEd says:

    Эта информационная статья содержит полезные факты, советы и рекомендации, которые помогут вам быть в курсе последних тенденций и изменений в выбранной области. Материал составлен так, чтобы быть полезным и понятным каждому.
    Слушай внимательно — тут важно – https://jp-art.photography/portfolios/rocky-island

  38. Timsothybioli's avatar Timsothybioli says:

    Наша платформа https://probilets работает круглосуточно и не знает слова «перерыв». Бронировать и планировать можно где угодно: в поезде, на даче, в кафе или лежа на диване. Хотите купить билет, пока идёте по супермаркету? Просто достаньте телефон и оформите поездку. Нужно скорректировать планы, отменить или перенести билет? Это тоже можно сделать онлайн, без звонков и визитов.

  39. Do you have any video of that? I’d like to find out some additional
    information.

  40. Iyannazem's avatar Iyannazem says:

    официальный сайт ПокерОК
    ПокерОК

  41. What i don’t realize is in truth how you’re no longer really a lot more neatly-liked than you may be now.
    You are very intelligent. You know thus significantly in the case of this
    subject, produced me for my part consider it from numerous various angles.

    Its like men and women don’t seem to be
    fascinated until it’s something to do with Girl gaga!
    Your own stuffs outstanding. At all times take
    care of it up!

  42. LewisGor's avatar LewisGor says:

    Thanks for any other fantastic article. Where else could anyone get that type of information in such an ideal way of writing? I have a presentation subsequent week, and I am at the search for such info.
    казино banda

  43. Timsothybioli's avatar Timsothybioli says:

    WOW just what I was searching for. Came here by searching for %meta_keyword%
    lee bet регистрация

  44. Timothygep's avatar Timothygep says:

    Эта статья полна интересного контента, который побудит вас исследовать новые горизонты. Мы собрали полезные факты и удивительные истории, которые обогащают ваше понимание темы. Читайте, погружайтесь в детали и наслаждайтесь процессом изучения!
    Получить полную информацию – https://theentrepreneurbytes.com/rbi-governor-stands-firm-on-paytm-payments-bank-action-rules-out-reassessment

  45. RicardoLurge's avatar RicardoLurge says:

    В этой статье вы найдете уникальные исторические пересечения с научными открытиями. Каждый абзац — это шаг к пониманию того, как наука и события прошлого создают основу для технологического будущего.
    Прочитать подробнее – https://dancingstarslinedance.dk/galleri/billeder/soendagsdans-januar-2018

  46. RicardoLurge's avatar RicardoLurge says:

    В этой статье представлен занимательный и актуальный контент, который заставит вас задуматься. Мы обсуждаем насущные вопросы и проблемы, а также освещаем истории, которые вдохновляют на действия и изменения. Узнайте, что стоит за событиями нашего времени!
    Получить больше информации – https://choofercolombia.com/2022/12/21/club-membership-opitons

  47. Timsothybioli's avatar Timsothybioli says:

    Excellent post. Keep writing such kind of information on your site. Im really impressed by your blog.
    Hi there, You’ve performed a fantastic job. I will certainly digg it and in my opinion suggest to my friends. I am sure they’ll be benefited from this website.
    yagodka.info

  48. ShanepiliA's avatar ShanepiliA says:

    Useful info. Lucky me I discovered your website unintentionally, and I’m shocked why this coincidence didn’t came about in advance! I bookmarked it.
    сайт leebet casino

  49. GichardAmomi's avatar GichardAmomi says:

    Thanks for some other informative site. The place else may just I am getting that kind of info written in such a perfect method? I’ve a venture that I’m just now operating on, and I have been on the glance out for such information.
    официальный сайт зума казино

Leave a Reply

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