[英]Spring Boot - How to get all request params in a map in Spring RestController?
[英]How to map dynamic query parameters in Spring Boot RestController
是否可以使用 Spring Boot 使用動態名稱映射查詢參數? 我想映射如下參數:
/products?filter[name]=foo
/products?filter[length]=10
/products?filter[width]=5
我可以做這樣的事情,但這需要知道每個可能的過濾器,我希望它是動態的:
@RestController
public class ProductsController {
@GetMapping("/products")
public String products(
@RequestParam(name = "filter[name]") String name,
@RequestParam(name = "filter[length]") String length,
@RequestParam(name = "filter[width]") String width
) {
//
}
}
如果可能,我正在尋找允許用戶定義任意數量可能的過濾器值的東西,以及那些被 Spring Boot 映射為HashMap
的東西。
@RestController
public class ProductsController {
@GetMapping("/products")
public String products(
@RequestParam(name = "filter[*]") HashMap<String, String> filters
) {
filters.get("name");
filters.get("length");
filters.get("width");
}
}
在這個問題上發布的答案建議使用@RequestParam Map<String, String> parameters
,但是這將捕獲所有查詢參數,而不僅僅是那些匹配的filter[*]
。
您可以使用映射映射多個參數,而無需在@RequestParam
定義它們的名稱:
@GetMapping("/api/lala")
public String searchByQueryParams(@RequestParam Map<String,String> searchParams) {
...
}
矩陣變量對你有用嗎? 如果我理解正確,可以是這樣的:
// GET /products/filters;name=foo;length=100
@GetMapping("/products/filters") public void products(@MatrixVariable MultiValueMap matrixVars) {
// matrixVars: ["name" : "foo", "length" : 100]
}
這似乎是一個可以解決的問題。 據我所知,這些解決方案並不理想,但有辦法。
之前的一次嘗試似乎致力於找到一個完美的解決方案,其中過濾器的整個組成在傳輸過程中是已知的。
用戶定義的整個動態標准可以使用您定義的一些基本方案進行傳輸,作為來自客戶端的一個 key=value 參數,然后在收到后分解為其元素。
您還可以發送兩個參數:“字段”和“值”,其中每個參數的列表分別在其中編碼,並使用您選擇的一些謹慎分隔符(可能是用戶無法實際鍵入的編碼特殊字符)。
與客戶端提交標准(如過濾標准)的所有其他方法一樣,您仍然需要完全保護參數免受任何惡意使用,就像客戶端試圖在其中嵌入 SQL 標准(SQL 注入)一樣。
但是只要客戶端代碼遵循約定的語法,您就可以一次性從它們那里接收任意數量的動態參數。
客戶:
/products?filter=field1--value1||field2--value2||field3--value3...
這是一個簡化的示例,顯示了太容易“破壞”的分隔符,但這個想法是一些簡單的,甚至完全可讀(這樣做沒有害處)的方案,只是為了將您的字段名稱和值打包在一起以便於傳輸。
服務器:
@RequestMapping(value = "/products", method = RequestMethod.GET)
public String doTheStuff(@RequestParam(value = "filter") String encodedFilter) {
.. decompose the filter here, filter everything they've sent for disallowed characters etc.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.