所以我的API中有一个GebruikerController。 Gebruiker是用户的荷兰人,这个控制器做的是它记录用户,获取用户列表,添加用户并获得特定用户。但是当我为简单的登录功能引入自己的自定义post方法时,我遇到了一个问题。每当我从PostMan发送一些数据到函数时,我得到以下响应:
{" id":["值'登录'无效。"]}
我使用此网址访问它:
这是我的控制者:
[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;
}
}
我对此很陌生,对于我在这里做错了什么,我一无所知。有人可以帮帮我吗?
答案 0 :(得分:6)
这是路由问题。由于控制器上的路由前缀,您需要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
}
参考