我有以下非常简单的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.