Чтобы отправить данные на сервер из кода JavaScript в ajax-запросе, в метод send() объекта XMLHttpRequest передаются отправляемые данные.
Для тестирования отправки, как и в прошлых статьях, в качестве сервера будем использовать Node.js, как самой простой вариант. Итак, создадим файл app.js и определим в нем следующий код сервера, который принимает данные:
const http = require("http"); const fs = require("fs"); http.createServer(async (request, response) => { if(request.url == "/user"){ let userName= ""; // получаем данные в строку // получаем данные из запроса и добавляем их в строку for await (const chunk of request) { userName += chunk; } userName = userName + " Smith"; response.end(userName); } else{ fs.readFile("index.html", (_, data) => response.end(data)); } }).listen(3000, ()=>console.log("Сервер запущен по адресу http://localhost:3000"));
В данном случае при обращении по адресу "/user" сервер получает все отправленные данные:
if(request.url == "/user"){
Мы можем перебрать объект запроса и таким образом извлечеть из него полученные данные:
let userName= ""; // получаем данные в строку // получаем данные из запроса и добавляем их в строку for await (const chunk of request) { userName += chunk; }
В данном случае отправленные данные в виде объектов chunk добавляются в строку userName
.
В данном случае мы предполагаем, что на сервер отправляется простая строка с текстом, соответственно каждый кучек данных chunk будет представлять строку.
Также здесь предположим, что клиент отправляет на сервер некоторое имя пользователя. И для примера к этому имени добавляется фамилия и измененное имя отправляется обратно клиенту:
userName = userName + " Smith"; response.end(userName);
Теперь определим на странице index.html код для отправки данных на этот сервер:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>METANIT.COM</title> </head> <body> <script> // данные для отправки const user = "Tom"; const xhr = new XMLHttpRequest(); // обработчик получения ответа сервера xhr.onload = () => { if (xhr.status == 200) { console.log(xhr.responseText); } else { console.log("Server response: ", xhr.statusText); } }; // POST-запрос к ресурсу /user xhr.open("POST", "/user"); xhr.send(user); // отправляем значение user в методе send </script> </body> </html>
Для отправки применяется метод POST. А в качестве отправляемых данных выступает простая строка "Tom". То есть на сервер отправляется простой текст.
И поскольку сервер в ответ также отправляет текст, то для получения ответа здесь применяется свойство xhr.responseText
.
И при запуске данной веб-страницы будет выполняться отправка данных на сервер, и в консоли браузера можно будет увидеть полученный от сервера ответ:
Подобным образом можно отправлять более сложные по структуре данные. Например, рассмотрим отправку json. Для этого на строне node.js определим следующий сервер:
const http = require("http"); const fs = require("fs"); http.createServer(async (request, response) => { if(request.url == "/user"){ // получаем строковое представление ответа let data=""; for await (const chunk of request) { data += chunk; } // мы ожидаем данные типа {"name":"value","age":1234} const user = JSON.parse(data); // парсим строку в json // для теста изменяем данные полученного объекта user.name = user.name + " Smith"; user.age += 1; // отправляем измененый объект обратно клиенту response.end(JSON.stringify(user)); } else{ fs.readFile("index.html", (_, data) => response.end(data)); } }).listen(3000, ()=>console.log("Сервер запущен по адресу http://localhost:3000"));
В данном случае на сервера ожидаем, что мы получим объект в формате json, который имеет два свойства - name и age. Для примера сервер меняет значения этих свойств и отправляет измененный объект обратно клиенту.
На веб-странице установим объект json для отправки и получим обратно данные:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>METANIT.COM</title> </head> <body> <script> // данные для отправки const tom = { name: "Tom", age: 37 }; // кодируем объект в формат json const data = JSON.stringify(tom); const xhr = new XMLHttpRequest(); xhr.onload = () => { if (xhr.status == 200) { const user = JSON.parse(xhr.responseText) console.log(user.name, "-", user.age); } else { console.log("Server response: ", xhr.statusText); } }; xhr.open("POST", "/user"); xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data); </script> </body> </html>
Здесь на сервер отправляется объект tom, который имеет два свойства: name и age. Перед отправкой он кодируется в формат json с помощью функции
JSON.stringify()
.
const data = JSON.stringify(tom);
При отправке с помощью метода setRequestHeader() для заголовка "Content-Type" устанавливаем значение "application/json", тем самым указывая, что мы отправляем данные в формате json:
xhr.setRequestHeader("Content-Type", "application/json");
В обработчике события load сначала парсим текст ответа из формата json в стандартный объект JavaScript:
const user = JSON.parse(xhr.responseText)
Затем выводим данные полученного объекта на консоль браузера: