Как обработать символ «ñ», который в запросе появляется как «@PathVariable», Spring Boot - PullRequest
1 голос
/ 28 февраля 2020

У меня есть 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 для правильной обработки этих типов специальных символов?

Ответы [ 2 ]

4 голосов
/ 28 февраля 2020

Ваш клиент ожидается до URL-кодировать такой символ. Таким образом, ñ становится %C3%B1.


Вы, кажется, используете название города Spani sh в качестве параметра. Поэтому я буду использовать 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.

0 голосов
/ 28 февраля 2020

Проблема в том, что, как говорит исключение, ñ не может присутствовать в действительном URL. RF C определяет очень специфический c набор символов, который может быть разрешен, и ВСЕ другие символы должны быть закодированы в URL.

Таким образом, решение должно состоять в том, что тот, кто вызывает ваш API, должен URL -кодировать их запрос, и ваш сервис будет работать нормально.

...