存储 API 路线的最佳方式

Best way to store API routes

我有一个 Web 应用程序 API 和此 API 的客户端库。我还添加了一个共享库,其中包含 API 个端点路由。

这是一个示例:

public static class Routes
{
    /// <summary>
    /// Default Uri separator.
    /// </summary>
    private const string Slash = "/";

    /// <summary>
    /// Default API endpoint prefix.
    /// </summary>
    private const string Prefix = $"api{Slash}";

    /// <summary>
    /// API version.
    /// </summary>
    private const string Version = $"v1{Slash}";

    /// <summary>
    /// Base API route.
    /// </summary>
    private const string Base = $"{Prefix}{Version}";

    /// <summary>
    /// Static class that contains users API endpoint routes.
    /// </summary>
    public static class Users
    {
        /// <summary>
        /// Base controller route.
        /// </summary>
        private const string Controller = $"{Base}{nameof(Users)}{Slash}";

        /// <summary>
        /// Users list endpoint route.
        /// </summary>
        public const string List = $"{Controller}{nameof(List)}";

        /// <summary>
        /// User registration endpoint route.
        /// </summary>
        public const string Register = $"{Controller}{nameof(Register)}";
    }
}

Note: this is C# 10 with the new Constant Interpolated Strings feature.

以这种方式存储路由,我可以在 API 控制器声明和对这些端点的 API 调用中轻松使用它们。但是我很好奇,也许有更好的方法来做到这一点?

您将如何实现共享 API 路由功能?提前致谢。

对 API 路由使用常量是标准方法。我认为没有比这更好的方法了。只是一个小提示 - 您在用户 class 中使用 nameof(),如果有人更改 class 名称,这可能会很脆弱。您真的希望重命名用户 class 会导致更改您的路线吗?

您不能使用配置,因为配置值是在运行时读取的,而 Route() 属性值(作为所有属性)必须在编译时填充。

如您所知,Web API 路由类似于 ASP.Net MVC 路由。 Web API 支持两种类型的路由。

  1. 基于约定的路由
  2. 属性路由。

您可以在 web 中配置多个路由 api。

例子-

public static class WebApiConfig
{
                public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
    
                // school route
        config.Routes.MapHttpRoute(
            name: "School",
            routeTemplate: "api/myschool/{id}",
            defaults: new { controller="school", id = RouteParameter.Optional }
            constraints: new { id ="/d+" }
        );

                // default route
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

而且你还可以使用属性路由,最好在你的应用中添加多个路由。您可以控制您的方法并通过属性路由添加前缀。

示例:

[RoutePrefix("api/")] 

[Route("api/{employees}/{id}")]  
public Employee GetDetails(int id)  
{  
    return listEmp.First(e => e.ID == id);  
}