使用JavaScript发布到Restful Java Services不能用作JSON吗?

时间:2014-04-28 17:27:37

标签: javascript jquery json rest jax-rs

尽管我当然不是第一个对此感到疑惑的人,但我还没有找到与我的具体问题类似的话题。我试图用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不支持的媒体类型错误。很高兴任何输入,猜猜这一定很容易。 :)

1 个答案:

答案 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方法的简单参数)。

相关问题