ASP.NET Web API пользовательское действие публикации не работает
Итак, у меня есть GebruikerController в моем API. Gebruiker - это голландский пользователь, и этот контроллер делает то, что он регистрирует пользователя, получает список пользователей, добавляет пользователей и получает конкретного пользователя. Но я столкнулся с проблемой, когда ввел свой собственный метод публикации для простой функции входа в систему. Всякий раз, когда я отправляю некоторые данные из PostMan в функцию, я получаю следующий ответ:
{"id": ["Недопустимое значение login".]}
Я получаю к нему доступ с помощью этого URL:
это мой контроллер:
[Produces("application/json")]
[Route("api/Gebruikers")]
public class GebruikersController : Controller
{
private readonly flowerpowerContext _context;
public GebruikersController(flowerpowerContext context)
{
_context = context;
}
// GET: api/Gebruikers
[HttpGet]
public IEnumerable<Gebruiker> GetGebruiker()
{
return _context.Gebruiker;
}
// GET: api/Gebruikers/5
[HttpGet("{id}")]
public async Task<IActionResult> GetGebruiker([FromRoute] int id)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var gebruiker = await _context.Gebruiker.SingleOrDefaultAsync(m => m.Id == id);
if (gebruiker == null)
{
return NotFound();
}
return Ok(gebruiker);
}
[Route("api/gebruikers/login")]
[HttpPost]
public async Task<IActionResult> PostLogin([FromBody] string email, [FromBody] string password)
{
if(!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if(GebruikerVerify(email, password))
{
var gebruiker = await _context.Gebruiker.FirstOrDefaultAsync((g) => (g.GebruikerEmail == email && g.GebruikerWachtwoord == password));
return Ok(gebruiker);
}
else
{
return BadRequest("invalid data");
}
}
// PUT: api/Gebruikers/5
[HttpPut("{id}")]
public async Task<IActionResult> PutGebruiker([FromRoute] int id, [FromBody] Gebruiker gebruiker)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != gebruiker.Id)
{
return BadRequest();
}
_context.Entry(gebruiker).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!GebruikerExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
// POST: api/Gebruikers
[HttpPost]
public async Task<IActionResult> PostGebruiker([FromBody] Gebruiker gebruiker)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_context.Gebruiker.Add(gebruiker);
await _context.SaveChangesAsync();
return CreatedAtAction("GetGebruiker", new { id = gebruiker.Id }, gebruiker);
}
// DELETE: api/Gebruikers/5
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteGebruiker([FromRoute] int id)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var gebruiker = await _context.Gebruiker.SingleOrDefaultAsync(m => m.Id == id);
if (gebruiker == null)
{
return NotFound();
}
_context.Gebruiker.Remove(gebruiker);
await _context.SaveChangesAsync();
return Ok(gebruiker);
}
private bool GebruikerExists(int id)
{
return _context.Gebruiker.Any(e => e.Id == id);
}
private bool GebruikerVerify(string email, string wacthwoord)
{
if(_context.Gebruiker.Any(e => e.GebruikerEmail == email))
{
Gebruiker gebruiker = _context.Gebruiker.FirstOrDefault(e => e.GebruikerEmail == email);
if(wacthwoord == gebruiker.GebruikerWachtwoord)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
}
следующий код мой код входа в систему, который также можно увидеть в коде выше.
[Route("api/gebruikers/login")]
[HttpPost]
public async Task<IActionResult> PostLogin([FromBody] string email, [FromBody] string password)
{
if(!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if(GebruikerVerify(email, password))
{
var gebruiker = await _context.Gebruiker.FirstOrDefaultAsync((g) => (g.GebruikerEmail == email && g.GebruikerWachtwoord == password));
return Ok(gebruiker);
}
else
{
return BadRequest("invalid data");
}
}
private bool GebruikerVerify(string email, string wacthwoord)
{
if(_context.Gebruiker.Any(e => e.GebruikerEmail == email))
{
Gebruiker gebruiker = _context.Gebruiker.FirstOrDefault(e => e.GebruikerEmail == email);
if(wacthwoord == gebruiker.GebruikerWachtwoord)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
Я довольно новичок в этом, и я не знаю, что я делаю здесь неправильно. Может кто-нибудь помочь мне с этим?
1 ответ
Это проблема маршрутизации. Из-за префикса маршрута на контроллере вы нажимаете GetGebruiker
что ожидает id
быть int
но он видит "login"
строка.
следующий FromBody
может использоваться только один раз в параметре действия. Объедините эти параметры в одну модель, а затем используйте FromBody
приписывать.
public class LoginModel {
[Required]
public string email { get; set; }
[Required]
public string password { get; set; }
}
Обратите внимание на комментарии, используемые для демонстрации сопоставленных маршрутов.
[Produces("application/json")]
[Route("api/Gebruikers")]//route prefix for this controller
public class GebruikersController : Controller {
//...code removed for brevity
// GET: api/Gebruikers
[HttpGet]
public IEnumerable<Gebruiker> GetGebruiker() {
//...code removed for brevity
}
// GET: api/Gebruikers/5
[HttpGet("{id:int}")] // Note the route constraint
public async Task<IActionResult> GetGebruiker([FromRoute] int id) {
//...code removed for brevity
}
// POST: api/Gebruikers/login
[HttpPost("login")]
public async Task<IActionResult> PostLogin([FromBody] LoginModel login) {
if(!ModelState.IsValid) {
return BadRequest(ModelState);
}
if(GebruikerVerify(login.email, login.password)) {
//...code removed for brevity
} else {
return BadRequest("invalid data");
}
}
// PUT: api/Gebruikers/5
[HttpPut("{id:int}")]
public async Task<IActionResult> PutGebruiker([FromRoute] int id, [FromBody] Gebruiker gebruiker) {
//...code removed for brevity
}
// POST: api/Gebruikers
[HttpPost]
public async Task<IActionResult> PostGebruiker([FromBody] Gebruiker gebruiker) {
//...code removed for brevity
}
// DELETE: api/Gebruikers/5
[HttpDelete("{id:int}")]
public async Task<IActionResult> DeleteGebruiker([FromRoute] int id) {
//...code removed for brevity
}
//..code removed for brevity
}
Рекомендации
Маршрутизация в ASP.NET Core # Ссылка на ограничение маршрута