簡體   English   中英

如何在 Spring Boot 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]

}

這似乎是一個可以解決的問題。 據我所知,這些解決方案並不理想,但有辦法。

之前的一次嘗試似乎致力於找到一個完美的解決方案,其中過濾器的整個組成在傳輸過程中是已知的。

Spring MVC 填充

用戶定義的整個動態標准可以使用您定義的一些基本方案進行傳輸,作為來自客戶端的一個 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.

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