【问题标题】:Swagger UI Bad Request URL GenerationSwagger UI 错误请求 URL 生成
【发布时间】:2017-11-04 21:34:27
【问题描述】:

我使用 swagger 已经有一段时间了,现在我遇到了一个问题,即生成的请求 URL 将我的可选参数放入请求中。这在我使用相同注释、swagger 版本和 swagger maven 版本的其他项目上不会发生。

这是我的@Controller 中的代码 sn-p

private static final String BY_USERNAME = "byUsername";
private static final String BY_NAME = "byName";
private static final String BY_PHONENUMBER = "byPhoneNumber";
private static final String BY_USERTYPENAME = "byUserTypeName";
private static final String BY_ACTIVE = "byActive";
private static final String BY_ACTIVE_AND_AVAILABLE = "byActiveAndAvailable";
@ApiOperation(value = "Read User(s)", notes = "notes removed so post wont be so long", consumes = "application/x-www-form-urlencoded")
@RequestMapping(value = "", method = RequestMethod.GET, consumes = "application/x-www-form-urlencoded")
@ApiImplicitParam(value = "Authorization Token", name = TokenAuthenticationService.HEADER_STRING, dataType = "String", paramType = "header")
@ApiResponses(value = { @ApiResponse(message = "successful read call", code = 200), @ApiResponse(message = "bad parameter provided", code = 400) })
public Page<User> readUser(
                @ApiParam(name = "queryType", value = "type of query", allowableValues = BY_USERNAME + "," + BY_NAME + "," + BY_PHONENUMBER + ","
                                + BY_USERTYPENAME + "," + BY_ACTIVE + "," + BY_ACTIVE_AND_AVAILABLE) @RequestParam(value = "queryType", required = true) String queryType,
                @ApiParam(name = "username", value = "username of user") @RequestParam(value = "username", required = false) String username,
                @ApiParam(name = "name", value = "name of user(s)") @RequestParam(value = "name", required = false) String name,
                @ApiParam(name = "phoneNumber", value = "phone number of user(s)") @RequestParam(value = "phoneNumber", required = false) String phoneNumber,
                @ApiParam(name = "userTypeName", value = "user type name of user(s)") @RequestParam(value = "userTypeName", required = false) String userTypeName,
                @ApiParam(name = "active", value = "active status of user(s)") @RequestParam(value = "active", required = false) Boolean active,
                @ApiParam(name = "available", value = "available status of user(s)") @RequestParam(value = "available", required = false) Boolean available,
                Pageable pageable) {

这是非常基本的招摇注解。问题是 swagger-ui 中生成的 URL 如下所示:

当我尝试使用它时,它会将这些放在 REST 请求中。

这当然会导致 spring 抛出有关无效字符的异常

我尝试在整个互联网、招摇页面和 * 上进行搜索,但我找不到任何提及此错误的信息。非常奇怪的是,如果我将 RequestMethod 更改为 POST,它会正常工作。似乎是 swagger-ui 处理可选参数的错误。还有其他人遇到过这个吗?除了将请求方法设为 POST 之外,还有其他解决方法吗?

编辑:“consumes =”application/x-www-form-urlencoded“”不在我的原始代码中。我一直在调试它并添加一些东西来尝试让它工作哈哈。

使用的版本:

  • springfox-swagger2版本2.6.1
  • springfox-swagger-ui版本2.6.1

【问题讨论】:

标签: java spring swagger swagger-ui springfox


【解决方案1】:

你使用的是什么版本的 swagger-ui?

由于您的案卷中有enableUrlTemplating(true),因此您需要使用支持它的 swagger-ui 的适当实现。

对于 Gradle:

compile group: 'io.springfox.ui', name: 'springfox-swagger-ui-rfc6570', version: '1.0.0'

对于 Maven:

<!-- https://mvnrepository.com/artifact/io.springfox.ui/springfox-swagger-ui-rfc6570 -->
<dependency>
    <groupId>io.springfox.ui</groupId>
    <artifactId>springfox-swagger-ui-rfc6570</artifactId>
    <version>1.0.0</version>
</dependency>

Docket 支持url templating(参见 #21),但它仍处于孵化阶段,并未受到 swagger 2.0 规范的正式支持。所以你的选择是:

  1. 制作enableUrlTemplating(false)。在这种情况下,一切都会正常工作,但如果您有多个具有不同查询参数的路径,则只会显示其中一个。

例如如果您有以下网址 http://example.org/customers?firstName=A&amp;lastName=BfindCustomersByName http://example.org/customers?email=a@b.comfindCustomersByEmail

只有其中一个会出现。

  1. 保留enableUrlTemplating(true)change the swagger-ui 您正在使用上面的那个。

【讨论】:

  • 嗨,Dilip,谢谢。我实际上将其更改为 false(我不需要此项目),看看是否能解决问题!
  • 也许你可以自己编辑,但它是springfox-swagger2版本2.6.1springfox-swagger-ui版本2.6.1跨度>
  • 嗨 dilip,是的,两者都是 2.6.1
  • 标记为已回答?