我一直在尝试使用 Content Negotiation 作为 SpringBoot/Kotlin 应用程序的后端版本控制。我有以下几点:
@GetMapping("/user", produces = [MediaType.APPLICATION_JSON_VALUE])
fun getUsers() {
//some code here
}
Run Code Online (Sandbox Code Playgroud)
我发现这个项目结合了“接受”标头和“接受版本”自定义标头。我想知道这是否是实现内容协商方法的正确方法,如果不是,我该如何解决?
@GetMapping("/user", produces = [MediaType.APPLICATION_JSON_VALUE], headers = ["Accept-Version=$CUSTOM_ACCEPT_HEADER"])
fun getUsers() {
//some code here
}
object VersioningUtility {
const val CUSTOM_ACCEPT_HEADER = "vnd.sample.com-v1+json"
//here more constants as each controller can be versioned independently
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我在使用 API Gateway + Lambda 实现可行的版本控制方案时遇到问题。我的要求是在 API 级别进行主要版本控制,然后在服务级别进行次要版本控制。我的环境也分布在各个帐户中,因此暂存不是 env 传播的选项。有没有人使用 AWS API Gateway 成功实现 API 管理?
amazon-web-services aws-lambda api-versioning aws-api-gateway
我们可以ProductsAPI浏览我们网站上可用的产品,这些产品由我们的移动应用程序(Android 和 iOS)使用。以下是基本设计:
URL: /api/products/
Response:
[
{
"id" : 123,
"name" : "abc",
"detailsUrl" : "/api/products/123"
},
{
"id" : 124,
"name" : "xyz",
"detailsUrl" : "/api/products/124"
}
]
Run Code Online (Sandbox Code Playgroud)
此处detailsUrl包含ProductDetails页面的 API URL 。
现在,我们需要ProductDetails在新版本的应用程序中对API的响应进行一些更改,并且需要对其进行版本控制。URL 将更改为 - /api/v2/products/{id}(我们通过 URL 使用 API 版本控制)。
由于我们不想要以前版本的应用程序中的新响应,我们需要创建一个新版本的ProductsAPI也将发送新的ProductDetailsAPIurl 作为响应。
API 以这种方式耦合。如果我们更改任何子 API 的版本,则父 API 版本也需要更改。处理此问题的推荐方法是什么?我们是否应该改变我们的 API 版本控制方式(使用标头或其他东西)?
我有ASP.net Web Api项目,因此我决定该支持版本了。我正在使用官方的Microsoft Nuget支持版本控制(更多信息在此处),我决定按名称空间进行版本控制(如此处所示)。
不幸的是我无法使代码正常工作。如果我这样调用我的方法:
http://localhost:7291/api/Saved/GetNumberOfSavedWorkoutsForUser?api-version=2.0
Run Code Online (Sandbox Code Playgroud)
我得到错误:
Multiple types were found that match the controller named 'Saved'. This can happen if the route that services this request ('api/{controller}/{action}/{id}') found multiple controllers defined with the same name but differing namespaces, which is not supported.
Run Code Online (Sandbox Code Playgroud)
如果我这样称呼它: http://localhost:7291/v2/Saved/GetNumberOfSavedWorkoutsForUser
我收到错误404:
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
Run Code Online (Sandbox Code Playgroud)
我不确定自己在做什么错。这是我的代码:
启动文件
public void Configuration(IAppBuilder app)
{
var configuration = new HttpConfiguration();
var …Run Code Online (Sandbox Code Playgroud) 我正在使用Asp.Net Core 3.1来构建我的 API。我正在使用 swagger 为我的 API 生成文档。我决定根据控制器对我的 swagger 文档进行分组。所以我最终这样做了,
启动 - 配置服务:
options.SwaggerDoc(
"LibraryOpenAPISpecificationCategories",
...
Run Code Online (Sandbox Code Playgroud)
启动 - 配置:
options.SwaggerEndpoint(
"/swagger/LibraryOpenAPISpecificationCategories/swagger.json",
"Library API (Categories)");
Run Code Online (Sandbox Code Playgroud)
控制器:
[Route("api/categories")]
[ApiController]
[ApiExplorerSettings(GroupName = "LibraryOpenAPISpecificationCategories")]
public class CategoriesController : ControllerBase
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切正常。当我添加版本控制时,Swagger 文档停止显示控制器中的方法。我试图在版本中进行分组,以便每个版本都有这样的组,
V1 -> LibraryOpenAPISpecificationCategories
V1 -> LibraryOpenAPISpecificationItems
V2 -> LibraryOpenAPISpecificationCategories
V2 -> LibraryOpenAPISpecificationItems
这是我所做的,
启动 - 配置服务:
services.AddVersionedApiExplorer(options =>
{
options.GroupNameFormat = "'v'VV";
});
services.AddApiVersioning(options =>
{
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
options.ReportApiVersions = true;
});
var apiVersionDescriptionProvider = …Run Code Online (Sandbox Code Playgroud) 我一直试图在 Symfony 中寻找版本控制的解决方案。在 Symfony 中进行 API 版本控制的最佳方法是什么。在 Laravel 这很简单,请看这里
您只需将 V1/V2 等不同文件夹中的所有内容分开,然后创建指向该文件夹(命名空间)的路由。但 Symfony 的工作方式不同,它使用注解来创建路由
我开始使用 nextjs 和 Vercel 部署构建一个 API。设置非常简单,只需在pages/api/. 例如创建端点/shows,/movies我/sports有:
./pages/api/
/shows
/movies
/sports
Run Code Online (Sandbox Code Playgroud)
这很好,但我想像这样对 API 进行版本控制:/v1/shows/、/v1/movies等等。
如果我可以基于 git commit 标签进行版本控制就更好了。也就是说,当我合并到main分支时,Vercel 要么部署到当前的生产环境(例如 v1 env),或者如果有新的 git 标签,它就会部署到新的生产环境(例如 v2 env)。部署后,两个生产环境将上线(v1 和 v2),因此旧客户端不会中断。
有没有办法用 Vercel 做到这一点?或者我缺少更简单的方法吗?其他人如何使用 nextjs 处理 API 版本控制?我对想法持开放态度!
我正在尝试将 URL 版本控制引入到我的 .Net Core WebAPI 应用程序中。我还使用 Swagger Web 工具以方便用户使用。
现在,在尝试将版本控制引入我的应用程序时,我在这里引用了文档:https : //github.com/Microsoft/aspnet-api-versioning/wiki/New-Services-Quick-Start#aspnet-core
现在,我对我的代码进行了以下代码更改:
Startup.cs/ConfigureServices 我在下面添加了代码:
services.AddApiVersioning(options => {
options.AssumeDefaultVersionWhenUnspecified = true;
});
Run Code Online (Sandbox Code Playgroud)
现在,在添加任何类型的版本控制之前,我的控制器注释如下所示:
[Produces("application/json")]
[Route("api/controllerName")]
Run Code Online (Sandbox Code Playgroud)
并生成一个如下所示的 URL:
http://localhost:12003/swagger/#!/Workspace/GetAll
现在,我在下面添加了注释以启用 api 版本控制:
. [ApiVersion("1.0")]
[Produces("application/json")]
[Route("api/v{version:apiVersion}/workspace")]
现在当我点击我的 swagger UI 中列出的相同方法时
网址如下所示:
http://localhost:12003/swagger/#!/controllername/ApiV_versionGetAll
虽然我期待的是这样的:
http://localhost:12003/swagger/#!/controllername/V1.0/GetAll
同样在我的招摇中,它现在明确要求我输入版本号。所以我认为我的问题归结为两个要点:
restful-url swagger api-versioning asp.net-core asp.net-core-webapi
api ×2
c# ×2
swagger ×2
asp.net-core ×1
asp.net-mvc ×1
aws-lambda ×1
hateoas ×1
kotlin ×1
next.js ×1
rest ×1
restful-url ×1
spring-boot ×1
swashbuckle ×1
symfony ×1
symfony4 ×1
vercel ×1