Это приложение построено на ASP.Net Core (.NET Core 2.1).Я пытаюсь настроить контроллер (см. RiskController
ниже) для поддержки следующего через http get:
- Получение по идентификатору (
/api/risk/0000001
) должно возвращать один график риска - Поиск по имени (
/api/risk/some%20company%20name
) должен возвращать массив результатов поиска - Проверка идентификатора (
/api/risk/0000002/validate
) должна возвращать true / false, если идентификатор существует
Довольнопростые вещи, и все это работает, когда значения параметров идеально подходят для каждого действия.Я использую регулярное выражение для ограничения действий, и это очень помогает.
Объявление моего контроллера:
[Produces( "application/json" )]
[Route( "api/[controller]" )]
[Authorize]
[ApiController]
public class RiskController : ControllerBase
Действие get by ID:
// GET api/risk/0000001
[HttpGet( "{riskId:regex(^\\d{{7}}|(SI[[PG]]|JPA|DEM)\\d{{4}})}", Order = 0 )]
public async Task<IActionResult> Get( string riskId ) { ... }
Поискдействие по имени:
// GET api/risk/some%20company%20name
[HttpGet( "{name:length(2,30)}", Order = 1 )]
public async Task<IActionResult> Search( string name ) { ... }
Действие проверки идентификатора:
// GET api/risk/0000001/validate
[HttpGet( "{riskId:regex(^\\d{{7}}|(SI[[PG]]|JPA|DEM)\\d{{4}})}/[action]", Order = 2 )]
public async Task<IActionResult> Validate( string riskId )
Идентификаторы всегда представляют собой строки из 7 цифр или начинаются с SIP, SIG, JPA или DEM, за которыми следуют 4 цифры (однанапример: «0000002», «SIP0003», «SIG0004», «JPA0005» ИЛИ «DEM0006»).
Теперь дело, которое меня расстроило, - это когда пользователь входит, скажем, nine цифра в поле поиска по имени.Поиск по имени должен вызвать API с /api/risk/000000019
.И это должно быть обработано приведенным выше действием find by name .Но регулярное выражение ограничения для вышеуказанного действия get by ID по какой-то причине соответствует девятизначному числу, которое, конечно, не находит запись.И пользователь видит ошибку.Однако, если пользователь вводит, скажем, четырехзначное число в поле поиска по имени, вызов /api/risk/0004
соответствует приведенному выше действию поиска по имени и работает как следует.,
Не должна ли часть \d{7}
ограничения действия get by ID regex соответствовать ровно 7 цифрам и больше?/api/risk/000000019
определенно не соответствует второй половине регулярного выражения: (SI[PG]|JPA|DEM)\d{4}
!
Любой совет?