生成的 Swagger REST 客户端无法正确处理查询参数的 + 字符

2023-12-02

我有这个 Spring REST 控制器方法:

@ApiOperation("My method")
@RequestMapping(method = RequestMethod.POST, value = "/myMethod")
public void myMethod(@RequestParam("myParam") String myParam) {
...
}

REST 客户端是使用 swagger codegen CLI 和语言生成的Java和图书馆休息模板:

public void myMethod(String myParam) throws RestClientException {
    ...
    return apiClient.invokeAPI(path, HttpMethod.POST, queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType);
}

以及源代码ApiClient#invokeAPI- 也生成 - 是:

public <T> T invokeAPI(String path, HttpMethod method, MultiValueMap<String, String> queryParams, Object body, HttpHeaders headerParams, MultiValueMap<String, Object> formParams, List<MediaType> accept, MediaType contentType, String[] authNames, ParameterizedTypeReference<T> returnType) throws RestClientException {
    updateParamsForAuth(authNames, queryParams, headerParams);

    final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(basePath).path(path);
    if (queryParams != null) {
        builder.queryParams(queryParams);
    }

    final BodyBuilder requestBuilder = RequestEntity.method(method, builder.build().toUri());
    if(accept != null) {
        requestBuilder.accept(accept.toArray(new MediaType[accept.size()]));
    }
    if(contentType != null) {
        requestBuilder.contentType(contentType);
    }

    addHeadersToRequest(headerParams, requestBuilder);
    addHeadersToRequest(defaultHeaders, requestBuilder);

    RequestEntity<Object> requestEntity = requestBuilder.body(selectBody(body, formParams, contentType));

    ResponseEntity<T> responseEntity = restTemplate.exchange(requestEntity, returnType);
    ...
}

现在,当我打电话时myMethod传递一个包含 a 的字符串+登入myParam,在服务器上我收到一个空格字符而不是+。似乎是编码问题,因为 URL 查询参数中保留了加号来替换空格字符。这是来自 swagger codegen 或 Spring 类的错误,还是根本没有错误?我该如何解决这个问题?

EDIT:

Swagger 定义如下(从 Spring REST 控制器生成):

{
  "swagger": "2.0",
  ...
  "paths": {
    "/myMethod": {
      "get": {
        "operationId": "myMethod",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "myParam",
            "in": "query",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
           ...
        }
      }
    }
 ...
}

EDIT:

类似的问题似乎是路径变量的编码。当我经过时"bla:bla/bla"路径变量的特殊字符: and /不会被编码,而是按原样发送,这会导致服务器端出现错误,因为找不到映射。


A +通常表示 url 参数中的空格。这是一个标准。您的网址将在下面的代码行中生成

final BodyBuilder requestBuilder = RequestEntity.method(method, builder.build().toUri());

And +未编码,因为它是一个有效值,稍后将在接收端转换为空间。现在当你尝试使用%2B上面的代码行显示您有一个未编码的%字符并将其转换为%252B.

当你在 Spring 收到这个返回时,它会将其转换回%2B为你。解决该问题的一种方法是自己发送编码值。所以你会改变

 final BodyBuilder requestBuilder = RequestEntity.method(method, builder.build().toUri());

to

final BodyBuilder requestBuilder = RequestEntity.method(method, builder.build(true).toUri());

然后调用API方法为

client.myMethod("tarun%2blalwani")

现在春天将会收到tarun+lalwani如下所示

+ in spring

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成的 Swagger REST 客户端无法正确处理查询参数的 + 字符 的相关文章

