Swagger TypeError: не удалось выполнить 'fetch' в 'Window': запрос с методом GET/HEAD не может иметь тело

Я добавил Swagger в свое приложение Spring Boot 2:

Это мой конфиг Swagger:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket api() {
        // @formatter:off
        return new Docket(DocumentationType.SWAGGER_2)  
                .select()                                  
                .apis(RequestHandlerSelectors.any())              
                .paths(PathSelectors.any())                          
                .build();
        // @formatter:on
    }

}

Это зависимость Maven:

    <!-- Swagger2 -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.8.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.8.0</version>
    </dependency>

Когда я пытаюсь вызвать, например, http://localhost: 8080/api/activator/auditevents, происходит сбой со следующей ошибкой:

TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.

enter image description here

Что я делаю не так и как это исправить?

Ответ 1

Сообщение об ошибке на самом деле говорит, в чем проблема. Вы публикуете данные с помощью curl, используя опцию -d, пытаясь использовать GET.

Если вы используете опцию -d, curl сделает POST.
Если вы используете опцию -X GET, curl сделает GET.

Метод HTTP GET предназначен для запроса представления указанного ресурса. Запросы с использованием GET должны только извлекать данные и, следовательно, не могут иметь тела.

Больше информации о ПОЛУЧИТЬ против ПОЧТЫ

Ответ 2

У меня была такая же проблема с моим решением .net core 2.0 и методом GET, который принимает идентификатор элемента в качестве ключа заголовка или выполняет поиск по параметрам в теле. Это не лучший способ реализации, но это особый случай.

Как уже упоминалось в этом обсуждении. Спецификация HTTP не запрещает использование тела в GET, но swagger не реализует его таким образом. Даже если в GET Requests есть API, которые отлично работают с телом.

Более того, интерфейс Swagger добавляет этот объект body в запрос, даже если это пустой/неопределенный/пустой объект. Это -d параметр "body_content_here". Так что в моем случае, когда я выполняю поиск только по id, а тело пусто, оно все равно отправляет пустой объект (-d "{}") и выдает указанную ошибку.

Возможные решения:

  • Начните использовать приложение почтальона для этого запроса - он будет работать нормально. Проверено.

  • Попробуйте переместить более сложный запрос GET (например, поиск с критериями) в независимый метод POST.

  • Использовать сгенерированный запросом CURL запрос без параметра -d

Ответ 3

я столкнулся с этим вопросом. вот как я решил это:

у меня был такой метод:

[HttpGet]
public IEnumerable<MyObject> Get(MyObject dto)
{
      ...
}

и я получаю ошибку. Я считаю, что пользовательский интерфейс Swagger интерпретирует параметры Get как FromBody, поэтому использует флаг curl -d. я добавил декоратор [FromQuery] и проблема была решена:

[HttpGet]
public IEnumerable<MyObject> Get([FromQuery]MyObject dto)
{
      ...
}

Кстати, это также меняет интерфейс для этого метода. вместо предоставления json у вас будет поле формы для каждого свойства объекта параметра.

Том

Ответ 4

Глядя на сваггерское исключение/сообщение об ошибке, похоже, что вы вызываете метод Get с набором тела ввода. Согласно документации метод GET не принимает тела. Вам нужно изменить метод GET на метод POST. Он должен работать.

Ответ 5

Не передавайте метод метода в методе Get.

let res = await fetch("http://localhost:8080/employee_async",{
                method: "POST",
                body:JSON.stringify(data),
                mode:"cors",
                headers: {"Content-type":"application/json;charset=utf-8"}})

Это используется только для сообщений. Если мы не назначаем какой-либо узел типа метода, который автоматически рассматривается как метод Get

Ответ 6

Возможно, проблема @RequestMapping(value = "/<your path>", method = RequestMethod.POST) с отображением метода, убедитесь, что вы используете @RequestMapping(value = "/<your path>", method = RequestMethod.POST) и помещаете данные как тело с помощью @RequestBody

Ответ 7

Я также получил ту же ошибку на Swagger UI. Моя проблема заключалась в том, что я ошибочно пометил метод Api как GET и отправил данные в теле запроса. Как только я изменил аннотацию @GET на @POST, проблема была решена.