Spring Boot不接受括号中的列表参数



我有以下非常简单的SpringBoot程序

// APIEndpoints.java
// Imports!
public class APIEndpoints {
@PostMapping("deduplicate")
public String deduplicate(@RequestParam(value = "data") String data) {
return data;
}
}
// RestServiceApplication.java
@SpringBootApplication
public class RestServiceApplication {
public static void main(String[] args) throws SQLException {
SpringApplication.run(RestServiceApplication.class, args);
}
}

我可以通过./gradlew bootRun启动springboot服务器,并已验证服务器是否通过其他端点工作。

这是我的问题:使用邮递员发送邮件请求,以下内容顺利通过

localhost:8080/deduplicate?data=1,23,4,5

然而,这一次失败了,出现了一个错误:"HTTP 400:错误请求">

localhost:8080/deduplicate?data=[1,23,4,5]

这似乎是不可取的行为,而且似乎并不是url格式或类似内容的根本限制。

是什么导致了这个错误,我如何设置Spring Boot以接受括号中的列表?

因此,出现此错误的主要原因是字符"["one_answers"]"。关于URL和URI允许字符的更多详细信息,请回答:哪些字符使URL无效?。

最好的方法(遵循标准(-在客户端编码URL:

encodeURL("localhost:8080/deduplicate?data=[1,23,4,5]")
>localhost:8080/deduplicate?data=%5B1%2C23%2C4%2C5%5D

使用poster,您想在查询参数窗口中选择您的数据,单击鼠标右键并选择"EncodeURIComponent":

使用邮递员进行编码的示例将您的URL转移到

localhost:8080/deduplicate?data=%5B1%2C23%2C4%2C5%5D

tomcat可以成功地读取它(我假设您将它用作servlet容器(。

如果你不能改变你的前端行为,你可以使用

relatedQueryChars/relatedPathChars

在连接器定义中允许这些字符。使用java和spring(如果嵌入了tomcat(:

@Component
public class TomcatWebServerSettings implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.addConnectorCustomizers(connector ->
{
connector.setAttribute("relaxedQueryChars", "[]");
});
}
}

或者您可以在server.xml(%TOMCAT_FOLDER%/conf/(下添加relaxedQueryChars属性:

<Connector 
//other params,
relaxedQueryChars="[,]"
/>

此外,您可以将tomcat降级到7.0.76以下的版本(出于安全原因,强烈建议不要这样做(。

任一

是否执行重复数据消除?数据=1,23,4,5

是否执行重复数据消除?data=1&数据=23&数据=4&数据=5

如果您想通过REST API作为请求参数作为数组,那么它就是这样工作的。

您在url中使用了不安全的字符,因此出现了问题。RFC1738

" < > # % { } |  ^ ~ [ ] ` including the blank/empty space.

最新更新