Co je JSONP a proč byl vytvořen?

Rozumím JSON, ale ne JSONP. Dokument Wikipedie o JSON je (byl) nejlepším výsledkem vyhledávání pro JSONP. Píše se toto:

JSONP nebo „JSON with padding“ je rozšíření JSON, kde je předpona specifikována jako vstupní argument samotného volání.

co? Jaký hovor? To mi nedává smysl. JSON je datový formát. Není žádný hovor.

2. výsledek hledání je od nějakého chlapíka jménem Remy, který píše toto o JSONP:

JSONP je vkládání značek skriptu, které předává odpověď ze serveru do uživatelem zadané funkce.

Docela to chápu, ale pořád to nedává smysl.

Co je tedy JSONP? Proč byl vytvořen (jaký problém řeší)? A proč bych to používal?

Dodatek :Právě jsem vytvořil novou stránku pro JSONP na Wikipedii; nyní má jasný a důkladný popis JSONP na základě odpovědi jvenema.

Odpověď

Ve skutečnosti to není příliš složité…

Řekněme, že jste v doméně example.com a chcete odeslat požadavek na doménu example.net . Chcete-li tak učinit, musíte přejít mezi doménami hranice, ne-ne ve většině prohlížeče.

Jediná položka, která toto omezení obchází, je <script> značky. Když použijete značku skriptu, omezení domény je ignorováno, ale za normálních okolností to opravdu nemůžete cokoliv s výsledky, skript se prostě vyhodnotí.

Zadejte JSONP . Když odešlete požadavek na server s povoleným JSONP, předáte speciální parametr, který serveru řekne něco málo o vaší stránce. Tímto způsobem je server schopen pěkně zabalit svou odpověď způsobem, který vaše stránka zvládne.

Řekněme například, že server očekává parametr nazvaný callback k aktivaci jeho schopností JSONP. Pak by váš požadavek vypadal takto:

http://www.example.net/sample.aspx?callback=mycallback

Bez JSONP by to mohlo vrátit nějaký základní objekt JavaScriptu, například:

{ foo: 'bar' }

U JSONP však, když server obdrží parametr „callback“, zabalí výsledek trochu jinak a vrátí něco takového:

mycallback({ foo: 'bar' });

Jak můžete vidět, nyní vyvolá vámi zadanou metodu. Takže na své stránce definujete funkci zpětného volání:

mycallback = function(data){
  alert(data.foo);
};

A nyní, když je skript načten, bude vyhodnocen a vaše funkce bude provedena. Voila, požadavky napříč doménami!

Za zmínku také stojí jeden hlavní problém s JSONP:ztrácíte velkou kontrolu nad požadavkem. Například neexistuje žádný „hezký“ způsob, jak získat zpět správné kódy selhání. Výsledkem je, že ke sledování požadavku atd. používáte časovače, což je vždy trochu podezřelé. Návrh JSONRequest je skvělým řešením pro umožnění skriptování napříč doménami, zachování zabezpečení a umožnění řádné kontroly požadavku.

V současné době (2015) je CORS doporučeným přístupem vs. JSONRequest. JSONP je stále užitečný pro podporu starších prohlížečů, ale vzhledem k bezpečnostním důsledkům, pokud nemáte na výběr, je lepší volbou CORS.