簡體   English   中英

我如何處理在請求中作為“@PathVariable”出現的“ñ”字符,Spring Boot

[英]How do i Handle a "ñ" character that comes as a "@PathVariable" in a request, 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 A Coruña A+Coru%C3%B1a

問題是,正如異常所說ñ不能出現在有效的 URL 中。 RFC 定義了一組可以被允許使用的非常具體的字符,所有其他字符都需要進行 URL 編碼。

因此,解決方案應該是調用您的 API 的任何人都需要對他們的請求進行 url 編碼,並且您的服務將正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM