javascript - AngularJS 和 Jersey REST DELETE 操作失败,状态代码为 415

标签 javascript rest tomcat angularjs jersey

我有一个带有 Jersey 后端应用程序的 AngularJS 网络应用程序。

现在一切正常,使用 ngResource 从 AngularJS 访问 REST 资源。唯一的问题是 DELETE 选项。

我有以下代码使用我的 ngResource 删除类(class):

    Course.deleteCourse = function(course) {
    course.$remove({
        courseId:course.id
    });
    return course;
};

在后端( Jersey )我有以下代码:

    @DELETE
@Path("{id}")
public final void remove(@PathParam("id") final String id) {
    System.out.println("DELETE ID = " + id);
}

如果我尝试删除一个项目,则从 Angular 调用以下 url:

DELETE http://localhost:8080/manager-api/courses/5

这很好(在我之后)。如果我从 CURL 调用此 url,我会从发布到控制台的后端获取 ssystem.out。

在客户端应用程序 (AngularJS) 中,我在浏览器控制台上收到以下异常:

DELETE http://localhost:8080/manager-api/courses/5 415 (Unsupported Media Type) 

有人知道问题出在哪里吗? POST + GET 工作正常。

我有以下消费/生产注释:

@Consumes({ MediaType.APPLICATION_JSON })

@Produces({ MediaType.APPLICATION_JSON })

预先感谢您的帮助。

问候 马克


编辑:

我尝试用 $http 替换从 AngularJS 访问 REST 服务的方式。

现在我的服务如下所示:

MyApp.factory("Course", ["$http", function ($http) {
var courseBaseUrl = "/api/courses/";

return {
    show: function show(courseId) {
        return $http.get(courseBaseUrl + courseId);
    },
    list: function list() {
        return $http.get(courseBaseUrl, {});
    },
    remove: function remove(courseId) {
        return $http.delete(courseBaseUrl + courseId, {});
    },
    save: function save(course) {
        return $http.post(courseBaseUrl, course, {});
    }
};

}]);

结果还是一样。应用程序调用例如

DELETE http://localhost:8080/manager-api/courses/1

并收到一个

DELETE http://localhost:8080/manager-api/courses/1 415 (Unsupported Media Type) 

如果我在 Curl 上调用相同的 DELETE 调用,一切正常。

感谢您的帮助 马克

最佳答案

我也遇到过这个,问题是 Angular 总是在 DELETE 请求上将 Content-Type header 设置为 xml,并且当您指定您的 api 使用/生成带有注释的 JSON 时,jersey 会抛出一个错误。

所以要修复它(从客户端),设置内容类型 header ,例如:

.config(function($httpProvider) {
  /**
   * make delete type json
   */
  $httpProvider.defaults.headers["delete"] = {
    'Content-Type': 'application/json;charset=utf-8'
  };
})

但是,由于我不明白/不知道的原因,如果没有数据,angular 将从请求中删除内容类型 header 。如果不是因为浏览器(至少是 chrome)总是发送内容类型这一事实,这将是有道理的......无论如何你将不得不在 Angular 来源中找到它:

  // strip content-type if data is undefined
  if (isUndefined(config.data)) {
    delete reqHeaders['Content-Type'];
  }

然后摆脱它。我不知道在不编辑源代码的情况下执行此操作的方法。也许有更好的 JS 知识的人,呃,知道怎么做。


或者,从服务器端,您可以按照 Rob 的建议更改 Jersey 配置以允许使用 MediaType.APPLICATION_XML

@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public final void remove(@PathParam("id") final String id) {
    System.out.println("DELETE ID = " + id);
}

关于javascript - AngularJS 和 Jersey REST DELETE 操作失败,状态代码为 415,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17379447/

相关文章:

javascript - 如何按两个属性对json数据进行排序

javascript - JavaScript函数来处理无法在$(window).resize()上使用的CSS自定义属性

javascript - 为所有 Kendo UI 网格设置默认属性

javascript - 如何使用 package.json 中的 'main' 参数?

java - HttpConnection维护Session

tomcat - 限制 Solr 数据导入到本地主机,但允许从任何地址进行选择

c# - 如何在点击时交换图像?

angularjs - 2 个端口上的 Node Rest api 和 angularJS 应用程序的 CORS 问题

java - 无法反序列化 - Hibernate Spring Boot

java - 无法在重新部署时查找 JNDI 资源