当前位置: 首页 > 知识库问答 >
问题:

对于使用相同参数的多个REST API调用,最佳做法是什么

司寇凯
2023-03-14

我有一个接收各种参数的REST API列表,这些参数旨在搜索、过滤和返回数据到前端。

@GetMapping(value = "/api1", params = {"x,y,z,age,location"})
@GetMapping(value = "/api2", params = {"a,b,c,d,age,location"})
@GetMapping(value = "/api3", params = {"p,q,r,s,,age,location"})
@GetMapping(value = "/api4", params = {"p,q,r,s,,age,location"})
@GetMapping(value = "/api5", params = {"p,q,r,s,,age,location"})

正如您所注意到的,问题在于存在一些参数(年龄、位置),这些参数对于所有这些endpoint都是通用的。

我们的计划是,我们可能需要为所有这些endpoint引入一个新参数,如“性别”。是否有一种最佳实践可以跨API处理这些公共参数,这样我们就不需要修改每个控制器并添加新添加的请求参数?

控制器看起来像这样:

@RestController
public class UserFilterController {


    @GetMapping(path = "/api1")
    public ResponseEntity filterUserWithApi1(String x, String y, String z, String age, String location) {

        return new ResponseEntity(HttpStatus.OK);
    }

    @GetMapping(path = "/api2")
    public ResponseEntity filterUserWithApi2(String a, String b, String c, String age, String location) {

        return new ResponseEntity(HttpStatus.OK);
    }

    @GetMapping(path = "/api3")
    public ResponseEntity filterUserWithApi3(String d, String e, String f, String age, String location) {

        return new ResponseEntity(HttpStatus.OK);
    }

    @GetMapping(path = "/api4")
    public ResponseEntity filterUserWithApi4(String g, String s, String h, String age, String location) {

        return new ResponseEntity(HttpStatus.OK);
    }

    @GetMapping(path = "/api5")
    public ResponseEntity filterUserWithApi5(String j, String k, String l, String age, String location) {

        return new ResponseEntity(HttpStatus.OK);
    }

}

共有3个答案

逄嘉熙
2023-03-14

我相信您的查询参数是一个具有多个值的单一属性,并且年龄/位置是最后出现的一些其他强制查询参数。这就是我将如何编写已知给定参数的控制器

         @GetMapping(path = "/test")
        public Map<String, String> test(@RequestParam("alphabets") Set<String> alphabets,
                                        @RequestParam("age") int age,
                                        @RequestParam("location") String location) {
            final Map<String, String> responseMap = new HashMap<>();
            responseMap.put("alphabets", alphabets.toString());
            responseMap.put("age", Integer.toString(age));
            responseMap.put("location", location);
            return responseMap;
        }

此控制器的调用如下所示

http://localhost:8080/test?alphabets=a&age=1&location=test
http://localhost:8080/test?alphabets=a,b,c&age=1&location=test

现在,您可以基于字母表中的值创建连接。

非常感谢。

濮阳浩穰
2023-03-14

如果路径不相同,您不需要在注释中设置params字段,您可以简单地执行:

@GetMapping(path = "/api1")
public void myFunction( @RequestParam("age") String age, @RequestParam("location") String location, ... ) {
...
}

如果路径相同,也可以这样做,但需要在RequestParam注释中添加“required=false”,并手动处理当某些字段存在或不存在时的操作

左丘繁
2023-03-14

如果您不知道请求中将有多少个参数,可以使用@RequestParam作为映射,如下所示-

@GetMapping(path = "/api1")
public void test(@RequestParam Map<String, String> parameters) {
    //TODO
    String value1 = parameters.get("key1");
    ........
}

你可以通过下面的参数-

/api1?key1=value1&key2=value2...

或-

@GetMapping(path = "/api1/{age}/{location}")
public ResponseEntity filterUserWithApi1(@PathVariable("age") String age,
                                         @PathVariable("location") String location,
                                         @RequestParam("x") String x,
                                         @RequestParam("y") String y,
                                         @RequestParam("z") String z) {
    return new ResponseEntity(HttpStatus.OK);
}

请求-

/api1/24/earth?x=x_value&y=y_value&z=z_value

或-

@GetMapping(path = "/api1/{age}/{location}/{x}/{y}/{z}")
public ResponseEntity filterUserWithApi1(@PathVariable("age") String age,
                                         @PathVariable("location") String location,
                                         @PathVariable("x") String x,
                                         @PathVariable("y") String y,
                                         @PathVariable("z") String z) 
{
    return new ResponseEntity(HttpStatus.OK);
}

请求-

/api1/<age_value>/<location_value>/<x_value>/<y_value>/<z_value>
 类似资料:
  • 我的标题可能有点不恰当,但我真的不知道如何表述这个问题。 基本上,我有一个包含三列的数据库,其中包含文本字段。 我想从一列中提取所有值,并将它们分组为一个巨大的字符串,同时用\n分隔它们。 最后三个字符串应存储在单个字符串数组中。因此,我决定用三个列名查询数据库,并在整个表中循环: 我以前使用过类似的方法来连接所有三个字符串,但现在我需要在这三个值之间进行某种分隔。 检索完这些值后,我想将它们分别

  • 我需要来自不同Kafka主题的消费者消息, < li >我是否应该为每个主题创建不同的消费者实例,然后根据分区数量启动新的处理线程。或者 < li >我应该从单个消费者实例订阅所有主题,并且应该启动不同的处理线程 谢啦

  • 问题内容: 有没有一种方法可以使存根方法在后续调用中返回不同的对象?我想这样做是为了测试来自的不确定响应。即,不管方法的返回顺序如何进行测试,结果都保持恒定。 我要测试的代码看起来像这样。 问题答案: 你可以使用方法来做到这一点(与链接时): 或使用等效的静态doAnswer方法:

  • 问题内容: 我已经设计网站已有一段时间了,但是在使用PHP和HTML时我还不确定。像这样用PHP和HTML 编写整个文档是否更好: 或拥有一个类似HTML的文件,只需添加PHP: 似乎比HTML 整洁,尤其是在整个页面中使用大量PHP的情况下,但这样做会丢失HTML的所有格式,即IDE中的颜色等。 问题答案: 对此有不同的意见。我认为有两种好的方法: 使用像Smarty这样的模板引擎,它将代码和表

  • 我需要从数据库中选择一百个参数,然后在d to返回它来创建一个excel文件。 我使用的是spring数据,我认为有两种解决方案: > 使用multiselect方法,然后在DTO中定义一个包含所有参数的构造函数(参数数大于100) 使用multiselect方法并将数组(Object[])映射到DTO= 请问你还有其他的想法吗? 谢谢。

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我过去曾经做过Java和JSP编程,但是我是Java Server Faces的新手,并且想知道JSF开发是否有一套最佳实践。 问题答案: 一些提示:了解JS