我有一个Get端点,它接受查询字符串作为request param。端点存在问题,即请求参数字符串可以包含引起问题的?,/等字符。是否有任何方法可以将包含?,/等的字符串映射到rest控制器中的变量?
已经尝试使用@PathVariable而不是@RequestParam,但是它仍然无法正确读取该值。 使用@PathVariable映射uri时,?正在被省略。 使用@RequestParam时,它将引发Exception.Stacktrace。
@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标头解析错误的进一步发生将是 记录为调试级别。
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]
对于预期的结果,我想映射字符串“你好吗?”到完整保留整个字符串的路径变量或查询参数变量,而不是“?”被忽略。
答案 0 :(得分:4)
如果您是直接从浏览器或curl或postman调用URL。您应该对不同的特殊字符使用编码,例如空格编码为%20。这意味着当您在网址中写“你好吗?” 时,这将是 “%20are%20you%3F的方式” 。请参阅此site以了解更多信息。
并且如果调用来自任何编程语言。请使用网址编码器。
答案 1 :(得分:3)
提供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 :(得分:2)
将question mark(?)
编码为%3F
,就可以了。
您无法在查询中发送问号,因为它是特殊字符。
答案 3 :(得分:0)
您需要在URL中使用特殊字符对参数进行编码。您可以从前端使用encodeURIComponent
。
如果使用邮递员,则需要在“预请求”脚本中设置以下内容,
var encoded = encodeURIComponent(postman.getEnvironmentVariable("text"));
postman.setEnvironmentVariable("encoded text", encoded);