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.
Что я делаю не так и как это исправить?
Ответы
Ответ 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, проблема была решена.
Ответ 8
Некоторые ссылки, относящиеся к документации Swagger API:
https://www.javacodegeeks.com/2013/10/swagger-make-developers-love-working-with-your-rest-api.html