如何获得像/ API /libraries/1/books/2/dosomething这样的REST API路由?q=

本文关键字:API REST 路由 何获得 libraries books dosomething | 更新日期: 2023-09-27 18:03:46

我正在用。net WebAPI开发一个web服务,我很难弄清楚如何为我的REST API设置更复杂的路由方案。我有一些资源具有直接的多用户层次结构,我希望用户能够对其进行查询和执行操作。想象下面的理论场景:

我有一些图书馆,每个图书馆都有很多书,我可以借阅、获取信息或归还。用户应该能够通过我的REST API上的请求来执行这些操作。

设想以下GET请求,以获取ID为2的图书馆中ID为10的图书的信息:

/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 }
            );
        }
    }
}

如何获得像/ API /libraries/1/books/2/dosomething这样的REST API路由?q=

如果你使用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
}

您还需要在路由映射之前在您的Web API配置中包括config.MapHttpAttributeRoutes();来启用属性路由。