java - 我如何处理请求中作为“@PathVariable”出现的“ñ”字符,Spring Boot
问题描述
我有一个具有以下方法的 RESTController:
@GetMapping(value = "/equipos/ciudad/{ciudad}", produces = {"application/json"})
public ResponseEntity<List<EquipoBean>> getEquiposByCiudad(@PathVariable(name = "ciudad") String ciudad) {
return new ResponseEntity<>(service.getEquiposByCiudad(ciudad), HttpStatus.OK);
}
当我发送普通字符时它可以工作,即使它们之间有多个带有空格的单词,但是当我发送“ñ”字符时,我会得到一个像这样的异常:
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:475) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.30.jar:9.0.30]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
我试着用谷歌搜索寻找答案,但我没有找到解决方案,所以我在这里问,有没有办法让我设置我的 RESTController 以正确处理这些类型的特殊字符?
解决方案
您的客户端应该对此类字符进行URL 编码。就这样ñ
变成了%C3%B1
。
您似乎使用西班牙城市名称作为参数。所以我会用这个A Coruña
例子。如果您的客户端是用 Java 编写的,您可以使用URLEncoder
:
String url = "http://example.org?q=" + URLEncoder.encode("A Coruña", "UTF-8");
从 Java 10 开始,您可以使用:
String url = "http://example.org?q=" +
URLEncoder.encode("A Coruña", StandardCharsets.UTF_8);
这样,A Coruña
将被编码为A+Coru%C3%B1a
.
推荐阅读
- c# - 无法在 ASP Dot net Core 3.1 中正确使用 IFromFile 对象上传 2 Kb 文件
- php - 未检索到 CMSMS 元标记
- elasticsearch-aggregation - 如何在 Elasticsearch 7.6.2 中编写不同的查询
- android - 调用 setImageURI() 时出现 FileNotFoundException:/data/user/0/com.myapp/files/1585300417998.jpg:打开失败:ENOENT
- mysql - Aurora MySQL - 存储过程中的慢速 CREATE TABLE 语句
- c++ - exec*() 在 C++ 中,我们通常的退出保证会发生什么?
- wordpress - 在 WP 中更改永久链接结构后如何修复 503 错误?
- c# - EF.NET Core:一个事务中的多个插入流
- r - 我想在 R 中加入两个表,其中一个变量完全匹配,另一个变量部分匹配
- elasticsearch - 如何改进 Elasticsearch 中的搜索?