У меня возникли проблемы с выяснением того, как настроить более сложные схемы маршрутизации для моего 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 }
);
}
}
}
Вы можете использовать маршрутизацию атрибутов, если используете 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 до сопоставления маршрутов.