JSONP (JSON with Padding) — это метод обхода
ограничений политики одного источника (Same-Origin Policy) в браузерах
при работе с AJAX-запросами. Он позволяет получать данные с внешних
доменов, используя стандартные <script>-теги,
поскольку браузеры не запрещают загрузку скриптов с других
источников.
Основная идея JSONP заключается в том, что сервер возвращает данные в виде вызова функции, определённой на клиенте. Вместо обычного JSON:
{"name": "Иван", "age": 30}
сервер возвращает:
callback({"name": "Иван", "age": 30});
Здесь callback — имя функции, которая передаётся
клиентом через URL. Когда <script> загружается,
браузер выполняет этот код, и данные автоматически попадают в
функцию.
jQuery предоставляет удобные методы для работы с JSONP через
$.ajax() и упрощённые функции $.getJSON().
Пример с $.ajax():
$.ajax({
url: "https://example.com/data",
dataType: "jsonp",
jsonp: "callback", // Имя параметра, через который сервер получает имя функции
success: function(data) {
console.log("Данные получены:", data);
},
error: function(xhr, status, error) {
console.error("Ошибка запроса:", status, error);
}
});
Пример с $.getJSON() и JSONP:
$.getJSON("https://example.com/data?callback=?", function(data) {
console.log("Ответ сервера:", data);
});
Особенность конструкции callback=? заключается в том,
что jQuery автоматически генерирует уникальное имя функции и подставляет
его в URL. Сервер должен вернуть вызов именно этой функции.
callback).<script>, поэтому POST-запросы невозможны.Подключение внешнего API погоды:
$.ajax({
url: "https://api.weather.com/v3/wx/conditions/current",
dataType: "jsonp",
data: { apiKey: "ваш_ключ", format: "json" },
success: function(response) {
console.log("Текущая температура:", response.temperature);
}
});
Подгрузка комментариев с другого домена:
$.getJSON("https://comments.example.com/list?postId=123&callback=?", function(comments) {
comments.forEach(function(comment) {
console.log(comment.author + ": " + comment.text);
});
});
JSONP в jQuery — удобный инструмент для работы с кросс-доменными
GET-запросами, особенно при интеграции со старыми API, которые не
поддерживают CORS. Его сила заключается в простоте и возможности
мгновенной загрузки данных через <script>, но при
этом важно соблюдать меры безопасности.