首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让Swagger UI显示类似的Spring Boot REST端点?

如何让Swagger UI显示类似的Spring Boot REST端点?
EN

Stack Overflow用户
提问于 2018-08-16 00:40:02
回答 4查看 2.1K关注 0票数 4

我有一个有两个端点的控制器类。

代码语言:javascript
复制
@RestController
@RequestMapping
public class TestController {

  @RequestMapping(
          value= "/test",
          method = RequestMethod.GET)
  @ResponseBody
  public String getTest() {
    return "test without params";
  }

  @RequestMapping(
          value= "/test",
          params = {"param"},
          method = RequestMethod.GET)
  @ResponseBody
  public String getTest(@PathParam("param") int param) {
    return "test with param";
  }

}

一个有参数,另一个没有,两个都能工作。

如果我使用curl或web浏览器访问端点

http://localhost:8081/test

返回

不带参数的

检验

http://localhost:8081/test?param=1

返回

带参数的

测试

但是swagger ui只显示没有参数的ui。

如果我将请求映射中的值更改为

代码语言:javascript
复制
  @RequestMapping(
          value= "/testbyparam",
          params = {"param"},
          method = RequestMethod.GET)

Swagger UI正确地显示了两个端点,但我不希望根据swagger将显示或不显示的内容来定义我的端点。

有没有办法让swagger ui正确显示具有匹配值但参数不同的端点?

编辑以澄清:

端点工作得很好;/test和/test?param=1都工作得很好,问题是swagger-ui不会显示它们。

我希望swagger ui能够显示我定义的端点,但是如果它不能,那么我将不得不忍受swagger-ui缺少一些端点。

参照编辑:

在这里回答的人:Proper REST formatted URL with date ranges

显式声明不使用斜杠分隔查询字符串

他们还说“查询字符串前不应该有斜杠。”

EN

回答 4

Stack Overflow用户

发布于 2018-08-16 03:23:24

问题出在您的请求映射中,第二个方法声明覆盖了第一个方法。因为资源映射值相同。

尝试将第二种方法更改为下面的方法。由于您希望在QueryParam而不是path变量中提供输入,因此应该使用@RequestParam而不是@PathParam。

请注意,您必须提供/test/,以便告诉Spring您的映射是不明确的。希望能有所帮助。

代码语言:javascript
复制
@RequestMapping(
          value= "/test/",
          method = RequestMethod.GET)
  @ResponseBody
  public String getTest (@RequestParam("param") int param) {
    return "test with param"+param;
  }
票数 0
EN

Stack Overflow用户

发布于 2021-01-21 23:32:32

在阅读说明时,这里的问题是swagger-ui正在做正确的事情。

您有两个控制器端点,但它们用于接受一组可选查询参数的相同资源/test

实际上,具有相同方法(GET)和请求映射(/test)的所有映射控制器端点代表单个逻辑资源。test资源上的GET操作,以及一组可能影响调用该操作的结果的可选参数。

您将其实现为两个独立的控制器端点的事实是一个实现细节,并且不会改变可以对单个/test资源进行操作的事实。

在swagger UI中将其作为两个单独的端点列出,与使用可选参数的单个端点相比,对API的消费者有什么好处?也许它可以限制允许的有效查询参数集(如果设置了?foo,则必须设置&bar),但这也可以在描述性文本中完成,这是一种更标准的方法。就我个人而言,我不熟悉任何公开记录的api,这些api通过查询参数来区分同一资源的多个操作。

票数 0
EN

Stack Overflow用户

发布于 2018-08-16 02:04:12

我不清楚你到底想做什么,但我会给出两个解决方案:

如果你想要路径参数,比如GET /test & GET /test/123,你可以这样做:

代码语言:javascript
复制
  @GetMapping("/test")
  public String getTest() {
    return "test without params";
  }

  @GetMapping("test/{param}")
  public String getTest(@PathVariable("param") int param) {
    return "test with param";
  }

如果需要查询参数(GET /testGET /test?param=123),则需要一个带有可选参数的端点:

代码语言:javascript
复制
  @GetMapping("test")
  public String getTest(@RequestParam("param") Integer param) {
    if(param == null) { 
      return "test without params";
    } else {
      return "test with param";
    }
  }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51862871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档