随机推荐

  • 将图像从网页的 html 部分拖放到画布上后如何访问图像数据?

    这是一个后续问题如何将文本和图像拖放到画布上 火狐41 0 1 我根本不知道如何访问我放到画布上的图像的图像数据 我尝试过类似的事情data event dataTransfer getData image 但这一切都不起作用 functi
  • 如何制作编号段落(HTML5/CSS3)

    我正在编写 HTML5 中的 QuickBASIC 4 5 指南 并且我已经得到了很多工作 但我想知道如何对我的代码行进行编号 或停止文本换行 目前 我的代码如下所示 1 PRINT Hello World 2 INPUT Who are
  • RSelenium 无法打开浏览器

    我想使用 Selenium 从 R 进行网页抓取 我的Windows版本 Windows 11 21H2 我有最新的 Java 更新 1 8 0 351 评论它 因为我已经看到它可能是这种情况下的修复 但是 在定义驱动程序对象时 出现以下错
  • 如何退出 git log 或 git diff [重复]

    这个问题在这里已经有答案了 我正在尝试在以下的帮助下学习 Git沉浸式 Git 每当我使用时 有一件事让我感到沮丧git log or git diff 当我遇到这种情况时 我不知道下一步该怎么做 END word 我无法输入任何命令 最终
  • 将巨大图像(5mb)加载到 svg 背景中会导致像素化和性能问题

    我有一些问题像素化和表现SVG 背景图像与 D3 js 一起 您已经可以在这里看到一个正在运行的示例 http arda maps org ages first 请不要分享 直到它仍然是 Alpha 版本 谢谢 Example So let
  • 如何创建带有日期的图表工具提示(日期时间格式)

    我无法获得正确格式的提示 foreach RootObject o in myRootObjects seriesTemperatur Points AddXY DateTime Parse o datum o temp seriesPre
  • Perl 5.8.8 不支持 XML::LibXML 吗?

    我回答了一个question不久前我最初建议使用 XML DOM 后mirod建议我使用 XML LibXML 代替 我实现了它 说实话 它在我的系统上运行得很好 我发现新模块的运行时间大幅下降 而无需进行任何额外的优化 现在棘手的部分是
  • 在 Coq 中实现向量加法

    在某些依赖类型语言 例如 Idris 中实现向量加法相当简单 根据维基百科上的例子 import Data Vect default total pairAdd Num a gt Vect n a gt Vect n a gt Vect n
  • IE 必须关闭才能使事件与 jQuery 一起工作

    快速概述 函数 getbillno tbl 默认返回显示 1 ELSE echo 1 问题 在 IE 中 无论我显示什么 即使页面是空白 它也总是显示 1 我没有点击刷新 而是尝试关闭 IE 9 它确实显示了正确的值 我再次更改了代码中的值
  • 开源报告服务? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有没有免费的开源的报告服务我们可以将其部署在网络服务器中 并且不需要任何许可 实际上 我对整个框架 工具包 报告设计 查看和托管感兴趣 它应该能够从
  • 构建 OSX 应用程序包

    假设我在没有使用 Xcode 的情况下制作了一个 osX 应用程序 使用 GCC 编译后 我得到一个链接到其他几个库的可执行文件 其中一些库可能会再次动态链接到其他非标准系统库 是否有任何工具可以通过首先创建所需的目录结构 然后递归地复制
  • java ThreadPoolExecutor 中的workerCountOf()方法

    我试图理解 ThreadPoolExecutor 类 我发现该类中声明了一些最终变量 但无法理解它们的用途 private final AtomicInteger ctl new AtomicInteger ctlOf RUNNING 0
  • 如何在java中添加图像到表单

    我正在使用 JDeveloper 在 java 中设计一个表单 我是 JDeveloper 的新手 在 JDeveloper 工具中 我没有找到任何像 Net 那样直接将图像添加到表单的选项 而且我不知道如何手动添加图像到表单 有没有其他方
  • 无法连接到面向互联网的 NLB 将流量转发到私有实例

    我已经使用以下配置配置了云 VPC 在两个可用区中具有公有子网和私有子网 公有子网配置了 Internet 网关 私有子网配置了 NAT 网关 面向互联网的网络负载均衡器 允许在两个可用区域中配置 TCP 流量 用于转发来自负载均衡器的流量
  • 为什么我的 t-sql 左连接不起作用?

    你能运行这个并告诉我为什么结果集只有两行吗 它应该有三个 看起来像这样 appId stepId section start 101 1 Section 1 2016 01 03 00 00 00 000 101 2 Section 2 2
  • X-可编辑和 Bootstrap 数据表

    我尝试在引导数据表中实现 x editable 没有成功 原因是当我从 x editable 更新元素时 数据表无法识别这些更改 我尝试更新表 销毁它 隐藏标签 但主要问题似乎是数据表在初始化后无法识别任何更改 我通过单击按钮添加行 当它们
  • MEF2 中的强类型元数据 (System.Composition)

    我正在使用 System Composition 命名空间适用于 Web 和 Windows 应用商店应用 NuGet 包的 MEF在新的 ASP NET MVC4 项目中 I ve read在 MEF2 中您不再使用Lazy
  • CSS 背景过滤器在其后面的内容移动时不会更新

    我应该认为作为背后的内容backdropped元素移动时 元素的背景颜色会适应 看起来就像内容透过它发光一样 在这个例子中 情况并非如此 怎么了 在 Safari 12 0 3 macOS Mojave 10 14 3 上进行了测试 con
  • int num = new int();当这一行执行时会发生什么?

    今天了解了一个新事物 我们可以使用以下方法创建整数new运算符如下 int num new int 现在我想知道如果我以这种方式创建一个整数 那么生成的整数将是值类型还是引用类型 我想这将是一个值类型 我尝试了下面的代码 int num1
  • 生成的 Swagger REST 客户端无法正确处理查询参数的 + 字符

    我有这个 Spring REST 控制器方法 ApiOperation My method RequestMapping method RequestMethod POST value myMethod public void myMeth