. Net Базовая конечная точка API не допускает параметры QueryString - PullRequest
0 голосов
/ 20 марта 2020

Очень возможно, что это дубликат, но я посмотрел и не могу найти ответ. Первый ответ здесь выглядел многообещающе: Строка запроса не работает при использовании маршрутизации атрибута Но я попробовал это, и это не сработало.

[HttpGet, Route("api/machine/byid/{id=id}/{pageNumber=pageNumber}/{pageSize=pageSize}/{fields=fields}")]
public string ById(int id, int pageNumber, int pageSize, string fields)
    // code removed
}

Это работает:

https://localhost:44303/api/machine/byid/1/2/3/a,b,c

Это не так:

https://localhost:44303/api/machine/byid?id=1&pageNumber=2&pageSize=3&fields=a,b,c

Второй URL возвращает:

{"type": "https://tools.ietf.org/html/rfc7231#section -6.5.1 " , "title": "Произошла одна или несколько ошибок проверки.", "status": 400, "traceId": "| bf12950b-472923d3a24062d1.", "errors": {"id": ["Значение 'id' равно недопустимо. "]," pageSize ": [" Недопустимое значение pageSize ".]," pageNumber ": [" Недопустимое значение pageNumber ".]}}

Ответы [ 3 ]

2 голосов
/ 20 марта 2020

Вам потребуется два маршрута:

[HttpGet("api/machine/byid")]
public string ById(
    [FromQuery("id")] int id, 
    [FromQuery("pageNumber")] int pageNumber, 
    [FromQuery("pageSize")] int pageSize, 
    [FromQuery("fields")] string fields)
{
}

Для получения дополнительной информации перейдите по этой ссылке

1 голос
/ 20 марта 2020

В приведенном вами примере демонстрируются параметры маршрута. Существует четкое различие между параметрами маршрута и параметрами запроса.

Чтобы выполнить sh параметры запроса, вы можете [FromQuery] указать атрибуты вашего метода. Это позволит для предоставленного вами примера параметра запроса:

Пример: https://localhost:5000/api/persons?firstName=bob&lastName=smith

Вы также можете указать значения по умолчанию для них из параметров вашего метода. Вы можете объединить несколько параметров запроса в одно действие.

Для параметров маршрута параметры предоставляются через сам маршрут.

Пример: https://localhost:5000/api/persons/23

Эти параметры определены в атрибуте [HttpGet("{id}")] действия вашего контроллера. Вы также можете ограничить параметр определенным типом, например int. Это достигается добавлением двоеточия и указанием типа. Пример [HttpGet("{id:int}")]. Никаких дополнительных атрибутов не требуется добавлять в параметры вашего метода для параметров маршрута.

Конечно, вы должны также объявить эти параметры в параметрах вашего метода для обоих типов.

// "/api/persons/23"
[HttpGet("{id}")]
public async Task<IActionResult> GetPersonById(int id)
{
    // Code ...
}

// "/api/persons?firstName=bob&lastName=smith"
[HttpGet]
public async Task<IActionResult> GetPersonByName([FromQuery] string firstName = null, [FromQuery] string lastName = null)
{
    // Code here... both firstName and lastName can now be optional or only one provided
}
0 голосов
/ 20 марта 2020

Ответ от sturcotte06 был близок, но не соответствовал требованиям ядра на 100%. Это работает:

[HttpGet, Route("api/machine/byid/{id=id}/{pageNumber=pageNumber}/{pageSize=pageSize}/{fields=fields}")]
public string ById([FromQuery] int id, [FromQuery] int pageNumber, [FromQuery] int pageSize, [FromQuery] string fields)
{
    // code removed
}
...