我有一个带有 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/