我怎样才能通过在请求中传递特定参数来获取它们? SpringBoot API

Posted

技术标签:

【中文标题】我怎样才能通过在请求中传递特定参数来获取它们? SpringBoot API【英文标题】:How could I get specific parameters just by passing them in the request? SpringBoot API 【发布时间】:2021-12-24 15:20:29 【问题描述】:

我正在努力寻找解决方案... 我想知道如何获取通过请求传递的指定参数,而无需在 Spring Boot API 中编写每个特定案例。

例如,在我的例子中,我有这个 JSON 对象:


"id": 3,
"name": "test",
"dominio": "dom",
"altas": "6",
"bajas": "2",
"default_group": [
    
        "idRef": 1,
        "name": "Users",
        "path": "OU=es"
    
],
"office": [
    
        "idRef": 1,
        "title": "Intern",
        "name": "CN=Office license",
        "path": "OU=licenseOffice"
    ,
    
        "idRef": 2,
        "title": "Specialist",
        "name": "CN=Office License F3",
        "path": "OU=LicenseGroupF"
    
]

除此之外,我的代码中定义了所有实体,但我想仅使用它们的名称访问它们的参数之一,例如 name、dominio、altas、bajas、default_group 或 office。

这样做的目的是不必为每个参数编写每个方法。

我不必为嵌套对象(office 和 default_group)执行此操作,只需通过参数名称从它们那里获取信息。

所以我想做这样的事情:

GET --> localhost:8080/api/3/name

这将返回 id 为 3 的对象的名称

或者这样做:

GET --> localhost:8080/api/3/default_group

这将返回包含所有 default_groups 的数组。

除此之外,我想知道是否可以对执行相同操作的方法执行 PUT 请求。

不知道能不能做到,如果可以的话,能不能给点指导之类的……

非常感谢

编辑。感谢@daniu,我让它完美运行,我根据他的评论将我的解决方案粘贴在这里,如果有人觉得它有帮助。我的对象名为“Compania”。

@GetMapping("/companiaId/field_name")
public Object queryField(
        @PathVariable("companiaId") Long companiaId,
        @PathVariable("field_name") String fieldName) 
    Map<String, Function<Compania, Object>> fieldRetrievers = Map.of(
            "name", Compania::getName,
            "dominio", Compania::getDominio,
            "altas", Compania::getAltas,
            "bajas", Compania::getBajas,
            "default_group", Compania::getDefault_group,
            "office", Compania::getOffice
    );

    Compania c = companiaService.getCompaniaNotOpt(companiaId);
    Function<Compania, Object> retriever = fieldRetrievers.get(fieldName);
    return retriever.apply(c);

getCompaniaNotOpt 是一种接受 Compania 而不是 Optional 的方法,因此它可以工作。

谢谢大牛。

【问题讨论】:

【参考方案1】:

我不会认为这是最简洁的设计,但可行的是创建一个包含所有字段访问器名称的 Map

 Map<String, Function<YourClass>> fieldRetrievers = Map.of(
   "name", YourClass::getName,
   "default_group", YourClass::getDefaultGroup,
   "office", YourClass::getOffice
 );

然后你可以在你的控制器中使用它(实际上是服务,但在这里保持简短):

@GetMapping("/path/field_name")
Object queryField(@PathVariable("field_name") String fieldName) 
  YourClass c = getObject();
  Function<YourClass, Object> retriever = fieldRetrievers.get(fieldName);
  return retriever.apply(c);

【讨论】:

有效!! .您知道是否可以将其应用于 PUT 请求,使用 set 方法而不是 getmethods? @Varox 如果您只想设置一个值,我不明白为什么不这样做。否则,您将不得不处理键/值对;您可能可以使用带有字段/值对的Map 作为参数。 很抱歉再次打扰您,但是您知道我怎样才能添加类似:“ value:retriever.apply(c)”的json格式。如果我尝试添加它,它会返回一个纯文本响应,我想添加一个具有该方法返回值的变量 请将后续问题作为新问题发布,而不是在已回答问题的讨论中。

以上是关于我怎样才能通过在请求中传递特定参数来获取它们? SpringBoot API的主要内容,如果未能解决你的问题,请参考以下文章

struts2怎样获取AJAX post请求传递的数据

Android 两个Activity之间怎样使用Uri传递图片,怎样获取图片的Uri,怎样通过Uri得到图片

VBA传两个参数报错

我怎样才能在声明中的JMeter JDBC请求日期类型参数

在servlet中怎样获取jsp中下拉列表中的值

将php变量传递给角度