尽管我当然不是第一个对此感到疑惑的人,但我还没有找到与我的具体问题类似的话题。我试图用Java将数据发布到我的RESTful服务:
@POST
@Path("{projectId}/rename")
@Produces(MediaType.APPLICATION_JSON)
public Response renameProject(@PathParam("projectId") final Long projectId, String name) {
Logger.getLogger(ProjectService.class.getName()).info("rename project service called " + name);
return requestHandler.handleRenameProject(projectId, name);
}
我正在使用这个JS函数来做到这一点
function renameProject(projectId, name) {
$.post('/rest/projects/' + projectId + '/rename', {name : name}, function(data) {
/* change project name in sidebar */
$("a[data-pk='" + data.key.id + "']").text(name);
}, 'json');
}
令我惊讶的是,日志的输出是
[INFO] Apr 28, 2014 6:56:05 PM de.uniluebeck.collaboratex.service.ProjectService renameProject
[INFO] Information: rename project service called name=New+Project
为什么参数不仅包含值,还包含它自己的名称作为连接字符串?我想我一定不能用JSON发送东西?这也暗示了我在这方面的事实,即Java中的服务曾经用
注释 @Consumes(MediaType.APPLICATION_JSON)
同样会导致415不支持的媒体类型错误。很高兴任何输入,猜猜这一定很容易。 :)
答案 0 :(得分:2)
您的参数name
未被注释为@*Param
,因此它会获得完整的邮件正文,在您的情况下,其类型为application/x-www-form-urlencoded
{ {3}}解释说:
数据选项可以包含形式为key1 = value1& key2 = value2的查询字符串,也可以包含{key1:' value1',key2:' value2&#39>形式的对象;}。如果使用后一种形式,则在发送之前使用jQuery.param()将数据转换为查询字符串。通过将processData设置为false可以避免此处理。如果您希望将XML对象发送到服务器,则可能不希望进行处理;在这种情况下,将contentType选项从application / x-www-form-urlencoded更改为更合适的MIME类型。
所以你有两个选择:
选项1:如此使用@FormParam
:
@POST
@Path("{projectId}/rename")
@Produces(MediaType.APPLICATION_JSON)
public Response renameProject(@PathParam("projectId") Long projectId,
@FormParam("name") String name) {
return Reponse.ok().build();
}
选项2:像这样发送适当的json:
@POST
@Path("{projectId}/rename")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response renameProject(@PathParam("projectId") Long projectId,
Map<String, String> paramMap) {
return Reponse.ok().build();
}
在你的JS中:
$.ajax({
url: '/rest/projects/' + projectId + '/rename',
data: JSON.stringify({name : name}),
processData: false,
contentType: 'application/json',
dataType: 'json',
success: function(data) {
console.log(data);
}
});
您通常只使用复杂数据类型的选项2(使用jackson序列化)(即,您的客户端对象由某个实体表示,您现在可以将其命名为Java方法的简单参数)。