Ответ
JSONP (JSON with Padding) — это старый способ обхода ограничений Same-Origin Policy для кросс-доменных запросов. Вместо прямого AJAX-запроса, JSONP использует тег <script>, который не подпадает под эти ограничения.
Сервер возвращает данные, обернутые в функцию обратного вызова (callback), которая уже определена на клиенте. Например:
function handleResponse(data) {
console.log(data);
}
const script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';
document.body.appendChild(script);
Сервер ответит так:
handleResponse({name: "John", age: 30});
Особенности:
- Работает только с GET-запросами
- Менее безопасен, чем CORS (риск XSS)
- Устарел, рекомендуется использовать CORS
- Зависит от доверия к серверу
Ответ 18+ 🔞
Да ты послушай, что за дичь придумали, чтобы браузер не орал про «разные домены»! JSONP, ёбта, это ж как костыль на костыле, причём с гвоздём в жопе.
Вот представь: ты не можешь просто так, с другого сайта, данные стянуть — браузер тебе сразу «Не-а, мудак, политика одинарного происхождения!». А народ-то хитрожопый, нашёл лазейку! Тег <script> — его же не ебёт, откуда скрипт грузить. Вот на этом и сыграли.
Суть проста, как три рубля: ты на своей странице объявляешь функцию, допустим, mySuperCallback. Потом динамически вставляешь скрипт, который грузится с чужого сервака, и в URL передаёшь имя этой функции, типа ?callback=mySuperCallback. А сервер, этот хитрый уёбок, вместо чистого JSON'а тебе возвращает вызов этой самой функции, да ещё и с данными внутрь запихнутыми!
function handleResponse(data) {
console.log(data);
}
const script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';
document.body.appendChild(script);
И в ответ тебе прилетает не {"name":"John"}, а прямо:
handleResponse({name: "John", age: 30});
Твой браузер это выполняет, и твоя функция срабатывает с готовыми данными! Вообще пиздец, какая извращённая логика.
Но, ясное дело, минусов — овердохуища:
- Только GET-запросы, никаких POST'ов. Хочешь отправить что-то серьёзное? Иди на хуй, извини.
- Безопасность — ниже плинтуса. Если тот сервер окажется мудаком и в callback'е пришлёт какой-нибудь вредоносный код — всё, твои пользователи в полной жопе, XSS обеспечен.
- Он просто устарел, как мои надежды на светлое будущее. Сейчас все нормальные люди используют CORS, это встроенный, контролируемый механизм.
- И да, тут надо слепо доверять удалённой стороне. Доверия, блядь, ноль, а ты вынужден.
В общем, JSONP — это как ехать на работу на старой «Оке»: вроде едет, но стыдно, небезопасно, и все вокруг смотрят как на дауна. Используй CORS и не выёбывайся.