Mohammad Js
Mohammad Js

Reputation: 29

Why is my form body always null in Web API?

I'm new in .NET and Web API; I create a signup user API with .NET 5.

This is my controller:

namespace SignupUsers.Controllers
{
    [Route("api/signup")]
    [ApiController]
    public class MySignupController : ControllerBase
    {
        private readonly IDataRepository<UserSignup> _dataRepository;

        public MySignupController(IDataRepository<UserSignup> dataRepository)
        {
            _dataRepository = dataRepository;
        }

        [HttpGet]
        public IActionResult Get()
        {
            IEnumerable<UserSignup> userSignups = _dataRepository.GetAll();
            return Ok(userSignups);
        }

        [HttpGet("{id}", Name = "Get")]
        public IActionResult Get(int id)
        {
            UserSignup userSignup = _dataRepository.Get(id);

            if (userSignup == null)
            {
                return NotFound("User Not Found!!!");
            }

            return Ok(userSignup);
        }

        [HttpPost]
        public IActionResult Post([FromBody] UserSignup userSignup)
        {
            if (userSignup == null)
            {
                return BadRequest("User is null!!!");
            }

            _dataRepository.Add(userSignup);
            return CreatedAtRoute(
                "Get",
                new { Id = userSignup.Id },
                userSignup);
        }

        [HttpPut("{id}")]
        public IActionResult Put(int id, [FromBody] UserSignup userSignup)
        {
            if (userSignup == null)
            {
                return BadRequest("User is null!!!");
            }

            UserSignup userSignupToUpdate = _dataRepository.Get(id);

            if (userSignupToUpdate == null)
            {
                return NotFound("The User record couldn't be found");
            }

            _dataRepository.Update(userSignupToUpdate, userSignup);
            return NoContent();
        }

        [HttpDelete("{id}")]
        public IActionResult Delete(int id)
        {
            UserSignup userSignup = _dataRepository.Get(id);

            if (userSignup == null)
                return NotFound("The User record couldn't be found");

            _dataRepository.Delete(userSignup);
            return NoContent();
        }
    }
}

I added the DbContext to another folder:

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using SignupUsers.Models;

namespace SignupUsers.Data
{
    public class UserSignupDbContext : DbContext
    {
        public UserSignupDbContext(DbContextOptions<UserSignupDbContext> options)
            : base(options)
        {
        }

        public DbSet<Models.UserSignup> SignupUsers { get; set; }
    }
}

For using code first I use EF Core.

UserSignup model class:

namespace SignupUsers.Models
{
    public class UserSignup
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public int Password { get; set; }
    }
}

For managing input and output, I use an interface and implemented that in datamanager.cs:

namespace SignupUsers.Models
{
    public class DataManager : IDataRepository<UserSignup>
    {
        readonly UserSignupDbContext _userSignupDbContext;

        public DataManager(UserSignupDbContext context)
        {
            _userSignupDbContext = context;
        }

        public void Add(UserSignup entity)
        {
            _userSignupDbContext.SignupUsers.Add(entity);
            _userSignupDbContext.SaveChanges();
        }

        public void Delete(UserSignup entity)
        {
            _userSignupDbContext.SignupUsers.Remove(entity);
            _userSignupDbContext.SaveChanges();
        }

        public UserSignup Get(int id)
        {
            return _userSignupDbContext.SignupUsers.
                 FirstOrDefault(s => s.Id == id);

        }

        public IEnumerable<UserSignup> GetAll()
        {
            return _userSignupDbContext.SignupUsers.ToList();
        }

        public void Update(UserSignup dbEntity, UserSignup entity)
        {
            dbEntity.Name = entity.Name;
            dbEntity.Email = entity.Email;
            dbEntity.Password = entity.Password;

            _userSignupDbContext.SaveChanges();
        }
    }
}

This is my startup:

namespace SignupUsers
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {

            services.AddDbContext<UserSignupDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("UserSignup")));

            services.AddScoped<IDataRepository<UserSignup>, DataManager>();

            //services.AddCors();

            services.AddControllers();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();
            app.UseRouting();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

When I post data to that (with Postman), I get back an error 415 (unsupported media type).

What can I do?

Thank you in advance for your help.

Upvotes: 1

Views: 266

Answers (1)

mehmetx
mehmetx

Reputation: 860

in postman, set the "content-type" as JSON (application/json)

Upvotes: 2

Related Questions