@RequestHeader Map<String, String> 在 swagger UI 中不起作用

@RequestHeader Map<String, String> is not working in swagger UI

提问人:MrCoder 提问时间:11/16/2023 更新时间:11/16/2023 访问量:33

问:

我有一个方法为 @GET 的控制器。我想将标题作为 Map<String、String> 传递,但是在 swagger UI 端看不到要传递标题的字段。

例如:当我尝试将标题作为 @RequestHeader 字符串传递时,字段在 swagger UI 部分上可见,就在传递正文的位置上方,但是在注释之后有一个 Map,根本没有地方放置这个标题。

public ResponseEntity<MyObject> getObject(
            @RequestHeader String test,
            @RequestHeader Map<String, String> headers) {

//logic here
}

在此处输入图像描述

例如,我希望能够通过一些文本框传递三个标题(例如@RequestBody正在工作)。为了不创建无数带有具体标题的标签,我想通过 swagger UI 通过地图传递标题。可能吗?

谢谢

java spring-boot swagger-3.0

评论


答:

0赞 lance-java 11/16/2023 #1

您不应该像这样通过请求标头传递数据。请求标头用于将有关客户端的信息传递给服务器(例如,客户端是否接受 gzip 压缩响应)

若要将数据传递到服务器,应使用:

  • 请求参数 (@RequestParam)
  • 路径变量 (@PathVariable)
  • POST 的主体 (@RequestBody)

请注意,GET 请求不支持 @RequestBody(标准 HTTP 协议,与 spring / swagger 无关)

下面是包含 @PathVariable、@RequestParam 和 @RequestBody 的 POST 示例

public class MyBodyBean {
   private String value1;
   private String value2;
   private String value3;

   // getters / setters
}
public class FooController {
   @PostMapping("/foo/{test1}/do-something/")
   public ResponseEntity doSomething(
      @PathVariable("test1") test1,
      @RequestParam("test2") test2,
      @RequestBody MyBodyBean body
   ) {
      doStuff(test1, test2, body);
      return ResponseEntity.ok(HttpStatus.OK);
   }
}

要调用它,您需要将 JSON 正文发布到/foo/xxx/do-something?test2=yyy

JSON 正文如下所示

{ 
  "value1":"A", 
  "value2":"B", 
  "value3":"C" 
}

评论

0赞 MrCoder 11/17/2023
感谢您的回复。其实很好,但这样通过它不是我的选择。我发现 - 当您将 RequestHeader 作为自定义对象传递时,该对象内部的映射是可见的,我可以将对象传递给 swagger,但只是映射我不能。可以传递字符串映射吗?
0赞 lance-java 11/17/2023
您可以作为请求参数传递,但请注意,这需要进行 URL 编码。所以会变成.例如 /myapp/someurl?map=%7B%22foo%22%3A%22bar%22%7D。swagger UI 可能会为您进行 URL 编码{"foo":"bar"}%7B%22foo%22%3A%22bar%22%7D