![](/img/trans.png)
[英]www-form-urlencoded string parameter not recognized in API communication
[英]How can I get a Spring @RestController to accept parameters in JSON format rather than www-form-urlencoded?
在JDK 1.8上使用Spring 4.1.7,我有一个@RestController类,如下所示:
@RestController
public class ServiceAController {
public static final Logger LOG = Logger.getLogger(ServiceAController.class);
@RequestMapping(value="/rest/servicea", method=RequestMethod.POST)
public ServiceAResponse serviceA(@RequestParam(value="parmA", defaultValue="defaultParmA") String parmA,
@RequestParam(value="parmB", defaultValue="defaultParmB") String parmB,
@RequestParam(value="parmC", defaultValue="defaulParmC") String parmC) {
LOG.info("Inside Service A handler: " + parmA + " B: "+ parmB + " C: "+ parmC);
}
当我从这样的JavaScript向/ rest / servicea发送POST时,一切正常,并且我在日志中看到了值“ a”,“ b”和“ c”:
var data = {
"parmA": "a",
"parmB": "b",
"parmC": "c"
}
$.ajax({
type: "POST",
url: "./rest/servicea",
contentType: "application/x-www-form-urlencoded",
data: data,
dataType: "json",
success: submitAuthSuccess,
error: submitAuthFailure
})
但是,当我尝试将调用从javascript更改为此(将协议更改为REST而不是www-urlencode)时,我在日志中得到了默认值(defaultParmA,defaultParmB,defaultParmC):
var data = {
"parmA": "a",
"parmB": "b",
"parmC": "c"
}
$.ajax({
type: "POST",
url: "./rest/servicea",
contentType: "application/json",
data: JSON.stringify(data),
dataType: "json",
success: submitAuthSuccess,
error: submitAuthFailure
})
我想我在@RestController类中缺少一些东西来让它解析JSON,而不是期望使用www-urlencoded数据。
我尝试更改serviceA
方法上的@RequestMapping
批注以添加consumes="application/json"
属性,但这没有任何效果。
使用JSON而不是POST正文中的经过urlencoded的数据,我可以做些什么更改以使其起作用?
@RequestParam
javadoc状态
指示方法参数应绑定到Web请求参数的注释。
可通过各种ServletRequest
方法获取请求参数。 例如, ServletRequest#getParameterMap()
指出
请求参数是与请求一起发送的额外信息。 对于HTTP Servlet,参数包含在查询字符串或发布的表单数据中。
在第二个片段中,您都不发送任何一个。 您正在请求正文中发送JSON。
Spring有一种机制(有很多和自定义的),可以将其反序列化为所需的数据。 标准解决方案是@RequestBody
,假设您具有可以正确处理JSON的适当注册的HttpMessageConverter
。 如果您在类路径上具有Jackson 2,Spring会自动注册MappingJackson2HttpMessageConverter
,它可以正确地将JSON反序列化为Java POJO类型。
该文档提供了许多示例,并说明了如何使用它。 使用JSON,您可以使用与您发送的字段相对应的字段来定义POJO类型
class RequestPojo {
private String paramA;
private String paramB;
private String paramC;
// and corresponding getters and setters
}
并将此类型的@RequestBody
注释的参数添加到您的处理程序方法中
public ServiceAResponse serviceA(@RequestBody RequestPojo pojo) {
pojo.getParamB(); // do something
return ...;
}
Jackson允许您通过注释或通过ObjectMapper
配置来定义如何处理缺少的值。
@RestController
不在此处。 如其javadoc所述,
带有此注释的类型被视为控制器,其中
@RequestMapping
方法默认情况下采用@ResponseBody
语义。
在我看来,您此时正在传递单个JSON对象,而不是一组参数,因此Spring无法将您发送的内容与您提供的任何参数进行匹配。
尝试
@RequestBody List<ListUnit> listOfUnits
而不是@RequestParam
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.