![](/img/trans.png)
[英]Get ALL or SPECIFIC data from the DB using multiple query parameters (ASP.NET Core Web Api)
[英]Having multiple get-methods with multiple query string parameters in ASP.NET Core Web Api
我正在構建一個web api,我有一個資源,必須有3個get方法,如下所示:
[HttpGet]
[Route("{city}/{streetName}/{streetNumber}/{littera}")]
public IActionResult GetByAddress([FromQuery]string city, [FromQuery]string streetName, [FromQuery]int streetNumber, [FromQuery]string littera)
{
var model = _availabilityService.FindByAddress(city, streetName, streetNumber, littera);
return Ok(model);
}
[HttpGet("{pointId}")]
public IActionResult GetByPointId(string pointId)
{
var model = _availabilityService.FindByPointId(pointId);
return Ok(model);
}
[HttpGet]
[Route("{xCoordinate}/{yCoordinate}")]
public IActionResult GetByCoordinates([FromQuery]decimal xCoordinate, [FromQuery]decimal yCoordinate)
{
var model = _availabilityService.FindByCoordinates(xCoordinate, yCoordinate);
return Ok(model);
}
只有一個參數(pointId)的get方法工作正常,因為它不被視為查詢字符串而是id和id。 然而,似乎剩下的兩種方法無法通過ASP.NET中的路由器區分。
我在這里真的很茫然,無法弄清楚它為什么不起作用。 我能夠解決的是,如果我刪除其中一種方法,另一種方法可以正常工作。
關於我做錯的任何建議?
僅供參考,相應的網址:應該如下所示:
api/1.0/availabilities?city=Metropolis&streetName=Superstreet&streetNumber=1&littera=A
和
/api/1.0/availabilities?xCoordinate=34.3444&yCoordinate=66.3422
謝謝!
首先,您要混合RouteParameters和QueryParameters。
這個:
[HttpGet]
[Route("{xCoordinate}/{yCoordinate}")]
public IActionResult GetByCoordinates([FromQuery]decimal xCoordinate, [FromQuery]decimal yCoordinate)
{
var model = _availabilityService.FindByCoordinates(xCoordinate, yCoordinate);
return Ok(model);
}
將控制器操作GetByCoordinates
映射到這樣的路由:
/api/1.0/availabilities/34.3444/66.3422
但是您還指定您希望xCoordinate
和yCoordinate
與查詢參數綁定。 所以上面的url會匹配動作,但是xCoordinate
和yCoordinate
會綁定到它的默認值(在本例中為0)。
因此,要獲得所需的路線,您不應聲明路線參數:
[HttpGet]
[Route("")] // <- no route parameters specified
public IActionResult GetByCoordinates([FromQuery]decimal xCoordinate, [FromQuery]decimal yCoordinate)
{
// will be matched by e.g.
// /api/1.0/availabilities?xCoordinate=34.3444&yCoordinate=66.3422
}
現在您想要的路線將匹配。
注意:您無法將兩個操作映射到同一路由 - 路由中間件不知道選擇哪個。 因此,從GetByAddress
刪除路由參數將有效地將兩個操作映射到同一路由:
/api/1.0/availabilities?{any=number&of=query¶meters=here}
因此,您必須通過其他路段來區分它們。
[HttpGet]
[Route("address")] // <--
public IActionResult GetByAddress([FromQuery]string city, [FromQuery]string streetName, [FromQuery]int streetNumber, [FromQuery]string littera)
{
// will be matched by e.g.
// api/1.0/availabilities/address?city=Metropolis&streetName=Superstreet&streetNumber=1&littera=A
}
進一步閱讀:
小建議:
設置Microsft
記錄等級來Debug
在appsettings.json
(自動標准Asp.Net核心WebApplication的模板生成的),你將獲得的路由選擇是非常有用的信息/錯誤,同時在紅隼運行時在控制台輸出路徑選擇。
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Debug"
}
或者將StartUp.cs
的調試記錄器StartUp.cs
為LogLevel.Debug
並在Visual Studio中直接在調試輸出中獲得相同的信息。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// ...
loggerFactory.AddDebug(LogLevel.Debug);
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.