Polymer предоставляет гибкие инструменты для взаимодействия с
удалёнными ресурсами через HTTP. Основным способом обмена данными
является использование элементов <iron-ajax> и
JavaScript-функций для выполнения запросов методом
fetch.
<iron-ajax><iron-ajax> — это встроенный веб-компонент,
предназначенный для удобного выполнения AJAX-запросов и автоматического
связывания данных с элементами Polymer. Он позволяет конфигурировать
URL, HTTP-метод, заголовки и параметры запроса через атрибуты.
Пример базового использования:
<iron-ajax
id="request"
url="https://api.example.com/data"
method="GET"
handle-as="json"
on-response="handleResponse"
on-error="handleError">
</iron-ajax>
Ключевые атрибуты:
url — адрес, к которому будет выполнен запрос.method — HTTP-метод (GET, POST, PUT, DELETE).handle-as — формат обрабатываемого ответа
(json, text, xml,
document).params — объект с параметрами запроса, автоматически
сериализуемыми в URL для GET или в тело для POST.headers — объект с HTTP-заголовками.Методы управления запросами:
generateRequest() — инициирует выполнение запроса
вручную.lastRequest — возвращает объект последнего запроса с
информацией о состоянии.lastResponse — хранит данные последнего успешного
ответа.lastError — содержит данные последней ошибки
запроса.Пример обработки ответа:
handleResponse(event) {
const data = event.detail.response;
console.log('Полученные данные:', data);
}
handleError(event) {
console.error('Ошибка запроса:', event.detail.error);
}
Параметры запроса можно задавать через объект params,
который может быть привязан к свойствам элемента:
<iron-ajax
id="ajax"
url="https://api.example.com/users"
method="GET"
params='{"page": 1, "limit": 20}'
handle-as="json"
last-response="{{users}}">
</iron-ajax>
Изменение параметров в коде автоматически обновляет данные при
повторном вызове generateRequest():
this.$.ajax.params = { page: 2, limit: 20 };
this.$.ajax.generateRequest();
Помимо <iron-ajax>, можно применять стандартный
fetch для более гибкого управления запросами, особенно при
необходимости обрабатывать сложные схемы аутентификации или прокси.
Пример GET-запроса:
fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) {
throw new Error('Ошибка HTTP: ' + response.status);
}
return response.json();
})
.then(data => {
this.data = data;
})
.catch(error => {
console.error('Ошибка запроса:', error);
});
POST-запрос с отправкой JSON:
fetch('https://api.example.com/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name: 'Polymer', version: 3 })
})
.then(response => response.json())
.then(result => console.log('Ответ сервера:', result))
.catch(error => console.error('Ошибка POST-запроса:', error));
Polymer обеспечивает реактивное обновление интерфейса при изменении
данных, полученных через AJAX. Свойство, связанное с
last-response или объектом, возвращаемым
fetch, автоматически обновляет элементы интерфейса, если
оно привязано через [[property]] или
{{property}}.
Пример использования данных для списка пользователей:
<template is="dom-repeat" items="[[users]]">
<div>[[item.name]] ([[item.email]])</div>
</template>
Обновление свойства users после AJAX-запроса
автоматически приведет к повторной отрисовке списка.
Элемент <iron-ajax> предоставляет возможность
отслеживать состояние загрузки через атрибуты loading и
события:
loading-changed — событие изменения состояния
загрузки.loading — булевое свойство, указывающее, выполняется ли
запрос в данный момент.Пример отображения индикатора загрузки:
<iron-ajax
id="ajax"
url="https://api.example.com/data"
handle-as="json"
last-response="{{data}}"
loading="{{isLoading}}">
</iron-ajax>
<template is="dom-if" if="[[isLoading]]">
<div>Загрузка данных...</div>
</template>
Ошибки могут возникать на уровне HTTP (4xx, 5xx) или сетевом уровне.
<iron-ajax> передает ошибки через событие
on-error, а fetch требует обработки через блок
catch. Для удобства можно создавать обёртки, объединяющие
повторные попытки запроса, логирование и уведомления пользователей.
При работе с внешними API следует учитывать политику CORS.
<iron-ajax> и fetch поддерживают
установку заголовков Authorization,
Content-Type и других, но сервер должен разрешать
кросс-доменные запросы. Для сложных сценариев можно использовать
прокси-серверы или JSONP (устаревающий метод) для обхода
ограничений.
<iron-ajax> удобен для декларативного связывания
данных и отслеживания состояния запроса.fetch обеспечивает больше контроля и гибкость для
сложных сценариев.Эти инструменты образуют ядро взаимодействия Polymer-компонентов с удалёнными HTTP-ресурсами, обеспечивая надёжную и удобную архитектуру клиентских приложений.