Форма POST с использованием Javascript

Я разрабатываю простую веб-страницу, используя bootstrap/javascript в качестве интерфейса, и я пытаюсь отправить HTTP POST для доступа к моему серверу (я использовал Spring в качестве сервера), но я получаю 400 Bad Request.

У меня есть следующий скрипт и HTML, и я пытаюсь передать идентификатор формы для функции ниже для выполнения HTTP POST.

// скрипт на теге функция sendData(данные) {

      alert('Data' + data);
      var XHR = new XMLHttpRequest();
      var urlEncodedData = "";
      var urlEncodedDataPairs = [];
      var name;

      // Turn the data object into an array of URL-encoded key/value pairs.
      for(name in data) {
        urlEncodedDataPairs.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
      }

      // Combine the pairs into a single string and replace all %-encoded spaces to 
      // the '+' character; matches the behaviour of browser form submissions.
      urlEncodedData = urlEncodedDataPairs.join('&').replace(/%20/g, '+');

      // Define what happens on successful data submission
      XHR.addEventListener('load', function(event) {
        event.preventDefault();
        alert('Yeah! Data sent and response loaded.');
      });

      // Define what happens in case of error
      XHR.addEventListener('error', function(event) {
        alert('Oops! Something goes wrong.');
      });

      // Set up our request
      XHR.open('POST', 'http://localhost:8080/api/novoCondomino');

      // Add the required HTTP header for form data POST requests
      XHR.setRequestHeader('Content-Type', 'application/json');

      // Finally, send our data.
      alert('urlEncodedData' + urlEncodedData);
      XHR.send(urlEncodedData);
    }

    </script>

// HTML-код формы

<FORM NAME = "myform" id = "inputform" onSubmit = "JavaScript:sendData(inputform)">
     <div class = "form-row">

    <div class = "form-group col-md-12">
        <label for = "inputAddress">Nome</label>
        <input type = "text" class = "form-control" id = "condomino" placeholder = "Nome">
    </div>
  </div>
  <div class = "form-group">
    <label for = "inputAddress2">Apartamento</label>
    <input type = "text" class = "form-control" id = "apto" placeholder = "Apto">

  </div>
  <div class = "form-group">
      <label for = "inputPassword4">Senha</label>
      <input type = "password" class = "form-control" id = "password" placeholder = "Password">
  </div>
  <div class = "form-row">
  </div>
  <div class = "form-group">
    <div class = "form-check">
      <input class = "form-check-input" type = "checkbox" id = "gridCheck">
      <label class = "form-check-label" for = "gridCheck">
        Check me out
      </label>
    </div>
  </div>
  <input type = "submit" value = "Send "class = "btn btn-primary">Sign in</button>
</form>

Когда я нажимаю кнопку, чтобы отправить форму, я получаю 400 Bad Request Error. Я знаю, что это неправильно, потому что кажется, что я отправляю HTMLDocumentElement в качестве полезной нагрузки вместо объекта JSON. Я нашел некоторые решения без Javascript, но оказалось, что мой бэкэнд не будет принимать application/x-www-form-urlencoded, поэтому я хочу установить тип контента в application/json. POST отлично работает при использовании POSTMAN при передаче объекта JSON в качестве данных.

Как я могу исправить свой код с помощью решения Javascript для отправки данных из формы точно так, как ожидает мой бэкэнд (некоторый класс DTO, как показано ниже)

// класс DTO, ожидаемый серверной частью открытый класс UserCommand {

    public UserCommand() {

    }

    private int apartament;
    private String name;
    private String password;

//Контроллер на стороне сервера

@ResponseBody
@PostMapping(value = "/novoCondomino"
)
public User createUser(@RequestBody UserCommand newUser)
    {

    return usrService.createUser(newUser.toUser());
}

Заранее спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда ты сказал

POST works fine when using POSTMAN

Вы имеете в виду, что используете тело JSON в Postman и что оно работает?

Если это так, решением будет убедиться, что вы используете правильно отформатированный JSON при вызове XHR.send().

Зарегистрируйте, что вы передаете XHR.send(), и отправьте его с помощью Postman, если вы получите там 400, вы будете знать наверняка. Если я что-то неправильно понял, дайте мне знать.

Да, вы правильно поняли. Я думаю, что передаю неверные данные из формы... Я зарегистрировал то, что я передаю в XHR.send, и это будет 0=%5Bobject+HTMLInputElement%5D&1=%5Bobject+HTMLInputElement‌%5D&2=%5Bobject+HTML‌​ InputElement%5D&3=%5‌​Bobject+HTMLInputEle‌ment%5D&4=%5Bobject+‌​HTMLInputElement%5D&‌​acceptCharset=&actio‌​n=http.... Я удалил некоторую строку, так как это явно неверный HTML-код. Я не знаю, как передать объект json из формы

André Ramos 06.04.2019 23:20

@AndréRamos Просто создайте объект JavaScript (например: body = { name: "andré" }) и передайте его XHR.send(body).

Hacène 06.04.2019 23:36

Спасибо @Hacène. Я мог бы подготовить запрос, используя getElementById для получения данных каждого поля, а затем передать объект JS, как вы сказали. var nome=document.getElementById("condomino").value; var apto=document.getElementById("apto").value; var password=document.getElementById("пароль").value; body = {"nome": nome, "apto": parseInt(apto), "password": password }; XHR.send(JSON.stringify(тело)); Отмечен как принятый ответ. Спасибо.

André Ramos 14.04.2019 23:21

Другие вопросы по теме