XMLHttpRequest — это объект JavaScript, который
используется для обмена данными с сервером. Он позволяет асинхронно
отправлять HTTP-запросы и получать ответы, не перезагружая страницу.
Этот объект был стандартом для обработки HTTP-запросов до появления
более современного Fetch API, однако он по-прежнему широко используется
в различных веб-приложениях.
В PlayCanvas XMLHttpRequest может быть полезен для
загрузки различных ресурсов, таких как текстуры, модели или данные,
необходимые для игрового процесса. Он предоставляет возможность
взаимодействовать с сервером без необходимости перезагружать страницу
или игровое приложение, что является важным аспектом для динамичных и
интерактивных приложений.
XMLHttpRequestopen(method, url, async) — инициализирует запрос с указанным методом (например, GET или POST), URL и параметром асинхронности.
send(data) — отправляет запрос на сервер. Для
метода POST в параметре data передаются данные, которые
должны быть отправлены серверу.
setRequestHeader(name, value) — устанавливает заголовок запроса. Этот метод часто используется для передачи авторизационных данных или для указания типа отправляемых данных.
abort() — отменяет запрос, если он ещё не завершён.
getResponseHeader(name) — получает значение определённого заголовка ответа.
XMLHttpRequest в PlayCanvasvar xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/data.json', true);
xhr.onreadystatecha nge = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
var data = JSON.parse(xhr.responseText);
console.log(data);
}
};
xhr.send();
В данном примере создаётся асинхронный GET-запрос к серверу. После
получения ответа (когда readyState равен 4, а статус
запроса 200), данные из JSON разбираются и выводятся в консоль.
При работе с XMLHttpRequest важно обрабатывать возможные
ошибки. Метод onerror может быть использован для обработки
ошибок, связанных с сетью или сервером.
xhr.oner ror = function() {
console.log("Произошла ошибка при запросе");
};
Fetch API является современным способом работы с
HTTP-запросами в JavaScript. Он предоставляет более удобный и мощный
интерфейс для работы с запросами и ответами, а также лучше поддерживает
промисы, что значительно упрощает асинхронную обработку.
Основное отличие от XMLHttpRequest заключается в том,
что Fetch возвращает промис, который можно использовать для
обработки ответа, что делает код чище и легче для понимания. В
PlayCanvas это также позволяет создавать более гибкие решения для
загрузки ассетов и общения с сервером.
Fetch APIfetch(url, options) — основной метод для отправки HTTP-запросов. Он принимает два параметра: URL и объект с настройками запроса (например, метод, заголовки, тело запроса и др.).
then() — используется для обработки успешных ответов, возвращаемых запросом.
catch() — обрабатывает ошибки, связанные с выполнением запроса.
Fetch API в PlayCanvasfetch('https://example.com/data.json')
.then(response => {
if (!response.ok) {
throw new Error('Сетевая ошибка');
}
return response.json();
})
.then(data => {
console.log(data);
})
.catch(error => {
console.log('Ошибка:', error);
});
В этом примере используется fetch для отправки
GET-запроса. Ответ проверяется на успешность с помощью
response.ok, затем данные преобразуются в формат JSON и
выводятся в консоль.
XMLHttpRequest и Fetch APIFetch API имеет
более современный и удобный синтаксис, основанный на промисах. Это
делает код чище и проще для чтения.XMLHttpRequest
использует события и callback-функции, что может привести к “адскому”
стилю кода при большом количестве вложенных вызовов.
Fetch API основан на промисах, что упрощает обработку
асинхронных операций.Fetch API имеет
встроенную поддержку для обработки различных форматов данных (например,
JSON, текст), в то время как с XMLHttpRequest необходимо
вручную разбирать ответ.Fetch для загрузки ассетов в PlayCanvasДля загрузки различных игровых ассетов (текстур, моделей,
аудиофайлов) с помощью Fetch API в PlayCanvas, можно
использовать следующий подход. Пример загрузки текстуры и её добавление
в сцену:
fetch('https://example.com/texture.jpg')
.then(response => response.blob())
.then(blob => {
var url = URL.createObjectURL(blob);
var texture = new pc.Texture(app.graphicsDevice, {
mipmaps: true
});
texture.setSource(url);
var material = new pc.StandardMaterial();
material.diffuseMap = texture;
material.update();
var entity = new pc.Entity();
entity.addComponent('model', {
type: 'box'
});
entity.model.material = material;
app.root.addChild(entity);
})
.catch(error => {
console.log('Ошибка при загрузке текстуры:', error);
});
Здесь используется метод response.blob(), который
позволяет получить бинарные данные, такие как изображение. Далее
текстура загружается в объект pc.Texture, и используется в
материале модели.
Оба подхода — XMLHttpRequest и Fetch API —
выполняют схожие задачи, но в современных приложениях Fetch
становится предпочтительнее из-за своей простоты и гибкости. В
PlayCanvas использование Fetch API значительно улучшает
код, делая его более читаемым и удобным для работы с асинхронными
запросами.