簡體   English   中英

在ASP.NET Core Web Api中具有多個具有多個查詢字符串參數的get方法

[英]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

但是您還指定您希望xCoordinateyCoordinate與查詢參數綁定。 所以上面的url會匹配動作,但是xCoordinateyCoordinate會綁定到它的默認值(在本例中為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&parameters=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記錄等級來Debugappsettings.json (自動標准Asp.Net核心WebApplication的模板生成的),你將獲得的路由選擇是非常有用的信息/錯誤,同時在紅隼運行時在控制台輸出路徑選擇。

{
  "Logging": {
  "IncludeScopes": false,
  "LogLevel": {
    "Default": "Debug",
    "System": "Information",
    "Microsoft": "Debug"
}

或者將StartUp.cs的調試記錄器StartUp.csLogLevel.Debug並在Visual Studio中直接在調試輸出中獲得相同的信息。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        // ...

        loggerFactory.AddDebug(LogLevel.Debug);

        // ...
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM