Маршруты веб-API для поддержки идентификаторов GUID и целочисленных идентификаторов
Как я могу поддерживать маршруты GET
как для GUID, так и для целого? Я понимаю, что GUID не идеальны, но это то, что сейчас. Я хочу добавить поддержку целых чисел, чтобы пользователи могли запоминать и сообщать, какие должны быть уникальные "ключи".
Примеры маршрутов:
testcases/9D9A691A-AE95-45A4-A423-08DD1A69D0D1
testcases/1234
Мой WebApiConfig
:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
var routes = config.Routes;
routes.MapHttpRoute("DefaultApiWithAction",
"Api/{controller}/{action}");
routes.MapHttpRoute("DefaultApiWithKey",
"Api/{controller}/{key}",
new { action = "Get" },
new { httpMethod = new HttpMethodConstraint(HttpMethod.Get), key = @"^\d+$" });
routes.MapHttpRoute("DefaultApiWithId",
"Api/{controller}/{id}",
new { action = "Get" },
new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
routes.MapHttpRoute("DefaultApiGet",
"Api/{controller}",
new { action = "Get" },
new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
routes.MapHttpRoute("DefaultApiPost",
"Api/{controller}",
new { action = "Post" },
new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) });
}
Мой контроллер (только для сигнатур метода):
[RoutePrefix("Api/TestCases")]
public class TestCasesController : PlanControllerBase
{
[Route("")]
public OperationResult<IEnumerable<TestCaseDTO>> Get([FromUri] TestCaseRequest request)
[Route("{id}")]
[HttpGet]
public OperationResult<TestCaseDTO> Get(Guid id)
[Route("{key}")]
[HttpGet]
public OperationResult<TestCaseDTO> Get(int key)
...
}
Я получаю внутреннюю ошибку сервера, когда пытаюсь вызвать ресурс с помощью целого числа. Любая помощь приветствуется!
Ответы
Ответ 1
Спасибо @SirwanAfifi! Я столкнулся с Attribute Routing в ASP.NET, о котором упоминается в вопросе SO, о котором вы упомянули, но, видимо, я не видел необходимости ограничения атрибутов маршрута в то время.
Для меня это использовало [Route("{id:guid}")]
и [Route("{key:int}")]
в моих методах контроллера, которые сделали трюк. Я также прокомментировал маршруты Http, связанные с {id}
и {key}
, в моем WebApiConfig
, чтобы убедиться, что атрибуты в контроллере несут ответственность за выполнение маршрутизации.