我有 2 個Chemical資源的GET 端點:在第一個端點中,我希望通過 id 獲取化學物件,這在每個化學制品中都是唯一的。
@GetMapping("/chemical/{id}")
在第二個 GET 端點中,我想要與特定實驗室相對應的所有化學品(實驗室是強制性的)。
@GetMapping("/chemical/{labKey}")
Spring 無法區分/chemical/myLab和/chemical/12,我可以理解這一點。我知道我應該更改端點映射,但是如何更改?有人可以為這個特定案例提出一個好的約定嗎?例如。@GetMapping("/chemical/{labKey}/{id}"對我來說似乎是多余的,因為我不使用labKeypathVariable,我只需要id,我會呼叫這樣的東西:chemicalService.findById(id)。
uj5u.com熱心網友回復:
我認為最好的方法是使用兩個端點:
/chemical/{id}它將使用@GetMapping("/chemicals/{id}").- 第二個將使用查詢引數
labKey根據實驗室密鑰進行過濾。這將有一個通用的@GetMapping("/chemicals").chemicals?labKey=lab1將是 URI。
下面是我的實作。控制器類
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Service
public class ChemicalService {
private List<ChemicalDTO> chemicals = Arrays.asList(
new ChemicalDTO(1L, "chem1", "lab1"),
new ChemicalDTO(2L, "chem2", "lab2"),
new ChemicalDTO(3L, "chem3", "lab1"),
new ChemicalDTO(4L, "chem4", "lab3")
);
public Optional<ChemicalDTO> getChemicalById(Long id) {
return chemicals.stream().filter(e -> e.getId().equals(id)).findAny();
}
public List<ChemicalDTO> getChemicalByLabKey(String labKey) {
if( labKey.isBlank() || labKey.isEmpty() ) return new ArrayList<>();
return chemicals
.stream()
.filter(e -> e.getLabKey().equals(labKey))
.collect(Collectors.toList());
}
}
服務等級
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Service
public class ChemicalService {
private List<ChemicalDTO> chemicals = Arrays.asList(
new ChemicalDTO(1L, "chem1", "lab1"),
new ChemicalDTO(2L, "chem2", "lab2"),
new ChemicalDTO(3L, "chem3", "lab1"),
new ChemicalDTO(4L, "chem4", "lab3")
);
public Optional<ChemicalDTO> getChemicalById(Long id) {
return chemicals.stream().filter(e -> e.getId().equals(id)).findAny();
}
public List<ChemicalDTO> getChemicalByLabKey(String labKey) {
if( labKey.isBlank() || labKey.isEmpty() ) return new ArrayList<>();
return chemicals
.stream()
.filter(e -> e.getLabKey().equals(labKey))
.collect(Collectors.toList());
}
}
DTO類
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class ChemicalDTO {
private Long id;
private String name;
private String labKey;
}
您可以在此處的REST 資源命名約定和示例中找到更多資訊
uj5u.com熱心網友回復:
如果路徑相同并且路徑變數的數量也相同,下面將是處理這種情況的干凈方法。
你可以考慮下面的代碼片段
@GetMapping(value = "/chemical", params = "id")
public String getChemicalById(@RequestParam(value = "id") String id) {
return "ID method: " id;
}
@GetMapping(value = "/chemical", params = "label")
public String getChemicalByLabel(@RequestParam(value = "label") String label) {
return "Label method: " label;
}
網址如下:
- /化學?id=ID
- /化學?標簽=標簽
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/368134.html
上一篇:嘗試向GET函式發送多個引數
下一篇:從curl回應中提取HTTP正文
