繁体   English   中英

@RequestParam没有映射整个字符串

[英]@RequestParam not mapping entire string

我有一个Get端点,它接受一个查询字符串作为请求参数。 端点的问题是请求参数字符串可以包含像?,/ etc这样的字符,这会导致问题。有没有办法将包含?,/ etc的字符串映射到休息控制器中的变量?

已经尝试过使用@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?'

堆栈跟踪:

java.lang.IllegalArgumentException:方法名称中找到无效字符。 HTTP方法名称必须是令牌错误解析HTTP请求标头注意:将在DEBUG级别记录更多出现的HTTP标头解析错误。

java.lang.IllegalArgumentException:方法名称中找到无效字符。 HTTP方法名称必须是org.apache.coyote上的org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:422)〜[tomcat-embed-core-8.5.14.jar:8.5.14]中的标记。 http:http://www.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] 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.thr eads.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]

对于预期的结果,我想映射字符串“你好吗?” 到一个路径变量或查询param变量,整个字符串完整,而不是'?' 被省略了。

如果您直接从浏览器或卷曲或邮递员调用网址。 你应该对不同的特殊字符使用编码,比如空格编码是%20。 这意味着当你写“你好吗?” 这将是网址中“如何%20are%20you%3F” 有关更多信息,请参阅此站点

如果呼叫来自任何编程语言。 请使用URL编码器。

提供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

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

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

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

如果您使用邮递员,则需要在预请求脚本中设置以下内容,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM