Javascript 尝试从web服务中删除时发生HTTP 405错误

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")

我有一个简单的JavaWeb服务,它使用Jersey处理我的SQL方法。HTTP调用来自角度项目
GET
POST
工作正常,但当我尝试删除时,会出现HTTP
405
错误

以下是我在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();
}