尝试从Web服务删除时出现HTTP 405错误

时间:2017-10-25 00:45:26

标签: angular http jersey cors http-delete

我有一个简单的Java Web服务,可以使用Jersey处理我的SQL方法。 HTTP调用来自Angular项目。 GETPOST工作正常,但当我尝试DELETE时,出现HTTP 405错误。

这就是我在Angular中调用方法的方法:

deletaDados(id){     
    this.service.deleteData(id)      
}

+

deleteData(id){    
    return this.http.delete(`${this.api}/${id}`).subscribe((res) => {
});;

}

这是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错误。

1 个答案:

答案 0 :(得分:1)

如果来自您的前端JavaScript代码的DELETE是跨源请求,那么您的浏览器(自动自动)将首先发送CORS preflight OPTIONS request

因此,您看到的405似乎可能是对该预检OPTIONS请求的响应 - 如果是,那么您需要有一个明确的OPTIONS处理程序在服务器端Java代码中。

那个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();
}

顺便提一下,还要注意,对于Access-Control-Max-Age响应标头,设置一个大于600(10分钟)的值可能没什么意义 - 因为如果你设置的值大于600对于它,无论如何,Chrome只会将其限制为GET

至于为什么在从前端JavaScript代码发送POSTGET时也不会遇到405,原因是POST和{ {1}}请求您的代码发送没有特征(例如自定义标头),这将触发您的浏览器执行预检。但是跨域DELETE请求总是触发浏览器进行预检。