Как сохранить нули в сервлете Spring GET? - PullRequest
3 голосов
/ 28 января 2020
@RestController
public class MyController {
    @GetMapping("/get)
    public void get(Map<String, String> params) {
        println(params.get("optional")); //"null"
    }

    @PostMapping("/post)
    public void post(Map<String, String> params) {
        println(params.get("optional")); //null
    }
}

localhost:8080/get?key=value&optional=null

Результат: значение ключа optional будет "null" записано как String, а не как тип null.

Тогда как запрос POST будет работать следующим образом :

{
    "key": "value",
    "optional": null
}

Вопрос: как сделать так, чтобы запрос GET вел себя так же, как POST? Значит, как я могу сказать Spring интерпретировать пустую строку в GET как реальное нулевое значение?

Ответы [ 3 ]

3 голосов
/ 28 января 2020

Вы не можете передать null через параметр HTTP-запроса, как вы делаете это в JSON. Потому что null в запросе HTTP не имеет особого значения и обрабатывается как любая другая строка. Вместо этого просто не передавайте optional параметр

localhost:8080/get?key=value
1 голос
/ 29 января 2020

Как говорит @Nikolai, null не имеет особого значения в запросе. Запрос часто называют Query String, например, в AWS API Gateway, который более информативен, так как сообщает, что это строка, а не Map, Strings только с кодированием chars , в этом контексте понятия «ноль» не существует.

IMO Не рекомендуется использовать Map<String,String> params, если вы можете его избежать, скорее предпочитайте строгие типы и перечисляйте все возможные параметры запроса с необязательными параметры для необязательных входов. Если вы хотите, чтобы пользователи указали Map, он должен быть в ТЕЛЕ, но GET с телом мне кажется неправильным, поэтому вам может потребоваться изменить метод HTTP.

Если у вас есть много параметров, и именно поэтому вы используете Map, помните, что некоторые браузеры ограничивают символы в URL до 2048, поэтому это может быть опасно, и у вас может быть случай, когда пользователь не может указать все параметры, которые ему нужны из-за этого ограничения.

TL; DR: Map<String,String> должен быть в теле запроса.

1 голос
/ 28 января 2020

Вы могли бы сделать что-то подобное.

@RequestParam(name = "optional", required = false) String optional

Spring Docs

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