路由:使用查询参数解决歧义请求



给定下面的RecordsController,以下请求应该是可能的,并相应地映射到端点

  1. /api/记录
  2. /api/记录/9b8585599-7639-45da-acd6-a1323fb019b5
  3. /api/记录/9b8585599-7639-45da-acd6-a1323fb019b5?asOf=2022-01-01
  4. /api/记录/9b8585599-7639-45da-acd6-a1323fb019b5?从=2022-01-01&至=2022-03-01

映射到:

  1. GetAll(Guid id(
  2. 获取(Guid id(
  3. GetAsOf(Guid id1,[FromQuery]字符串asOf(
  4. GetHistory(Guid id2,[FromQuery]字符串来自,[FromQuery]字符串到(
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class RecordsController : ControllerBase
{
private readonly ILogger<RecordsController> _logger;
public RecordsController(ILogger<RecordsController> logger)
{
_logger = logger;
}
[HttpGet()]
public ActionResult<IEnumerable<Record>> GetAll()
{
_logger.LogInformation("GetAll() was used");
return Ok();
}
[HttpGet("{id:Guid}")]
public ActionResult<Record> Get(Guid id)
{
_logger.LogInformation("Get() was used");
return Ok();
}
[HttpGet("{id1:Guid}")]
public ActionResult<IEnumerable<Record>> GetAsOf(Guid id1, [FromQuery] string asOf)
{
_logger.LogInformation("GetAsOf() was used");
return Ok();
}
[HttpGet("{id2:Guid}")]
public ActionResult<IEnumerable<Record>> GetHistory(Guid id2, [FromQuery] string from, [FromQuery] string to)
{
_logger.LogInformation("GetHistory() was used");
return Ok();
}
}
public class Record
{
public Guid Id { get; set; }
public string Comment { get; set; } = string.Empty;
}
}

这没有按预期工作。如上所述的实现会导致歧义匹配异常。

使用CCD_ 1有可能影响这种行为,但随后请求24.被路由到具有最低顺序的端点。

你认为除了把FromQuery改成FromRoute之外还有什么可能吗?

谢谢!

方法2-4确实不明确,因为它们都是相同的端点,只是具有不同的查询参数。因此,您要么需要使它们具有不同的路由,要么可以将端点表示为具有所有可能的查询参数的单个方法,然后使用存在的查询参数来映射到特定方法。

HttpGet("{id:Guid}")]
public ActionResult<Record> Get(Guid id, [FromQuery] string asOf, [FromQuery] string from, [FromQuery] string to)
{
if (asOf != null) return GetAsOf(id, asOf);
if (from != null && to != null) return GetHistory(id, from, to);
return Get(id);
}
public ActionResult<Record> Get(Guid id)
{
_logger.LogInformation("Get() was used");
return Ok();
}
public ActionResult<IEnumerable<Record>> GetAsOf(Guid id, string asOf)
{
_logger.LogInformation("GetAsOf() was used");
return Ok();
}
public ActionResult<IEnumerable<Record>> GetHistory(Guid id2, [FromQuery] string from, [FromQuery] string to)
{
_logger.LogInformation("GetHistory() was used");
return Ok();
}