Есть форма с двумя текстовыми полями — "Заголовок" и "Описание" — и полем прикрепления файла.
Мне нужно отправить эту форму POST-запросом, предварительно преобразовав в JSON.
Вопрос: как?
Большая часть примеров, которые я находил, описывают, либо как отправить отдельно текст, либо — отдельно файл.
Запросы обрабатывает RestController Spring:
@PostMapping("/my/bookunits")
public ResponseEntity<ApiResponse> createBookUnit(@CurrentUser UserPrincipal currentUser,
@Valid @ModelAttribute BookUnitRequest bookUnitRequest) {
User user = userService.loadUserById(currentUser.getId());
bookUnitService.createBookUnit(user, bookUnitRequest);
return new ResponseEntity<>(new ApiResponse(Boolean.TRUE, "processing"), HttpStatus.ACCEPTED);
}
@Data
public class BookUnitRequest {
@NotBlank
private String title;
@NotBlank
private String description;
private MultipartFile bookFile;
}
Я так понял, что у всего содержимого формы Content-type должен быть multipart/form-data, верно?
В Poster пробовал через тип данных form-data в Body, всё принималось.
Можно ли в JSON? Если нет, подскажите, как поправить запрос:
$("#newBookUnitForm").submit(function (e) {
let authToken = localStorage.getItem("accessToken");
let url = "http://localhost:8080/api/my/bookunits";
console.log("Попытка загрузить новую книгу на: " + url);
let newBookUnitRequest = {
"title": document.getElementById("newBookUnitTitle").value,
"description": document.getElementById("newBookUnitDescription").value,
"bookfile": document.getElementById("newBookUnitFile").value
}
let newBookUnitRequestJson = JSON.stringify(newBookUnitRequest);
let xhr = new XMLHttpRequest();
xhr.open('POST', url, true)
xhr.setRequestHeader("Content-type", "application/json; charset=utf-8");
xhr.setRequestHeader("Authorization", authToken);
xhr.onload = function () {
if (xhr.readyState === 4) {
switch (xhr.status) {
case 202:
let resp = JSON.parse(xhr.responseText);
console.log("Файл принят. Ответ сервера: " + resp.message);
break;
case 401:
console.log("Код ответа 401. Ошибка авторизации.");
break;
default:
console.log("Код ответа: " + xhr.status + ", ответ сервера: " + xhr.responseText);
}
}
}
xhr.send(newBookUnitRequestJson);
e.preventDefault();
})