MVC APIController с пользовательскими именами - PullRequest
1 голос
/ 25 июня 2019

Итак, я новичок в netcoreapp, и я пытаюсь преобразовать мой старый API для отдыха в новый.

Проблема в том, что у меня проблемы с использованием имени и параметров пользовательских методов.

Я хочу только [HttpGet] или [HttpPost], а затем действие и параметр.

Так например

[HttpGet]
public List<string> GetStrings(string firstString, string lastString){
 // my code here
}

и затем я пытаюсь назвать это, который не работает вообще

baseUrl/controller/GetStrings?firstString=test&lastString=test2

См. Мой контроллер ниже, чтобы понять мою проблему

[ApiController]
[Route("api/[controller]")]
public class YoutubeController : ControllerBase, IYoutubeController
{
    [HttpPost]
    public async Task<YoutubeVideoInfo> GetVideoAsync(string videoId)
    {
        // my code
    }

    [HttpGet]
    public List<YoutubeItem> Playlist([FromQuery]string playlistId)
    {
        // My code
    }

    [HttpGet]
    public YoutubeVideoCollection Search(string searchString, int pageSize = 50, string relatedTo = null, VideoSearchType videoSearchType = VideoSearchType.Videos)
    {
     // my code
    }
}

}

Я попробовал поиск вызовов вот так, но безуспешно

https://localhost:44330/Youtube.Manager.Core.API/api/Youtube/Search?searchString=Eminem&pageSize=20&relatedTo=&videoSearchType=Videos

А это мой конфиг маршрутизации

  app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "api/{controller=Home}/{action=Index}/{id?}"
                );
        });

Есть ли какая-либо другая конфигурация, которую я должен иметь, а также, пожалуйста, я не хочу слишком указывать что-либо в моем [HttpGet] Атрибуте.

В сетевом фреймворке у меня есть WebApiConfig, который мог бы обрабатывать такие операции. Нет ли ничего подобного в netcoreapp?

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Чтобы имя действия было частью маршрута, необходимо обновить атрибут [Route(..)], чтобы учесть действие.Вы уже используете токен [controller] в своем примере, поэтому просто добавьте [action]:

[Route("api/[controller]/[action]")]

Подробное описание замены токена см. В документах .

1 голос
/ 25 июня 2019

Украсьте свой контроллер так:

[ApiController]
[RoutePrefix("api/[controller]")]
public class YoutubeController : ControllerBase, IYoutubeController
{
    [HttpPost, Route("GetVideoAsync")]
    public async Task<YoutubeVideoInfo> GetVideoAsync(string videoId)
    {
        // my code
    }

    [HttpGet, Route("Playlist")]
    public List<YoutubeItem> Playlist([FromQuery]string playlistId)
    {
        // My code
    }

    [HttpGet, Route("Search/{searchString}/{pageSize}/{relatedTo}/{videoSearchType}")]
    public YoutubeVideoCollection Search(string searchString, int pageSize = 50, string relatedTo = null, VideoSearchType videoSearchType = VideoSearchType.Videos)
    {
     // my code
    }
}

И добавьте следующую строку в ваш RouteConfig:

routes.MapMvcAttributeRoutes();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...