@RequestParam没有映射整个字符串

时间:2019-04-18 09:27:55

标签: java spring-boot url servlet-3.0 http-request-parameters

我有一个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]

对于预期的结果,我想映射字符串“你好吗?”到完整保留整个字符串的路径变量或查询参数变量,而不是“?”被忽略。

4 个答案:

答案 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);