Here is my controller:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using Milos_MovieStore.DAL; using Milos_MovieStore.Models; using Milos_MovieStore.DTO; using System.Data.Entity; namespace Milos_MovieStore.Controllers.Api { public class CustomersController : ApiController { private DBContext_MovieStore _dbcontext; public CustomersController() { _dbcontext = new DBContext_MovieStore(); } protected override void Dispose(bool disposing) { _dbcontext.Dispose(); } // GET /api/customers [HttpGet] public IHttpActionResult GetCustomers() { List<Customer> customers = _dbcontext.Customers.Include(c => c.MembershipType).ToList(); return Ok(CustomersToDTOList(customers)); } // GET /api/customers/1 [HttpGet] public IHttpActionResult GetCustomer(int id) { Customer customer = _dbcontext.Customers.Include(c => c.MembershipType).SingleOrDefault(c => c.Id == id); if (customer == null) return NotFound(); return Ok(CustomerToDTO(customer)); } //POST /api/customers [HttpPost] public IHttpActionResult CreateCustomer(CustomerDTO customerDTO) { if (!ModelState.IsValid) return BadRequest(); _dbcontext.Customers.Add(DTOToCustomer(customerDTO)); _dbcontext.SaveChanges(); return Created(new Uri(Request.RequestUri + "/" + customerDTO.Id), customerDTO); } // PUT /api/customer/1 [HttpPut] public IHttpActionResult UpdateCustomer(CustomerDTO customerDTO) { if (!ModelState.IsValid) return BadRequest(); Customer customerInDB = _dbcontext.Customers.SingleOrDefault(c => c.Id == customerDTO.Id); if (customerInDB == null) return NotFound(); MapDTOToCustomer(customerDTO, customerInDB); _dbcontext.SaveChanges(); return Ok(customerDTO); } // DELETE /api/customer/1 [HttpDelete] public IHttpActionResult DeleteCustomer(int id) { if (!ModelState.IsValid) return BadRequest(); Customer customerInDB = _dbcontext.Customers.SingleOrDefault(c => c.Id == id); if (customerInDB == null) return NotFound(); _dbcontext.Customers.Remove(customerInDB); _dbcontext.SaveChanges(); return Ok(id); } private CustomerDTO CustomerToDTO(Customer customer) { CustomerDTO customerDTO = new CustomerDTO(); customerDTO.Id = customer.Id; customerDTO.Name = customer.Name; customerDTO.DOB = customer.DOB; customerDTO.MembershipTypeId = customer.MembershipTypeId; customerDTO.IsSubscribedToNewsletter = customer.IsSubscribedToNewsletter; return customerDTO; } private Customer DTOToCustomer(CustomerDTO customerDTO) { Customer customer = new Customer(); customer.Id = customerDTO.Id; customer.Name = customerDTO.Name; customer.DOB = customerDTO.DOB; customer.MembershipTypeId = customerDTO.MembershipTypeId; customer.IsSubscribedToNewsletter = customerDTO.IsSubscribedToNewsletter; return customer; } private void MapDTOToCustomer(CustomerDTO customerDTO, Customer customer) { customer.Id = customerDTO.Id; customer.Name = customerDTO.Name; customer.DOB = customerDTO.DOB; customer.MembershipTypeId = customerDTO.MembershipTypeId; customer.IsSubscribedToNewsletter = customerDTO.IsSubscribedToNewsletter; } private IEnumerable<CustomerDTO> CustomersToDTOList(IEnumerable<Customer> customers) { List<CustomerDTO> customersDTO = new List<CustomerDTO>(); foreach (Customer c in customers) { customersDTO.Add(CustomerToDTO(c)); } return customersDTO; } } } My DTO:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; namespace Milos_MovieStore.DTO { public class CustomerDTO { public int Id { get; set; } [Required] [StringLength(255)] public string Name { get; set; } public DateTime? DOB { get; set; } public byte MembershipTypeId { get; set; } public bool IsSubscribedToNewsletter { get; set; } } } My POST request:
As you can see in the screenshot, I'm sending DTO in JSON to POST method in API controller. I just can't find a solution. DELETE and GET requests are working with no problem. It is a training project so don't worry about those weird temporary mapping methods I have put in controller.



