存储 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 支持两种类型的路由。
- 基于约定的路由
- 属性路由。
您可以在 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);
}
我有一个 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 支持两种类型的路由。
- 基于约定的路由
- 属性路由。
您可以在 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);
}