c# - .Net Core 不路由到 POST 方法,但 GET 方法有效
问题描述
我正在使用示例 Web 应用程序进行培训。由于未知原因,.Net Core 不会将 POST 请求路由到相应的方法。获取方法正在工作,但 POST 甚至没有被解雇。POST 请求返回 404。
我已经尝试添加这样的注释,但没有帮助。
有人可以请
[HttpPost("envelope")]
这是我的控制器的代码。
namespace Receiver.Controllers
{
[Route("[controller]")]
[ApiController]
public class EnvelopesController : ControllerBase
{
private readonly ReceiverDbContext _dbContext;
private readonly ILogger _logger;
public EnvelopesController(ReceiverDbContext dbContext, ILogger logger)
{
_dbContext = dbContext;
_logger = logger;
}
/// <summary>
/// GET (Read all) /envelopes
/// </summary>
/// <returns></returns>
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<ActionResult<IEnumerator<EnvelopeDTO>>> GetAll()
{
_logger.LogInformation("Hello from the Get() method!");
var envelopes = await _dbContext.Envelope.Include(e => e.Type).ToArrayAsync();
return Ok(envelopes.Select(e => e.ToDTO()));
}
/// <summary>
/// GET (Read) /envelope/{id}
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<EnvelopeDTO>> Get(int id)
{
var envelope = await _dbContext.Envelope.Include(e => e.Type).FirstOrDefaultAsync(s => s.Id == id);
if (envelope == null)
return NotFound();
return Ok(envelope.ToDTO());
}
/// <summary>
/// POST (Create) /envelope
/// </summary>
/// <param name="envelopeDto"></param>
/// <returns></returns>
[HttpPost("envelope")]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status409Conflict)]
public async Task<ActionResult<EnvelopeDTO>> Create([FromBody] EnvelopeDTO envelopeDto)
{
_logger.LogInformation("Hello from the Post() method!");
if (string.IsNullOrEmpty(envelopeDto.СontentX))
return BadRequest();
var @type = await _dbContext.EnvelopeType.FirstOrDefaultAsync(t => t.Id == envelopeDto.TypeId);
if (@type == null)
return NotFound();
var @user = await _dbContext.User.FirstOrDefaultAsync(u => u.UserName == envelopeDto.User);
if (@user == null)
return NotFound();
var existingEnvelope = await _dbContext.Envelope.FindAsync(envelopeDto.СontentX);
if (existingEnvelope != null)
return Conflict();
var envelopeToAdd = envelopeDto.ToModel(@type, @user);
_dbContext.Envelope.Add(envelopeToAdd);
await _dbContext.SaveChangesAsync();
var updatedEnvelopeDto = envelopeToAdd.ToDTO();
return CreatedAtAction(nameof(Get), new { Content = envelopeDto.СontentX }, updatedEnvelopeDto);
}
/// <summary>
/// DELETE /envelope/{id}
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<EnvelopeDTO>> Delete(int id)
{
var envelope = await _dbContext.Envelope.FindAsync(id);
if (envelope == null)
return NotFound();
_dbContext.Envelope.Remove(envelope);
await _dbContext.SaveChangesAsync();
return Ok(envelope.ToDTO());
}
}
public static class EnvelopeExtensions
{
public static Envelope ToModel(this EnvelopeDTO envelopeDto, EnvelopeType @type, User @user)
{
//if (@class.Id != studentDto.ClassId) throw new NotSupportedException();
return new Envelope
{
//DateTimeReceivied = DateTime.Now,
Type = @type,
СontentX = envelopeDto.СontentX,
User = @user
};
}
public static EnvelopeDTO ToDTO(this Envelope envelope)
{
return new EnvelopeDTO
{
//DateTimeReceivied = DateTime.Now,
TypeId = envelope.Type.Id,
СontentX = envelope.СontentX,
User = envelope.User.UserName
};
}
}
}
解决方案
改变
[HttpPost("envelope")]
到
[HttpPost]
您对 POST 正文进行编码的方式将被发布到POST /envelopes/envelope
端点,这似乎是您不想要的。
您在其他方法中的评论也具有误导性。例如
// DELETE /envelope/{id}
真的应该
// DELETE /envelopes/{id}
.
的[controller]
部分[Route("[controller]")]
将被替换为控制器名称的小写部分,而没有Controller
(即/envelopes
(复数)构成端点的基础来自EnvelopesController
.
在您的 Postman 屏幕截图中,您可以看到您试图从复数/envelopes
(好)获取但发布到/envelope
未定义的单数。
推荐阅读
- django - 如何使用 href 链接功能以及将 Django url 传递给 Django 中的视图?
- c++ - 引用传递与静态有何不同
- vue.js - Vue:绑定动态和静态类
- google-contacts-api - 当我通过 Google 通讯录中的 API 更新联系人时,有没有办法不触发 zapier zap?
- c++ - 使用模板类通过引用复制向量?
- elasticsearch - 如何在 Elasticsearch 的另一个查询中使用一个查询的结果
- flutter - 在 dart 中发送 http 表单 GET
- php - 如何将 html 标签 id 值初始化为 laravel 中的变量?
- c - CUDA:使用 atomicAdd 遇到非法内存访问
- arrays - 如何在VHDL中连接两个不同维度的数组?