Coded a category controller and API that posts Title, Type and Icon but it is giving status 415 error (unsupported media type). I am trying to get my backend talking to a Python frontend. need suggestion on what I have done wrong.
`using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using ExpenseTracker.Models;
namespace ExpenseTracker.Controllers
{
public class CategoryController : Controller
{
private readonly ApplicationDbContext _context;
public CategoryController(ApplicationDbContext context)
{
_context = context;
}
// GET: Category
public async Task<IActionResult> Index()
{
return _context.Categories != null ?
View(await _context.Categories.ToListAsync()) :
Problem("Entity set 'ApplicationDbContext.Categories' is null.");
}
// GET: Category/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null || _context.Categories == null)
{
return NotFound();
}
var category = await _context.Categories
.FirstOrDefaultAsync(m => m.CategoryId == id);
if (category == null)
{
return NotFound();
}
return View(category);
}
// GET: Category/AddOrEdit
public IActionResult AddOrEdit(int id = 0)
{
if (id == 0)
return View(new Category());
else
return View(_context.Categories.Find(id));
}
// POST: Category/AddOrEdit
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> AddOrEdit([Bind("CategoryId,Title,Icon,Type")] Category category)
{
if (ModelState.IsValid)
{
if (category.CategoryId == 0)
_context.Add(category);
else
_context.Update(category);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(category);
}
// GET: Category/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null || _context.Categories == null)
{
return NotFound();
}
var category = await _context.Categories.FindAsync(id);
if (category == null)
{
return NotFound();
}
return View(category);
}
// POST: Category/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("CategoryId,Title,Icon,Type")] Category category)
{
if (id != category.CategoryId)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(category);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!CategoryExists(category.CategoryId))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(category);
}
// GET: Category/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null || _context.Categories == null)
{
return NotFound();
}
var category = await _context.Categories
.FirstOrDefaultAsync(m => m.CategoryId == id);
if (category == null)
{
return NotFound();
}
return View(category);
}
// POST: Category/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
if (_context.Categories == null)
{
return Problem("Entity set 'ApplicationDbContext.Categories' is null.");
}
var category = await _context.Categories.FindAsync(id);
if (category != null)
{
_context.Categories.Remove(category);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
private bool CategoryExists(int id)
{
return (_context.Categories?.Any(e => e.CategoryId == id)).GetValueOrDefault();
}
}
}
This is API and as far as I know, API looks fine to me but I am getting 415 status error
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ExpenseTracker.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace ExpenseTracker.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class ApiCategoryController : ControllerBase
{
private readonly ApplicationDbContext _context;
public ApiCategoryController(ApplicationDbContext context)
{
_context = context;
}
// GET: api/ApiCategory
[HttpGet]
public async Task<ActionResult<IEnumerable<Category>>> GetCategories()
{
return await _context.Categories.ToListAsync();
}
// GET: api/ApiCategory/5
[HttpGet("{id}")]
public async Task<ActionResult<Category>> GetCategory(int id)
{
var category = await _context.Categories.FindAsync(id);
if (category == null)
{
return NotFound();
}
return category;
}
// POST: api/ApiCategory
[HttpPost]
public async Task<ActionResult<Category>> PostCategory(Category category)
{
_context.Categories.Add(category);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetCategory), new { id = category.CategoryId }, category);
}
// PUT: api/ApiCategory/5
[HttpPut("{id}")]
public async Task<IActionResult> PutCategory(int id, Category category)
{
if (id != category.CategoryId)
{
return BadRequest();
}
_context.Entry(category).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!CategoryExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
// DELETE: api/ApiCategory/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteCategory(int id)
{
var category = await _context.Categories.FindAsync(id);
if (category == null)
{
return NotFound();
}
_context.Categories.Remove(category);
await _context.SaveChangesAsync();
return NoContent();
}
private bool CategoryExists(int id)
{
return _context.Categories.Any(e => e.CategoryId == id);
}
}
}
Tried postman and changed the content-type but not working. I am not sure what I have written wrong in the category controller. This is what the client is sending in python
from flask import Blueprint, render_template, request
import requests
categories_bp = Blueprint('categories', __name__)
@categories_bp.route('/categories', methods=['GET', 'POST'])
def categories():
if request.method == 'POST':
income = request.form['income']
expense = request.form['expense']
title = request.form['title']
icon = request.form['icon']
response = requests.post('https://localhost:7005/api/apicategory', json ={
'income': income,
'expense': expense,
'title': title,
'icon': icon
}, headers={'content-type': 'application/json'})
if response.ok:
return 'Category Added'
else:
return 'Failed to add category'
else:
return render_template("categories.html")