2017-10-25 13 views
0

私のジャージーを使用してSQLメソッドを処理する単純なJava Webサービスがあります。http呼び出しは角度のあるプロジェクトから取得しています。 HTTP 405エラーが表示されます。Webサービスから削除しようとしたときにHTTP 405のエラーが発生しました

は、これは私が角度

 deletaDados(id){ 

    this.service.deleteData(id)  
    } 

+

deleteData(id){ 

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

} 

でメソッドを呼び出す方法であり、これは

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

は思える削除Javaメソッドです...全く分からない理由私は405エラーを取得しています。

答えて

1

フロントエンドのJavaScriptコードから取得したDELETEがクロスオリジンのリクエストである場合、ブラウザは自動的にCORS preflight OPTIONS requestを送信します。

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

ところで、またAccess-Control-Max-Ageレスポンスヘッダのため600(10分)より任意の大きいの値を設定する際に多くのポイントは、おそらくそこではないことに注意してください - あなたは大きな値を設定しない場合ので、とにかく、Chromeはそれを600に固定します。

そして限り、あなたのフロントエンドのJavaScriptコードからGETまたはPOSTを送信するときにも、その405に実行しない理由として、その理由は、あなたのコードが送信されGETPOST要求は(特性を持っていないということですカスタムヘッダーなど)を使用して、プリフライトを行うようにブラウザをトリガします。しかし、クロスオリジンDELETE要求常にトリガーブラウザは、プリフライトを行う。

+0

申し訳ありませんが、私は何をしなければならない、私の応答が200の状態で既に私の削除メソッドで呼び出されていないことを理解していない?はい、httpの呼び出しは、角度のあるプロジェクトから来ています(質問を編集しました)。何を提案しているのかわからない、再度説明できますか? –

+0

DELETEメソッドのサーバーコードが正常に見えます。ブラウザが実際にコードからDELETE要求を実際に送信したときに動作するはずです。しかし、クロスオリジンのDELETEが正しく動作するとき、ブラウザは* 2つのリクエストを行います:まず、ブラウザがプリフライトOPTIONSリクエストを行い、サーバがそのプリフライトOPTIONSリクエストに適切なレスポンスを送信すると、ブラウザはコードからDELETEリクエストを送信します。したがって、あなたのサーバーは、2つの別々の要求を処理する必要があります。まず、OPTIONSの200で応答し、次にDELETEに200で応答する必要があります。 – sideshowbarker

関連する問題