Статус HTTP 415 - объект запроса находится в формате, не поддерживаемом
Я работаю над веб-сервисом java restful. Я получил его для запроса GET, но запрос POST не работает. Класс My Controller 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.
Я использую Расширение Postman для отправки запроса 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;
}
}
Ответы
Ответ 1
Готов поспорить, что звонок из Postman не включает Content-Type: application/json
.
HTTP 415 означает, что сервер не понимает формат носителя запроса. В контроллере вы указываете, что он принимает JSON, но вы не сказали, если запрос указал, что тело находится в этом формате. Просто потому, что вы помещаете данные в формат JSON, не означает, что сервер будет распознавать его, вы должны указать его в заголовке Content-Type
.
Ответ 2
Spring предоставляет множество стандартных HttpMessageConverters по умолчанию, которые будут использоваться для преобразования, в зависимости от наличия определенной библиотеки в пути к классам проекта.
Например, если заголовок Content-Type в заголовке запроса был одним из приложений /json или application/xml, это означает, что тело POST содержит json или XML [популярные форматы], и если библиотека Jackson находится в вашем пути к классам, Spring передаст преобразование в MappingJackson2HttpMessageConverter [для json] или MappingJackson2XmlHttpMessageConverter [для xml].
Чтобы объявить зависимость от библиотеки Jackson (jackson-databind), укажите следующую зависимость в вашем pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
Ответ 3
У меня тоже была такая же проблема. Добавьте заголовок ContentType в приложение /xml (или любой другой сервис ur) для почтальона.
Ответ 4
Мне немного стыдно писать это, но я забыл поместить атрибут 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>
Это довольно хромая ошибка, но также и то, что потребовалось некоторое время для понимания.