ASP.NET Tutorial – Create a Web API with ASP.NET Core and Visual Studio for Windows

This tutorial builds a web API for managing a list of “to-do” items. A user interface (UI) isn’t created.

The following diagram shows the basic design of the app.

  • The client is whatever consumes the web API (mobile app, browser, etc.). This tutorial doesn’t create a client. Postman or curl is used as the client to test the app.

  • model is an object that represents the data in the app. In this case, the only model is a to-do item. Models are represented as C# classes, also known as Plain Old CLR Object (POCOs).
  • controller is an object that handles HTTP requests and creates the HTTP response. This app has a single controller.
  • To keep the tutorial simple, the app doesn’t use a persistent database. The sample app stores to-do items in an in-memory database.

Create the project

Follow these steps in Visual Studio:

  • From the File menu, select New > Project.
  • Select the ASP.NET Core Web Application template. Name the project TodoApi and click OK.
  • In the New ASP.NET Core Web Application – TodoApi dialog, choose the ASP.NET Core version. Select the API template and click OK. Do not select Enable Docker Support.

Launch the app

In Visual Studio, press CTRL+F5 to launch the app. Visual Studio launches a browser and navigates to http://localhost:<port>/api/values, where <port> is a randomly chosen port number. Chrome, Microsoft Edge, and Firefox display the following output:

JSON

If using Internet Explorer, you’ll be prompted to save a values.json file.

Add a model class

A model is an object representing the data in the app. In this case, the only model is a to-do item.

In Solution Explorer, right-click the project. Select Add > New Folder. Name the folder Models.

Note

The model classes can go anywhere in the project. The Models folder is used by convention for model classes.

In Solution Explorer, right-click the Models folder and select Add > Class. Name the class TodoItemand click Add.

Update the TodoItem class with the following code:

C#

The database generates the Id when a TodoItem is created.

Create the database context

The database context is the main class that coordinates Entity Framework functionality for a given data model. This class is created by deriving from the Microsoft.EntityFrameworkCore.DbContext class.

In Solution Explorer, right-click the Models folder and select Add > Class. Name the class TodoContext and click Add.

Replace the class with the following code:

C#

Register the database context

In this step, the database context is registered with the dependency injection container. Services (such as the DB context) that are registered with the dependency injection (DI) container are available to the controllers.

Register the DB context with the service container using the built-in support for dependency injection. Replace the contents of the Startup.cs file with the following code:

C#

The preceding code:

  • Removes the unused code.
  • Specifies an in-memory database is injected into the service container.

Add a controller

In Solution Explorer, right-click the Controllers folder. Select Add > New Item. In the Add New Itemdialog, select the API Controller Class template. Name the class TodoController, and click Add.

Replace the class with the following code:

C#

The preceding code defines an API controller class without methods. In the next sections, methods are added to implement the API. The class is annotated with an [ApiController] attribute to enable some convenient features. For information on features enabled by the attribute, see Annotate class with ApiControllerAttribute.

The controller’s constructor uses Dependency Injection to inject the database context (TodoContext) into the controller. The database context is used in each of the CRUD methods in the controller. The constructor adds an item to the in-memory database if one doesn’t exist.

Get to-do items

To get to-do items, add the following methods to the TodoController class:

C#

These methods implement the two GET methods:

  • GET /api/todo
  • GET /api/todo/{id}

Here’s a sample HTTP response for the GetAll method:

JSON

Later in the tutorial, I’ll show how the HTTP response can be viewed with Postman or curl.

Routing and URL paths

The [HttpGet] attribute denotes a method that responds to an HTTP GET request. The URL path for each method is constructed as follows:

  • Take the template string in the controller’s Route attribute:
