gpt4 book ai didi

c# - ASP.NET Web API 自定义发布操作不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 18:55:05 24 4
gpt4 key购买 nike

所以我的 API 中有一个 GebruikerController。 Gebruiker 在荷兰语中是用户的意思,这个 Controller 的作用是让用户登录、获取用户列表、添加用户并获取特定用户。但是我在为一个简单的登录功能引入自己的自定义post方法时遇到了问题。每当我从 PostMan 向函数发送一些数据时,我都会得到以下响应:

{"id":["The value 'login' is not valid."]}

我用这个 url 访问它:

http://localhost:52408/api/gebruikers/login

这是我的 Controller :

[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;
}
}

我对此很陌生,我对我在这里做错了什么一无所知。有人可以帮我解决这个问题吗?

最佳答案

这是一个路由问题。由于 Controller 上的路由前缀,您正在点击 GetGebruiker,它期望 idint 但它看到 "login" 字符串。

Next FromBody 只能在 Action 参数中使用一次。将这些参数合并到一个模型中,然后使用 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
}

引用资料

Routing in ASP.NET Core # Route Constraint Reference

Routing to Controller Actions

Model Binding

关于c# - ASP.NET Web API 自定义发布操作不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47390016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com