it-roy-ru.com

HTTP Status 415 - объект запроса в формате не поддерживается

Я работаю над Java отдыхающим веб-сервисом. Я получил его на запрос GET, но запрос POST не работает. Мой класс контроллера - RestController. Я сделал это до сих пор:

@RequestMapping(value = "/api/signup", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public long signUp(@ModelAttribute ApiMemberModel apiMember) {
    memberService = new MemberDetailsService();
    Member m = memberService.createMember(apiMember.getUsername(), apiMember.getPassword(), apiMember.getEmail(), "");
    return m.getId();
}

Также попробовал RequestBody вместо ModelAttribute.

Я использую расширение Почтальона для отправки POST запроса. Например:

{
    "username": "asd",
    "password": "sfsdg",
    "email": "[email protected]"
}

Но я получаю ошибку:

description The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.

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

 public class ApiMemberModel {
    private String username;
    private String password;
    private String email;

    public ApiMemberModel(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
17
nope

Могу поспорить, что звонок от Почтальона не включает Content-Type: application/json.

HTTP 415 означает, что сервер не понимает медиа-формат запроса. В вашем контроллере вы указываете, что он принимает JSON, но вы не сказали, указывал ли запрос, что тело имеет этот формат. То, что вы помещаете данные в формате JSON, не означает, что сервер их распознает, вы должны указать это в заголовке Content-Type.

40
vtortola

Spring предоставляет множество стандартных HttpMessageConverters, которые будут использоваться для преобразования в зависимости от наличия определенной библиотеки в пути к классам проекта.

Например, если заголовок Content-Type в запросе был один из application/json или application/xml, это означает, что тело POST содержит json или XML [популярные форматы], и если библиотека Джексона найдена в вашем пути к классам, Spring делегирует преобразование в MappingJackson2HttpMessageConverter [для json] или MappingJackson2XmlHttpMessageConverter [для xml].

Чтобы объявить зависимость от библиотеки Джексона (jackson-databind), включите следующую зависимость в ваш файл pom.xml.

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>
3
Pradeep

У меня тоже была такая же проблема. Добавьте заголовок Content Type к application/xml (или к тому, что ожидает ваш сервис) к почтальону.

0
ABHIJITH GM

добавьте строку «на основе аннотаций» в ваш XML-файл или добавьте тип контента как application/json 

0
BHARATHWAJ

Мне немного стыдно писать это, но я забыл поместить атрибут enctype="multipart/form-data" в тег формы:

<form action="rest/upload_function_path" method="post" enctype="multipart/form-data">
<!-- this thing right  --------------------------------^ there! -->
    <p>
    Your file is: <input type="file" name="fajl" />
    </p>
    <input type="submit" value="Upload It" />
</form>

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

0
Casper