我试图通过ajax帖子将数据发布到spring控制器。我的ajax代码是
function postData(tag){
console.debug(tag);
var targetUrl = "/add/tag";
$.ajax({
url : targetUrl,
type : "POST",
data : tag,
dataType : "text",
success : function(response){
console.debug(response);
},
error : function(){
console.debug("error : ".concat(response));
}
});
}
我的控制器代码是
@RequestMapping(value = "/add/tag", method = POST, consumes = { "application/json" },headers = "content-type=application/x-www-form-urlencoded")
@ResponseBody
public Integer addTag(HttpServletRequest request,
@PathVariable("uid") String gatheringUid, @RequestBody String tag) {
System.out.print(tag);
return gatheringService.updateGathering(gatheringUid, tags);
}
在服务器端,它打印附加了“=”符号的标签的值,而在firebug控制台上的值打印为我输入。
例如,当我发布数据“test”时,在firebug控制台上打印“test”,在服务器端控制台上打印“test =”。
任何人都可以告诉我这里有什么问题。
提前致谢, 问候。
答案 0 :(得分:5)
这是AJAX发送内容类型为application/x-www-form-urlencoded
的POST的结果。
Spring使用StringHttpMessageConverter
来解析绑定到@RequestBody
带注释的String
参数的参数。在内部,这将检查请求是否为表单POST。如果是,它会将整个身体反序列化,就好像它是一个表单提交一样。在这种情况下,单个单词text
看起来好像是,例如,没有值的单个<input>
元素,即。 text=
。
如果您感到好奇,可以在ServletServerHttpRequest#getBodyFromServletRequestParameters(..)
中完成。
将您的内容类型更改为更合适的内容,可能是text/plain
。不要使用dataType
。使用contentType
或headers
。
答案 1 :(得分:0)
FYI,根据Sotirios的回答,以下代码在Ajax jQuery代码中起作用。
$.ajax({
type : "post",
dataType : 'json',
contentType : 'text/plain', // This was added to delete the =
url : 'myURL',
data : id
})