Как получить маршрут REST API, такой как / api / library / 1 / books / 2 / dosomething? Q = params с WebAPI?

1

У меня возникли проблемы с выяснением того, как настроить более сложные схемы маршрутизации для моего REST API в веб-службе, которую я разрабатываю с помощью.NET WebAPI. У меня есть ресурсы с прямой иерархией, в которой я хочу, чтобы пользователь мог запрашивать и выполнять действия. Представьте себе следующий теоретический сценарий:

У меня есть несколько библиотек, каждый из которых имеет много книг, каждый из которых я могу проверить, получить информацию или вернуться. Пользователь должен иметь возможность выполнять эти действия через запросы по моему REST API.

Представьте следующий запрос GET, чтобы получить информацию о книге с идентификатором 10 в библиотеке с идентификатором 2:

/api/libraries/2/books/10

Или следующий запрос GET, чтобы получить историю проверки между двумя датами:

/api/libraries/2/books/10/getHistory?startTime=20130101120000&endTime=20140101120000

Как настроить маршрутизацию в WebAPI, чтобы иметь такую структуру API? Я предполагаю, что в LibrariesController.cs:

public IEnumerable<CheckoutTransaction> GetCheckoutHistory(long libraryId, long bookId, long startTime, long endTime);

Мой файл WebApiConfig.cs прост, со следующим содержимым:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace ExperimentalService
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}
Теги:
rest
asp.net-web-api
asp.net-mvc-4

1 ответ

2
Лучший ответ

Вы можете использовать маршрутизацию атрибутов, если используете Web API 2.

"/api/libraries/2/books/10"

[HttpGet]
[Route("api/libraries/{libraryid}/books/{bookid}")]
public IHttpActionResult GetBook(int libraryId, int bookId)
{
    // Code
}

"/api/libraries/2/books/10/getHistory?startTime=20130101120000&endTime=20140101120000"

[HttpGet]
[Route("api/libraries/{libraryid}/books/{bookid}/getHistory")]
public IHttpActionResult GetHistory(int libraryId, int bookId, 
                                    [FromUri] DateTime startTime, 
                                    [FromUri] DateTime endTime)
{
    // Code
}

Вам также необходимо включить маршрутизацию атрибутов, включив config.MapHttpAttributeRoutes(); в конфигурации веб-API до сопоставления маршрутов.

  • 0
    Круто, большое спасибо. Есть ли способ определить этот атрибут Route в RouteConfig? Приятно видеть всю маршрутизацию в одном месте, чтобы получить быстрый взгляд на структуру API (но, может быть, лучшая практика - это маршрутизация выше каждого отдельного метода? Я не уверен, что есть лучшая практика ...)
  • 0
    Это выглядело разумно, но, похоже, не работает. Я установил это в своем контроллере, но я получаю 404, когда пытаюсь получить доступ к этим методам get из моего браузера (из-за отсутствия Visual Studio). Например, localhost: 1287 / api / Libraries / 2 / books / 1 - пример, который я пробую, и он никогда не подходит к описанному здесь методу
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню