javascript - 使用 JavaScript 发布到 Restful Java 服务不能像 JSON 一样工作?

标签 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 Unsupported Media Type 错误。很高兴有任何输入,我猜这一定很简单。 :)

最佳答案

您的参数 name 未被注释为 @*Param,因此它将获得完整的消息正文,在您的情况下为 类型application/x-www-form-urlencodedjQuery.ajax()解释:

The data option can contain either a query string of the form key1=value1&key2=value2, or an object of the form {key1: 'value1', key2: 'value2'}. If the latter form is used, the data is converted into a query string using jQuery.param() before it is sent. This processing can be circumvented by setting processData to false. The processing might be undesirable if you wish to send an XML object to the server; in this case, change the contentType option from application/x-www-form-urlencoded to a more appropriate MIME type.

所以你有两个选择:

选项 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);
  }
});

您通常只对使用 jackson 进行(反)序列化的复杂数据类型使用选项 2(即,您的客户端对象由一些实体表示,您现在可以将其命名为 Java 方法的一个简单参数)。

关于javascript - 使用 JavaScript 发布到 Restful Java 服务不能像 JSON 一样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23347454/

相关文章:

jquery - 如何关闭 jQuery 打开的对话框?

javascript - Bootstrap 轮播控件没有响应

javascript - 如何在javascript中更新json的属性值

json - 在 go 中通过同一个 websocket 多次读写

php - HTML 基本 URL 和链接

javascript - 令人困惑的JavaScript继承行为

javascript - jQuery 从 html 单元格读取值

php - 如何比较两组 1000 个数字?

javascript - 如何在附加元素时运行代码,就像 jQuery 的 live() 处理事件一样?

ios - 尝试使用 Alamofire 放置方法时,JSON 写入 (_SwiftValue) 中的类型无效