Spring Boot не принимает список параметров, заключенных в скобки - PullRequest
2 голосов
/ 02 марта 2020

У меня есть следующая чрезвычайно простая программа SpringBoot

// APIEndpoints.java

// Imports!

public class APIEndpoints {
    @PostMapping("deduplicate")
    public String deduplicate(@RequestParam(value = "data") String data) {
        return data;
    }
}
// RestServiceApplication.java

@SpringBootApplication
public class RestServiceApplication {

    public static void main(String[] args) throws SQLException {
        SpringApplication.run(RestServiceApplication.class, args);
    }
}

Я могу запустить сервер Springboot через ./gradlew bootRun и проверил, что сервер работает через другие конечные точки.

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

localhost:8080/deduplicate?data=1,23,4,5

Однако, это не удается с ошибкой: «HTTP 400: Bad Request»

localhost:8080/deduplicate?data=[1,23,4,5]

Это кажется нежелательным поведением, и не выглядит фундаментальным ограничением форматирования URL или чем-то подобным.

Что является причиной этой ошибки, и как настроить Spring Boot для приема списков, заключенных в квадратные скобки?

Ответы [ 3 ]

2 голосов
/ 02 марта 2020

Таким образом, основной причиной получения этой ошибки являются символы "[" и "]". Подробнее о URL и URI, разрешенных символам в этом ответе: Какие символы делают URL недействительным? .

Лучший способ (следуя стандарту) - кодировать URL на стороне клиента:

encodeURL("localhost:8080/deduplicate?data=[1,23,4,5]")
>localhost:8080/deduplicate?data=%5B1%2C23%2C4%2C5%5D

Используя почтальона, вы хотите выбрать свои данные в окне параметров запроса, щелкнуть правой кнопкой мыши и выбрать «EncodeURIComponent»:

Пример кодирования с использованием почтальона передаст ваш URL-адрес

 localhost:8080/deduplicate?data=%5B1%2C23%2C4%2C5%5D

И он может быть успешно прочитан tomcat (я полагаю, вы используете его в качестве контейнера сервлета).

Если вы не можете изменить свое поведение интерфейса, вы можете использовать

relaxedQueryChars / relaxedPathChars

в определении соединителей, чтобы разрешить эти символы. Используя java и пружину (если tomcat встроен):

    @Component
    public class TomcatWebServerSettings implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
        @Override
        public void customize(TomcatServletWebServerFactory factory) {
            factory.addConnectorCustomizers(connector ->
            {
                connector.setAttribute("relaxedQueryChars", "[]");
            });
        }
    }

Или вы можете добавить атрибут relaxedQueryChars под сервером. xml (% TOMCAT_FOLDER% / conf /):

  <Connector 
        //other params,
          relaxedQueryChars="[,]"
         />

Также вы можете понизить ваш tomcat до версии ниже 7.0.76 (настоятельно не рекомендуется - по соображениям безопасности).

0 голосов
/ 02 марта 2020

Вы используете небезопасные символы в URL, поэтому у вас есть проблемы. RFC1738

" < > # % { } | \ ^ ~ [ ] ` including the blank/empty space.
0 голосов
/ 02 марта 2020

либо

дедупликация? Данные = 1,23,4,5

или

дедупликация? Данные = 1 & данные = 23 & данные = 4 & data = 5

Вот как это работает, если вы хотите использовать массив REST API в качестве параметра запроса.

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