@RequestParam не отображает всю строку - PullRequest
3 голосов
/ 18 апреля 2019

У меня есть конечная точка Get, которая принимает строку запроса в качестве параметра запроса. Проблема с конечной точкой в ​​том, что строка параметра запроса может содержать такие символы, как?, / Etc, что вызывает проблемы. Есть ли способ сопоставить строку, которая содержит?, / Etc, с переменной в контроллере rest?

Уже пытался использовать @PathVariable вместо @RequestParam, но он по-прежнему неправильно читает значение. При использовании @PathVariable для сопоставления URI,? становится опущенным. При использовании @RequestParam создается исключение. Обеспечивается отслеживание стека.

@GetMapping("/getResult")
public @ResponseBody ResponseEntity<String> getData(@RequestParam(value="text") String text) {
    //Call to service layer passing text as a param
    return new ResponseEntity<String>("GET Response", HttpStatus.OK);
}

URL : 'localhost/getResult?text=How you doing?'

StackTrace:

java.lang.IllegalArgumentException: в методе найден недопустимый символ название. Имена методов HTTP должны быть токенами Ошибка разбора HTTP-запроса Примечание заголовка: дальнейшие ошибки синтаксического анализа заголовка HTTP будут зарегистрирован на уровне DEBUG.

java.lang.IllegalArgumentException: в методе найден недопустимый символ название. Имена методов HTTP должны быть токенами в org.apache.coyote.http11.Http11InputBuffer.parseRequestLine (Http11InputBuffer.java:422) ~ [tomcat-embed-core-8.5.14.jar: 8.5.14] в org.apache.coyote.http11.Http11Processor.service (Http11Processor.java:683) ~ [tomcat-embed-core-8.5.14.jar: 8.5.14] в org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.14.jar: 8.5.14] в org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:861) [tomcat-embed-core-8.5.14.jar: 8.5.14] в org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1455) [tomcat-embed-core-8.5.14.jar: 8.5.14] в org.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49) [tomcat-embed-core-8.5.14.jar: 8.5.14] в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) [na: 1.8.0_05] в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) [na: 1.8.0_05] в org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) [tomcat-embed-core-8.5.14.jar: 8.5.14] в java.lang.Thread.run (Thread.java:745) [na: 1.8.0_05]

Для ожидаемого результата я хотел бы отобразить строку "Как дела?" к переменной пути или переменной параметра запроса со всей целой строкой, вместо '?' исключается.

Ответы [ 4 ]

4 голосов
/ 18 апреля 2019

Если вы звоните по ссылке прямо из браузера, или с помощью curl, или почтальона.Вы должны использовать кодировку для различных специальных символов, например, для пробела кодирование% 20.Это означает, что когда вы пишете «как дела?» , это будет «как% 20are% 20you% 3F» в URL.Пожалуйста, обратитесь к этому сайту для большего понимания.

И, если вызов с любого языка программирования.пожалуйста, используйте URL-кодировщики.

3 голосов
/ 18 апреля 2019

Предоставление решения Java:
Вы можете использовать URLEncoder для достижения желаемого:

URLEncoder enc = new URLEncoder();
enc.encode(String toEncode, String charset)

Существует также метод, который принимает только кодируемую строку, но этотустарела.

Если вы звоните с клиента Javascript, вы можете использовать encodeURIComponent():

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

2 голосов
/ 18 апреля 2019

Кодируйте question mark(?) как %3F и все готово.

Нет другого способа отправить вопросительный знак в запросе, так как это специальный символ .

0 голосов
/ 18 апреля 2019

Вам необходимо закодировать параметры с помощью специальных символов в URL.Вы можете использовать encodeURIComponent из внешнего интерфейса.

Если вы используете почтальона, вам необходимо установить следующие параметры в сценариях предварительного запроса:

var encoded = encodeURIComponent(postman.getEnvironmentVariable("text"));
postman.setEnvironmentVariable("encoded text", encoded);
...