有物體,
class Employee{
int id;
String name;
String phoneNumber;
}
查詢以下 4 種場景的正確 REST-ful 方式是什么:
- 所有員工名單
- 具有給定 ID 的員工
- 具有給定 ID 和姓名的員工
- 具有給定 ID、姓名和電話號碼的員工
開始兩個非常簡單:
1. /employee
2. /employee/{employee-id}
但是,既然我們要根據多個屬性過濾物體,我能想到的最佳解決方案是:
3. /employee/{employee-id}?name=abc
4. /employee/{employee-id}?name=abc&phoneNumber=123
有沒有更好的方法來做到這一點?有些人提出了解決方案,例如:
3. /employee/{employee-id}/{name}
4. /employee/{employee-id}/{name}/{phoneNumber}
但是,我覺得上面違反了 RESTful 的表示方式。
uj5u.com熱心網友回復:
在 REST API 中,您必須分離集合和特定資源。我會通過指定復數形式的集合和單數形式的資源來明確這一點。因此,集合中的特定資源可以通過 /{collectionName}/{id} 獲取,如果要查詢屬性,請使用 /{collectionName}?attribute1=qwe&attribute2=asd
所以......我寧愿像這樣構造它:
/employees # the entire collection of employees
/employees/{id} # a specific employee by id. No need to have any query params since we fetch an employee by its primary key.
/employees?name=abc&phoneNumber=123 # query the collection of employees for the ones having name=abc and phoneNumber=123
uj5u.com熱心網友回復:
按 ID 和姓名(和電話號碼)搜索員工有點模棱兩可。
通常,通過 ID 查找員工不被視為搜索,而是對現有資源 (GET) 的參考。如果失敗,則應回傳 HTTP 404 NOT FOUND。
按多個屬性搜索通常是 POST:
POST /employees/search/
{
"Name": "Hasan",
"PhoneNumber", "0612345678"
}
原因是您在這里“創建”了一個搜索查詢,具有給定的屬性,因此是 POST。如果搜索沒有結果,則應回傳 HTTP 204 NO CONTENT。
混合按 ID 查找和按(多個)屬性搜索會引發一些問題:
- 是否只回傳與所有屬性匹配的結果?或者與其中任何一個匹配的結果?
- 匹配應該是文字,還是使用其他語法,或者子字串匹配作為默認行為?ID 屬性又如何呢?
- 如果沒有結果,您會期望出現錯誤嗎?還是一個空集合?
- 在這種情況下,您將回傳哪個 HTTP 回應代碼?
使用 GET 進行查找并使用 POST 進行搜索符合 REST 思維方式。如果您發布搜索,則您正在創建一個資源,該資源具有您可以存盤的唯一 ID。您可以稍后檢索此查詢,例如選擇下一頁結果。
編輯:也許(可能)我不應該提出 GET/POST 辯論。兩者都有強烈的論據支持/反對,因此您應該選擇最適合您的具體情況。參見例如這個討論。
它歸結為對我來說,是我不明白你的要求。這個東西的意思是什么:
/employee/{employee-id}?name=abc&phoneNumber=123
可以有多個員工具有相同的員工 ID 嗎?
uj5u.com熱心網友回復:
使用 JSON 字串作為引數,我們可以創建單個 API。這種方法的好處是不需要在 API 引數中使用多個引數,并且將來可以很容易地向過濾器添加選項。
@Getter
@Setter
class EmployeeDTO {
int id;
String name;
String phoneNumber;
}
以下是 API 示例
@GetMapping("/employee")
public String getEmployee(@RequestParam(value = "searchParams") String employee)
throws JsonMappingException, JsonProcessingException {
EmployeeDTO employeeDTO = new ObjectMapper().readValue(employee, EmployeeDTO.class);
// add your code
}
前端資料應作為 JSON 字串傳遞
localhost:8080/employee?searchParams={"id":1,"name":"Abc","phoneNumber": 12345}
必需的依賴項
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
如果出現“在請求目標中發現無效字符”錯誤,請將以下屬性添加到 application.property 檔案中。
server.tomcat.relaxed-query-chars=|,{,},[,]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/474384.html
下一篇:物品清單和物品清單的區別