C#

  • Replace [controller] with the name of the controller, which is the controller class name minus the “Controller” suffix. For this sample, the controller class name is TodoController and the root name is “todo”. ASP.NET Core routing is case insensitive.
  • If the [HttpGet] attribute has a route template (such as [HttpGet("/products")], append that to the path. This sample doesn’t use a template. For more information, see Attribute routing with Http[Verb] attributes.

In the following GetById method, "{id}" is a placeholder variable for the unique identifier of the to-do item. When GetById is invoked, it assigns the value of "{id}" in the URL to the method’s id parameter.

C#

Name = "GetTodo" creates a named route. Named routes:

  • Enable the app to create an HTTP link using the route name.
  • Are explained later in the tutorial.

Return values

The GetAll method returns a collection of TodoItem objects. MVC automatically serializes the object to JSON and writes the JSON into the body of the response message. The response code for this method is 200, assuming there are no unhandled exceptions. Unhandled exceptions are translated into 5xx errors.

In contrast, the GetById method returns the ActionResult<T> type, which represents a wide range of return types. GetById has two different return types:

  • If no item matches the requested ID, the method returns a 404 error. Returning NotFound returns an HTTP 404 response.
  • Otherwise, the method returns 200 with a JSON response body. Returning item results in an HTTP 200 response.

Launch the app

In Visual Studio, press CTRL+F5 to launch the app. Visual Studio launches a browser and navigates to http://localhost:<port>/api/values, where <port> is a randomly chosen port number. Navigate to the Todo controller at http://localhost:<port>/api/todo.

Implement the other CRUD operations

In the following sections, CreateUpdate, and Delete methods are added to the controller.

Create

Add the following Create method:

C#

The preceding code is an HTTP POST method, as indicated by the [HttpPost] attribute. MVC gets the value of the to-do item from the body of the HTTP request.

The CreatedAtRoute method:

  • Returns a 201 response. HTTP 201 is the standard response for an HTTP POST method that creates a new resource on the server.
  • Adds a Location header to the response. The Location header specifies the URI of the newly created to-do item. See 10.2.2 201 Created.
  • Uses the “GetTodo” named route to create the URL. The “GetTodo” named route is defined in GetById:
C#

Use Postman to send a Create request

  • Start the app.
  • Open Postman.

  • Update the port number in the localhost URL.
  • Set the HTTP method to POST.
  • Click the Body tab.
  • Select the raw radio button.
  • Set the type to JSON (application/json).
  • Enter a request body with a to-do item resembling the following JSON:
JSON

  • Click the Send button.

Click the Headers tab in the Response pane and copy the Location header value:

The Location header URI can be used to access the new item.

Update

Add the following Update method:

C#

Update is similar to Create, except it uses HTTP PUT. The response is 204 (No Content). According to the HTTP specification, a PUT request requires the client to send the entire updated entity, not just the deltas. To support partial updates, use HTTP PATCH.

Use Postman to update the to-do item’s name to “walk cat”:

Delete

Add the following Delete method:

C#

The Delete response is 204 (No Content).

Use Postman to delete the to-do item:

Postman console showing 204 (No Content) response

Call the Web API with jQuery

In this section, an HTML page is added that uses jQuery to call the Web API. jQuery initiates the request and updates the page with the details from the API’s response.

Configure the project to serve static files and to enable default file mapping. This is accomplished by invoking the UseStaticFiles and UseDefaultFiles extension methods in Startup.Configure. For more information, see Static files.

C#

Add an HTML file, named index.html, to the project’s wwwroot directory. Replace its contents with the following markup:

HTML

Add a JavaScript file, named site.js, to the project’s wwwroot directory. Replace its contents with the following code:

A change to the ASP.NET Core project’s launch settings may be required to test the HTML page locally. Open launchSettings.json in the Properties directory of the project. Remove the launchUrlproperty to force the app to open at index.html—the project’s default file.

There are several ways to get jQuery. In the preceding snippet, the library is loaded from a CDN. This sample is a complete CRUD example of calling the API with jQuery. There are additional features in this sample to make the experience richer. Below are explanations around the calls to the API.

Get a list of to-do items

To get a list of to-do items, send an HTTP GET request to /api/todo.

The jQuery ajax function sends an AJAX request to the API, which returns JSON representing an object or array. This function can handle all forms of HTTP interaction, sending an HTTP request to the specified urlGET is used as the type. The success callback function is invoked if the request succeeds. In the callback, the DOM is updated with the to-do information.

Add a to-do item

To add a to-do item, send an HTTP POST request to /api/todo/. The request body should contain a to-do object. The ajax function is using POST to call the API. For POST and PUT requests, the request body represents the data sent to the API. The API is expecting a JSON request body. The accepts and contentType options are set to application/json to classify the media type being received and sent, respectively. The data is converted to a JSON object using JSON.stringify. When the API returns a successful status code, the getData function is invoked to update the HTML table.

Update a to-do item

Updating a to-do item is very similar to adding one, since both rely on a request body. The only real difference between the two in this case is that the url changes to add the unique identifier of the item, and the type is PUT.

Delete a to-do item

Deleting a to-do item is accomplished by setting the type on the AJAX call to DELETE and specifing the item’s unique identifier in the URL.

No #1 Recommended ASP.NET Core Hosting

ASPHostPortal.com

ASPHostPortal.com  is the leading provider of Windows hosting and affordable ASP.NET MVC Hosting. ASPHostPortal proudly working to help grow the backbone of the Internet, the millions of individuals, families, micro-businesses, small business, and fledgling online businesses. ASPHostPortal has ability to support the latest Microsoft and ASP.NET technology, such as: WebMatrix, WebDeploy, Visual Studio 2015, .NET 5/ASP.NET 4.5.2, ASP.NET MVC 6.0/5.2, Silverlight 6 and Visual Studio Lightswitch, ASPHostPortal guarantees the highest quality product, top security, and unshakeable reliability, carefully chose high-quality servers, networking, and infrastructure equipment to ensure the utmost reliability.

HostForLIFE.eu

HostForLIFE.eu guarantees 99.9% uptime for their professional ASP.NET MVC hosting and actually implements the guarantee in practice. HostForLIFE.eu is the service are excellent and the features of the web hosting plan are even greater than many hosting. HostForLIFE.eu offer IT professionals more advanced features and the latest technology. Relibility, Stability and Performance of  servers remain and TOP priority. Even basic service plans are equipped with standard service level agreements for 99.99% uptime. Advanced options raise the bar to 99.99%. HostForLIFE.eu revolutionized hosting with Plesk Control Panel, a Web-based interface that provides customers with 24×7 access to their server and site configuration tools.

DiscountService.com.au

DiscountService.com.au is The Best and Cheap ASP.NET MVC Hosting. DiscountService.com.au was established to cater to an under served market in the hosting industry web hosting for customers who want excellent service. DiscountService.com.au guarantees the highest quality product, top security, and unshakeable reliability, carefully chose high-quality servers, networking, and infrastructure equipment to ensure the utmost reliability. DiscountService.com.au has ability to support the latest Microsoft and ASP.NET technology, such as: WebMatrix, WebDeploy, Visual Studio 2015, .NET 5/ASP.NET 4.5.2, ASP.NET MVC 6.0/5.2, Silverlight 6 and Visual Studio Lightswitch. DiscountService.com.au is devoted to offering the best Windows hosting solution for you.