moo*_*nli 8 javascript rest tomcat jersey angularjs
我有一个带有Jersey Backend应用程序的AngularJS web应用程序.
现在一切正常,使用ngResource从AngularJS中访问REST资源.唯一的问题是DELETE选项.
我有以下代码使用我的ngResource删除课程:
Course.deleteCourse = function(course) {
course.$remove({
courseId:course.id
});
return course;
};
Run Code Online (Sandbox Code Playgroud)
在后端(泽西岛),我有以下代码:
@DELETE
@Path("{id}")
public final void remove(@PathParam("id") final String id) {
System.out.println("DELETE ID = " + id);
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试删除项目,则从Angular调用以下URL:
DELETE http://localhost:8080/manager-api/courses/5
Run Code Online (Sandbox Code Playgroud)
这很好(在我之后).如果我从CURL调用此URL,我会将后端的ssystem.out发布到控制台.
在客户端应用程序(AngularJS)中,我在浏览器控制台上收到以下异常:
DELETE http://localhost:8080/manager-api/courses/5 415 (Unsupported Media Type)
Run Code Online (Sandbox Code Playgroud)
谁知道问题可能是什么?POST + GET工作正常.
我有以下消费/产生注释:
@Consumes({ MediaType.APPLICATION_JSON })
Run Code Online (Sandbox Code Playgroud)
@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, {});
}
};
Run Code Online (Sandbox Code Playgroud)
}]);
结果仍然相同.应用程序调用例如
DELETE http://localhost:8080/manager-api/courses/1
Run Code Online (Sandbox Code Playgroud)
并收到一个
DELETE http://localhost:8080/manager-api/courses/1 415 (Unsupported Media Type)
Run Code Online (Sandbox Code Playgroud)
如果我在Curl上调用相同的DELETE调用,一切正常.
谢谢你的帮助Marc
pau*_*lth 11
我也遇到过这个问题,问题是angular总是在DELETE请求上将Content-Type标头设置为xml,并且当你指定你的api使用注释消耗/生成JSON时,jersey将会发生错误.
所以要修复它(从客户端),设置内容类型标题,例如:
.config(function($httpProvider) {
/**
* make delete type json
*/
$httpProvider.defaults.headers["delete"] = {
'Content-Type': 'application/json;charset=utf-8'
};
})
Run Code Online (Sandbox Code Playgroud)
但是,由于我不理解/不知道的原因,如果没有数据,angular将从请求中删除内容类型头.如果不是因为浏览器(至少是chrome)将始终发送内容类型的事实,这将是有意义的...无论如何,你将不得不去角度来源找到这个的麻烦:
// strip content-type if data is undefined
if (isUndefined(config.data)) {
delete reqHeaders['Content-Type'];
}
Run Code Online (Sandbox Code Playgroud)
并摆脱它.我不知道如何在不编辑源代码的情况下执行此操作.也许有更好的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);
}
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题,尝试在删除方法中返回 Course 对象的新实例。
@DELETE
@Path("{id}")
public final Course remove(@PathParam("id") final String id) {
System.out.println("DELETE ID = " + id);
return new Course();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7933 次 |
最近记录: |