我有一个简单的Java Web服务,可以使用Jersey处理我的SQL方法。 HTTP调用来自Angular项目。 GET
和POST
工作正常,但当我尝试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
错误。
答案 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代码发送POST
或GET
时也不会遇到405,原因是POST
和{ {1}}请求您的代码发送没有特征(例如自定义标头),这将触发您的浏览器执行预检。但是跨域DELETE
请求总是触发浏览器进行预检。