ASP.NET Web API 自定义 post 操作无效
ASP.NET Web API custom post action not working
所以我的 API 中有一个 GebruikerController。 Gebruiker 在荷兰语中是用户的意思,这个控制器的作用是让用户登录、获取用户列表、添加用户并获取特定用户。但是我在为一个简单的登录功能引入自己自定义的post方法时遇到了问题。每当我从 PostMan 向函数发送一些数据时,我都会收到以下响应:
{"id":["The value 'login' is not valid."]}
我用这个 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;
}
}
我对此很陌生,我对我在这里做错了什么一无所知。有人可以帮我解决这个问题吗?
这是路由问题。由于控制器上的路由前缀,您正在点击 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
}
参考资料
所以我的 API 中有一个 GebruikerController。 Gebruiker 在荷兰语中是用户的意思,这个控制器的作用是让用户登录、获取用户列表、添加用户并获取特定用户。但是我在为一个简单的登录功能引入自己自定义的post方法时遇到了问题。每当我从 PostMan 向函数发送一些数据时,我都会收到以下响应:
{"id":["The value 'login' is not valid."]}
我用这个 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;
}
}
我对此很陌生,我对我在这里做错了什么一无所知。有人可以帮我解决这个问题吗?
这是路由问题。由于控制器上的路由前缀,您正在点击 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
}
参考资料