弃用分页参数

永利:

我最近有一个将Spring REST分页参数“ page”和“ size”重命名为“ pageIndex”和“ pageSize”的请求。我的控制器将Pageable对象作为参数。也就是说,我知道可以通过设置以下属性来重命名这些参数,如下所示:

spring.data.rest.page-param-name=pageIndex
spring.data.rest.limit-param-name=pageSize

但是,由于我正在开发的API正在被其他开发人员积极使用,因此我需要弃用而不是删除“ page”和“ size”参数(同时继续让api尊重其值),同时支持新的可分页的参数名称。我浏览了各种文档和文章,经过一天的搜索,我仍然不清楚如何完成此任务。

我的控制器方法如下所示:

@ApiPageable
@RequestMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE, method = RequestMethod.GET)
public Page<MyBean> getBeans(@RequestParam(required = false) final String blah,
                               final Pageable pageable) {

    return someService.doSomething(blahStr, pageable); 
}

在此先感谢您,如果在我搜索的那一天,我可能会错过我正在寻找的关键文档,请为我指明方向并接受我的歉意。

编辑:澄清一下这个问题...重命名不涉及更改url。实际上,URL必须保持相同。相反,要重命名的是一组URL分页参数要明确的是,如果此问题所属的端点看起来像这样,并且不包括在(但不限于)以下内容的某些排列或组合中通常使用的一组常见的分页参数:

/beans
/beans?page=2
/beans?size=5
/beans?page=2&size=5
/beans?sort=created,ASC&page=4&size=6

...然后使用相同的网址(但所有必需参数都标记为false)创建第二个端点,当我尝试运行API时给了我一个模糊的映射。因此,除非有一种巧妙的方法来区分这些端点(使用过时的参数的端点和使用新的参数的新端点),否则该解决方案似乎将需要两个以上的端点,... 或者最好有一个光滑的“银色子弹” “解决这个问题的方式

mentallurg:

使用两个端点:一个使用不推荐使用的API,另一个使用新的API。在已弃用的API中,将已弃用的参数转换为新参数,调用内部服务,将响应转换为已弃用的响应。

稍后,在所有客户端迁移到新的API之后,或在预定义的迁移期之后,您可以决定删除不建议使用的端点。

更新资料

对于无法(或不想使用)已更改API的客户端,请提供一个实现旧API的端点。此方法如下所示:

@GetMapping(path = "/oldapi/...")
public Page<MyBean> getBeans(
    @RequestParam(required = false) final String blah,
    @RequestParam(value = "pageSize", required = false) Integer pageSize,
    @RequestParam(value = "pageNum", required = false) Integer pageNum,
    @RequestParam(value = "sort", required = false)
) {
    // Create Pageable object from request parameters
    ...
    // Call service or repository with this pageable
    ...
}

在这种方法中,您可以使用任何参数名称。对于那些需要旧名字的人,您可以保留旧名字。

关于端点的数目:我的意思恰好是2个端点:一个端点的API名称保持不变,另一个端点发生变化(您写道,我最近有一个重命名的请求...

更新2

支持2个版本的API的好方法是使用2个端点如果您想通过单个端点提供2个API,那么这很容易出错。在简单的情况下,这是可能的。例如,您定义方法如下:

@GetMapping(path = "/oldapi/...")
public Page<MyBean> getBeans(
    @RequestParam(value = "size", required = false) Integer size,
    @RequestParam(value = "pageSize", required = false) Integer pageSize,
    @RequestParam(value = "page", required = false) Integer page,
    @RequestParam(value = "pageIndex", required = false) Integer pageIndex,
    ...
) {
    Integer pSize = pageSize != null ? pageSize : size;
    Integer pIndex = pageIndex != null ? pageIndex : page;
    ...
}

保留此类代码可能非常复杂。例如,如果某些参数是强制性的,那么它很复杂并且易于在单个端点上实现它,但是如果您有2个不同的端点,则非常容易。不鼓励您使用这种方法。

我的建议:对于那些想使用不赞成使用的API的人,请提供一个单独的终点。他们不必更改其代码,只需更改配置参数以指向已弃用API的端点。如果他们仍然想使用不赞成使用的API,这对他们来说是正常的价格。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章