Как отобразить параметры динамического запроса в Spring Boot RestController - PullRequest
0 голосов
/ 07 января 2019

Можно ли отобразить параметры запроса с динамическими именами с помощью 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
    ) {
        //
    }
}

Если возможно, я ищу что-то, что позволит пользователю определить любое количество возможных значений фильтра, и для тех, которые будут отображаться как HashMap с помощью Spring Boot.

@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[*].

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Это похоже на решаемую проблему. Насколько я знаю, решения не идеальны, но есть способы.

Предыдущая попытка, похоже, была направлена ​​на поиск идеального решения, когда весь состав фильтра был известен в пути.

Пружина MVC заполнена

Вся совокупность динамических критериев, которые пользователь определяет, может быть передана по некоторой базовой схеме, которую вы определяете, как один параметр ключ = значение от клиента, а затем разлагается на его элементы после получения.

Вы также можете отправить два параметра: «поля» и «значения», где списки каждого из них закодированы там соответственно с некоторым осторожным разделителем по вашему выбору (это может быть закодированный специальный символ, который пользователь не может физически набрать, возможно).

Вам по-прежнему требуется, как и при любом другом подходе, когда клиентская сторона отправляет критерии (например, критерии фильтра), полная защита от любого злонамеренного использования параметров, так же, как клиент пытается внедрить в них критерии 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. 
0 голосов
/ 07 января 2019

Матричные переменные работают на вас? Если я вас правильно понимаю, может быть так:

// GET /products/filters;name=foo;length=100

@ GetMapping ( "/ продукция / фильтры") общественные недействительные продукты ( @MatrixVariable MultiValueMap matrixVars) {

// matrixVars: ["name" : "foo", "length" : 100]

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...