Javascript 尝试从web服务中删除时发生HTTP 405错误
我有一个简单的JavaWeb服务,它使用Jersey处理我的SQL方法。HTTP调用来自角度项目Javascript 尝试从web服务中删除时发生HTTP 405错误,javascript,angular,cors,jersey,http-delete,Javascript,Angular,Cors,Jersey,Http Delete,我有一个简单的JavaWeb服务,它使用Jersey处理我的SQL方法。HTTP调用来自角度项目GET和POST工作正常,但当我尝试删除时,会出现HTTP405错误 以下是我在Angular中调用该方法的方式: deletaDados(id){ this.service.deleteData(id) } + 这是DELETEJava方法: @DELETE @Path("{id}/") public Response delete(@PathParam("id")
GET
和POST
工作正常,但当我尝试删除时,会出现HTTP405
错误
以下是我在Angular中调用该方法的方式:
deletaDados(id){
this.service.deleteData(id)
}
+
这是DELETE
Java方法:
@DELETE
@Path("{id}/")
public Response delete(@PathParam("id") long id) throws SQLException, ClassNotFoundException{
ofertaDAO dao = new ofertaDAO();
dao.delete(id);
return Response
.status(200)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "1209600")
.entity(id)
.build();
}
似乎是对的。。。不知道我为什么会收到
405
错误。如果来自前端JavaScript代码的DELETE
是一个跨源请求,那么您的浏览器(自动)将首先发送一个请求
因此,您看到的405
可能是对飞行前OPTIONS
请求的响应——如果是这样,那么您需要在服务器端Java代码中有一个显式的OPTIONS
处理程序
OPTIONS
处理程序只需返回一个带有200
状态和必要的CORS头的响应,而无响应正文;比如说:
@OPTIONS
public Response options(){
return Response
.status(200)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization")
.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "1209600")
.build();
}
顺便说一句,还要注意的是,对于访问控制最大年龄响应标头,设置一个大于600
(10分钟)的值可能没有多大意义,因为如果您确实为其设置了一个大于该值的值,Chrome无论如何都会将其钳制为600
至于为什么在从前端JavaScript代码发送GET
或POST
时没有遇到405,原因是代码发送的GET
和POST
请求没有触发浏览器进行预飞行的特征(如自定义标题)。但是跨源DELETE
请求总是会触发浏览器进行预飞行。对不起,我不明白我必须做什么,我的DELETE方法中不是已经调用了200状态的响应吗?是的,http调用来自一个角度项目(编辑了问题)。不确定您的建议是什么,您可以再解释一下吗?删除方法的服务器代码看起来不错&当浏览器实际从您的代码发送删除请求时,应该可以工作。但是,当跨原点删除操作正常时,浏览器会发出两个请求:首先,浏览器会自行发出飞行前选项请求,如果服务器对该飞行前选项请求发送了正确的响应,那么接下来浏览器会从代码中发送删除请求。因此,您的服务器需要处理这两个单独的请求:首先需要用200来响应选项,然后需要用200来响应删除。
@OPTIONS
public Response options(){
return Response
.status(200)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization")
.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "1209600")
.build();
}