簡體   English   中英

Jersey HTTP Delete,Put 響應狀態:405(方法不允許)

[英]Jersey HTTP Delete,Put Response Status: 405 (Method Not Allowed)

第 1 天:在 rest 端點下方添加了刪除操作。

@Path("/company/v1/department")
@Component
public class ManageResource {

@DELETE
@Path("/{identifier}/{identifier_value}/employee")
public void delete(@PathParam("identifier") String identifier,
                   @PathParam("identifier_value") final String identifierValue,
                   @QueryParam("age") final String age) {

 //delete operation
}
}

我能夠使用具有以下請求的郵遞員調用 DELETE 端點:

DELETE: http://localhost:8080/company/v1/department/name/baner/employee?age=50

第 2 天:在同一資源中的更新操作的下面添加了 rest 端點。

@Path("/company/v1/department")
@Component
public class ManageResource {

@DELETE
@Path("/{identifier}/{identifier_value}/employee")
public void delete(@PathParam("identifier") String identifier,
                   @PathParam("identifier_value") final String identifierValue,
                   @QueryParam("age") final String age) {
   
//delete operation
}

@PUT
@Path("/empid/{value}/employee")
@Consumes(MediaType.APPLICATION_JSON)
public void update(@PathParam("value") final String identifierValue,
                   @RequestBody final EmployeeUpdateRequest request) {
   
//update operation
}
}

添加此新端點后,我可以使用郵遞員通過以下請求調用 PUT:

PUT: http://localhost:8080/company/v1/department/empid/epid-123/employee
{
//Json request body
}

但是當我嘗試調用 Delete 端點時,它給了我 405 (Method Not Allowed) 錯誤。 如果我評論我的新 Put 方法,則 Delete 方法工作正常。 另外,如果我將 Put 方法的 Path 替換為“/{identifier}/{identifier_value}/employee”,那么 Delete 和 Put 方法都可以正常工作。

我在 tomcat 中使用 Jersey 1.19。 有人可以幫我弄這個嗎?

你的路徑相互沖突。 讓我試着解釋一下:

DELETE = /{identifier}/{identifier_value}/employee 
PUT = /empid/{value}/employee

這意味着當我們評估從左到右的路徑時,我們可以有 {identifier} 是任何東西,也可以是固定字符串的“empid”

Jersey 總是試圖為 REST 端點找到“最完美”的匹配。 它通過評估從左到右的路徑來實現。 固定字符串總是優先於隨機變量!

基本上這意味着當你想調用一個 DELETE 時,你不能有變量“{identifier}”的值“empid”,因為你已經超出了范圍

所以 DELETE 調用

http://localhost:8080/company/v1/department/empid/empid-123/employee

將不起作用,因為 Jersey 必須決定請求中的“empid”是匹配“{identifier}”(DELETE)還是“empid”(PUT)。 正如我在上面試圖解釋的那樣,固定字符串具有更高的優先級。 相反,任何其他 DELETE 請求,其中

http://localhost:8080/company/v1/department/{identifier}/empid-123/employee

{identifier} != "empid"

作品。

可能的解決方案:

使您的休息端點面向資源

刪除:/employee/{employee-id}

放置:/employee/{employee-id}

注意端點是如何相同的,因為除了大多數系統中的 ID 之外,不需要任何信息來識別實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM