无法通过content-type = application / x-www-form-urlencoded获取请求正文

时间:2013-12-05 13:50:53

标签: java spring spring-mvc

当请求包含Content-Type=application/x-www-form-urlencoded时,我无法获取请求正文内容。

我有以下检索请求正文的方法:

@RequestMapping(value = "/testRequestBody", method = RequestMethod.POST)
@ResponseBody
public String testRequestBody(@RequestBody String requestBody) {
    return requestBody;
}

我正在使用restclient firefox插件来测试请求。当我向请求Content-Type=application/x-www-form-urlencoded添加requestBody时,尽管请求正文中包含文本,但变量仍为空。当我删除Content-Type标题时,请求正文将填充文本。

UPD 这个问题似乎与用于运行spring容器的tomcat有关。当application/x-www-form-urlencoded请求到来时,它被解析,正文中定义的参数变为请求参数,然后清除正文。

我可以通过以下方式访问body参数:

@RequestMapping(value = "/testRequestBody", method = RequestMethod.POST)
@ResponseBody
public String testRequestBody(@RequestParam("paramName") String paramName) {
    return requestParam;
}

如何配置tomcat不解析请求而不清除请求体?

1 个答案:

答案 0 :(得分:-1)

当您调用RESTful SAS BI Web服务时,您发送的HTTP标头很重要。 Content-type HTTP标头告诉SAS BI Web Services执行HTTP POST时要发送的内容类型。如果要调用JSON端点,则必须将Content-type设置为application / x-www-form-urlencoded,并且必须使用此格式对内容进行编码。如果要调用XML端点,则必须将Content-type设置为application / xml,并且您的内容必须是XML。 HTTP Accept标头告诉SAS BI Web Services您的客户端可以接受哪种类型的内容作为输出。对于JSON端点,Accept标头必须设置为application / json,对于XML端点,可以设置为application / xml(XML端点不需要此标头)

@RequestMapping(value = "/testRequestBody", method = RequestMethod.POST, headers="Accept=*")
@ResponseBody
public String testRequestBody(@RequestBody String requestBody) {
    return requestBody;
}