@RequestParam 没有映射整个字符串

@RequestParam not mapping entire string

我有一个 Get 端点,它接受一个查询字符串作为请求参数。端点的问题是请求参数字符串可以包含像 ?,/ 等字符,这导致 issues.Is 有任何方法可以将包含 ?,/ 等的字符串映射到休息控制器中的变量吗?

已经尝试使用@PathVariable 而不是使用@RequestParam,但它仍然无法正确读取值。 当使用 @PathVariable 映射 uri 时, ?被省略了。 使用@RequestParam 时,它会抛出一个 Exception.Stacktrace is provided.

@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?'

堆栈跟踪:

java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:422) ~[tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:683) ~[tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.14.jar:8.5.14] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.14.jar:8.5.14] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_05] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_05] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.14.jar:8.5.14] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_05]

对于预期的结果,我想将字符串 "How you doing?" 映射到路径变量或查询参数变量,并且整个字符串都完好无损,而不是 '?'被遗漏了。

question mark(?) 编码为 %3F 就可以了。

没有其他方法可以在查询中发送问号,因为它是 特殊字符

提供Java解决方案:
您可以使用 URLEncoder 来实现您想要的:

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

还有一种方法只接受要编码的字符串,但这种方法已被弃用。

如果您从 Java 脚本客户端调用,您可以使用 encodeURIComponent() :

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

如果您直接从浏览器或 curl 或邮递员调用 url。您应该对不同的特殊字符使用编码,例如 space 编码是 %20。这意味着当你写 "how are you?" 时,这将是 "how%20are%20you%3F" url。请参考此site以获得更多理解。

并且如果调用来自任何编程语言。请使用 URL 个编码器。

您需要在URL中使用特殊字符对参数进行编码。您可以从前端使用 encodeURIComponent

如果你使用的是postman,你需要在Pre-request scripts中设置如下,

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