ASP. NET Базовый API - Dynami c Маршрутизация (Маршрут API ведет себя как «строка запроса с одним параметром») - PullRequest
0 голосов
/ 09 января 2020

Алоха: D Я хотел бы создать динамическую c привязку маршрута. Под этим я подразумеваю замену строки запроса динамическим c маршрутом.

Пример: Вместо этого:

POST http://localhost:5000/api/documents?templatename=individualemploymentagreement

this:

POST http://localhost:5000/api/documents/individualemploymentagreement

Примечание: после "http://localhost: 5000 / api / documents / " Я хочу поставить все, что захочу, но этот маршрут всегда будет использоваться, а то, что будет после, должно быть используется как переменная. Очевидно, что это приведет к несуществующему API Route на данный момент. Но есть ли способ справиться с этим?

Примечание 2: Причины, по которым я хочу это использовать: - Согласно "правилам" сервисов RESTful, строки запроса следует использовать только для запросы, в этом случае я не использую запрос, я вызываю стандартную службу документов c, которая, однако, обрабатывает каждый документ немного по-разному, когда это необходимо. Поэтому строки запроса не рекомендуются в моем случае. - Этот сервис будет работать с сотнями типов документов, поэтому я не могу по-разному указать путь / API для каждого из них. Так что это также не рекомендуется.

Мой код (в котором я использую строку запроса для {templateName}:

namespace DocumentGenerator.Api.Controllers
{
    [Route("api/{controller}")]
    [ApiController]
    public class DocumentsController : ControllerBase
    {
      //useless details

        [HttpPost]  
        public async Task<IActionResult> Generate([FromQuery] string templateName, [FromBody] object properties)
        {
            // according to {templateName} do this or that...
            // useless details
        }
     }
}

Что Я хотел бы в коде :

 namespace DocumentGenerator.Api.Controllers
    {
        [Route("api/{controller}")]
        [ApiController]
        public class DocumentsController : ControllerBase
        {
          //useless details

            [HttpPost("{templateName}"]  
            public async Task<IActionResult> Generate([FromBody] object properties)
            {
                // according to {templateName} do this or that...
                // useless details
            }
         }
    }

1 Ответ

2 голосов
/ 09 января 2020

Вы можете указать имя параметра в качестве значения атрибута маршрута в HttpPost:

[HttpPost("{templateName}"]  
public async Task<IActionResult> Generate(string templateName, [FromBody] object properties)
{
}

или даже

[HttpPost("/api/documents/{templateName}"]  
public async Task<IActionResult> Generate(string templateName, [FromBody] object properties)
{
}
...