Rest контроллер запрашивает несколько переменных пути с несколькими параметрами запроса - PullRequest
0 голосов
/ 06 июня 2019

Как мы можем создать Rest API (контроллер Spring), который позволяет нескольким переменным пути иметь параметры запроса?

Где1) функция является переменной пути, а id = имя_функции является параметром запроса2) подфункция является переменной пути, а id = subfuntionname является параметром запроса

Request URL : /content/v1/clients/clientname/function?id=functionname&subfunction?id=subfunctionname

Обновление Я использую изменения матрицы, предложенные

/ content / v1 / clients / clientname / function; id = имя функции / подфункция; id = имя подфункцииМетод, показанный ниже, не работает должным образом.Как должно выглядеть определение метода?

 public HashMap<String, List<Model>> getContent(
        @PathVariable String clientname,            
        @MatrixVariable(name="id", pathVar="function") List<String> capabilitiesId,            
        @MatrixVariable(name="id", pathVar="subfunction") List<String> subcapabilitiesId) {

}

Error : Missing matrix variable 'id' for method parameter of type List

Ответы [ 2 ]

0 голосов
/ 06 июня 2019
/content/v1/clients/clientname/function?id=functionnamec&subfunction?id=subfunctionaname

Разбор URI определяется RFC 3986 . В частности, U+003F QUESTION MARK является зарезервированным символом, первый экземпляр которого служит разделителем между относительной частью и запросом.

То есть разрывы в вашем примере будут восприниматься как

path: /content/v1/clients/clientname/function
query: id=functionnamec&subfunction?id=subfunctionaname

И если бы мы проанализировали запрос, как если бы это было значение application/x-www-form-urlencoded ....

>>> import urllib.parse
>>> urllib.parse.parse_qs("id=functionnamec&subfunction?id=subfunctionaname")
{'id': ['functionnamec'], 'subfunction?id': ['subfunctionaname']}

Мы видим, что второй знак вопроса становится частью имени параметра.

Короче говоря, это совершенно правильный URI, но вряд ли он даст результаты, на которые вы надеетесь.

/content/v1/clients/clientname/function/subfunction?id=functionnamec&id=subfunctionaname

Это может быть полезно, но есть вероятность путаницы с параметрами запроса идентификатора дубликата

>>> urllib.parse.parse_qs("id=functionnamec&id=subfunctionaname")
{'id': ['functionnamec', 'subfunctionaname']}

/content/v1/clients/clientname/function/subfunction?function.id=functionnamec&subfunction.id=subfunctionaname

>>> urllib.parse.parse_qs("function.id=functionnamec&subfunction.id=subfunctionaname")
{'function.id': ['functionnamec'], 'subfunction.id': ['subfunctionaname']}

Это может быть проще.

Я думаю, что было бы обычным извлекать данные из запроса и вместо этого помещать их в путь

/content/v1/clients/clientname/function/functionname/subfunction/subfunctionaname

А затем извлеките параметры пути, которые вам нужны.

0 голосов
/ 06 июня 2019

Это невозможно.В контроллере REST у вас есть два типа параметров:

  • Параметр пути: параметр, полезный для выбора ресурса.(метод вашего класса)

  • Параметр запроса: параметр, полезный для отправки другой информации.

В вашем случае я считаю, что это хорошая идеяотправьте всю эту информацию в полезную нагрузку, используя метод POST или PUT http.

Если вы не можете использовать полезную нагрузку, вы можете получить следующее решение: Запросить URL: / content / v1 / clients / clientname / function1 / function2?id1 = functionnamec & id2 = subfunctionaname

Таким образом, вы можете создать свой контроллер с 2 параметрами пути и 2 параметрами запроса:

@GET
@Path("/basePath/{funct1}/{funct2}")
public Response <methodName>(@PathParam("funct1") String funct1, @PathParam("funct2") String funct2, @QueryParam("id1") String id1, @QueryParam("id2") String id2) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...