A few weeks ago I covered creating a basic API to retrieve contacts. In this post I am going to expand on that example by adding the ability to create and delete contacts. Before starting it would be a good idea to review my post on API basics as well as make sure you have a tool such as Postman to exercise your API.
First is the function for the creation of a new contact which will be an http post that accepts a contact, does some validation and inserts the contact to the database.
[HttpPost] public async Task Create([FromBody] ContactModel contact) { if (contact == null) { return HttpBadRequest(); } if (!ModelState.IsValid) { return new BadRequestObjectResult(ModelState); } _dbContext.Add(contact); await _dbContext.SaveChangesAsync(); return CreatedAtRoute("GetById", new {controller = "Contacts", id = contact.Id}, contact); }
First thing to notice is the HttpPost attribute that says this function only handles HTTP posts. Next notice the FromBody attribute on the contact parameter of the function call. This tells ASP to bind the contact object to the data provided by the request body so that the function has a hydrated contact object to work with.
Both if statements are doing validation. The first is making sure that contact has a value. The second if is a bit of magic provided by ASP. ModelState contains information about the state of the model, a contact in this case, after it is bound to the values from the HTTP request. The contact model has data annotations which will cause ModelState.IsValid to return false if the model fails to validate against any of the data annotations. Both set of variations return a HttpBadRequest, but the ModelState version passes back the ModelState to the client since it contains details of all failed validation.
If all validation passed then the new contact is added to the controller’s dbContext and the dbContext saves changes inserts the new contact into the database.
Finally a route to the newly inserted contact is returned to the client. CreatedAtRoute takes a route name, route values and a value. In this case it is saying run the “GetById” route for the contacts controller with the ID of the new contact.
In order to get CreatedAtRoute to work the Get overload that takes an ID needed a name which is provided as part of the HttpGet attribute.
[HttpGet("{id}", Name = "GetById")] public async Task Get(int id)
Now to add a contact with the API using Postman. First click Get which will drop down a list of HTTP verb to choose from. For adding a new contact we need to use Post.
After selecting post the body tab will be enabled. On the body tab select raw from the radio buttons. Next click the drop down that says text and select JSON (application/json) since the data for the contact will be sent to the API as JSON.
Finally enter the appropriate JSON and click send. All that is required to create a new contact with my API is a name so the follow JSON is what I used to test.
{"Name" : "John McTest"}
At this point if all went well you will find John McTest in database. If all went well Postman will give the option to view the response which would include the Id which was set when dbContext.SaveChangesAsync was called.
The delete function is much simpler. It just needs the HttpDelete attribute and takes the ID of the contact to be deleted.
[HttpDelete("{id}")] public async Task Delete(int id) { var contact = await GetContacts() .Where(c => c.Id == id).FirstOrDefaultAsync(); if (contact == null) return; _dbContext.Remove(contact); await _dbContext.SaveChangesAsync(); }
Using the dbContext the contact is retrieved for the ID passed in. If the contact is not found the function just returns since the contact has already been removed from the database. If the contact is found then the remove function of the dbContext is used to mark the contact for delete and then save changes of dbContext is used to send the delete command to the database.
To test with Postman select delete from the list of HTTP verbs, this is the same drop down that was used to select post above. Next enter the ID to be deleted in the URL box and click send. In the screenshot below the API will be told to delete the contact with the ID of 108.
Check out the ASP.NET 5 docs for a great API example that uses Fiddler instead of Postman.