Czy ktos moze wyjasnic czym jest JSONP w kategoriach laika? [duplikat]

To pytanie ma już odpowiedź tutaj:

Wiem, że JSONP jest JSON z wyściółką.

Rozumiem czym jest JSON i jak go używać z jQuery.getJSON(). Nie rozumiem jednak pojęcia callback przy wprowadzaniu JSONP.

Czy ktoś może mi wyjaśnić, jak to działa?
 391
Author: Darren, 2010-10-01

4 answers

Przedmowa:

Ta odpowiedź ma ponad sześć lat. Chociaż pojęcia i zastosowanie JSONP nie uległy zmianie (tzn. szczegóły odpowiedzi są nadal aktualne), należy patrz, aby używać Kors, gdzie to możliwe (tj. Twój Serwer lub API obsługuje go, a obsługa przeglądarki jest odpowiednia), ponieważ JSONP ma nieodłączne zagrożenia bezpieczeństwa .

JSONP ( JSON with Padding ) jest metodą powszechnie stosowaną do bypass the Zasady między domenami w przeglądarkach internetowych. (Nie możesz składać żądań AJAX na stronę internetową postrzeganą przez przeglądarkę jako znajdującą się na innym serwerze.)

JSON i JSONP zachowują się inaczej na kliencie i serwerze. Żądania JSONP nie są wysyłane przy użyciu XMLHTTPRequest i powiązanych metod przeglądarki. Zamiast tego tworzony jest znacznik <script>, którego źródło jest ustawione na docelowy adres URL. Ten znacznik skryptu jest następnie dodawany do DOM (Zwykle wewnątrz elementu <head>).

JSON Zapytanie:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function () {
  if (xhr.readyState == 4 && xhr.status == 200) {
    // success
  };
};

xhr.open("GET", "somewhere.php", true);
xhr.send();

JSONP Request:

var tag = document.createElement("script");
tag.src = 'somewhere_else.php?callback=foo';

document.getElementsByTagName("head")[0].appendChild(tag);

Różnica między odpowiedzią JSON a odpowiedzią JSONP polega na tym, że obiekt odpowiedzi JSONP jest przekazywany jako argument do funkcji zwrotnej.

JSON:

{ "bar": "baz" }

JSONP:

foo( { "bar": "baz" } );

Dlatego widzisz żądania JSONP zawierające parametr callback, aby serwer znał nazwę funkcji do zawijania odpowiedzi.

Ta funkcja musi istnieć w zasięgu globalnym w momencie znacznik <script> jest oceniany przez przeglądarkę (po zakończeniu żądania).


Inną różnicą, o której należy pamiętać między obsługą odpowiedzi JSON a odpowiedzią JSONP, jest to, że wszelkie błędy parsowania w odpowiedzi JSON mogą zostać przechwycone przez owinięcie próby oceny responseText w instrukcji try/catch. Ze względu na charakter odpowiedzi JSONP, błędy parsowania w odpowiedzi spowodują nieusuwalny błąd parsowania JavaScript.

Obie formaty mogą implementować błędy limitu czasu, ustawiając limit czasu przed zainicjowaniem żądania i wyczyszczając limit czasu w module obsługi odpowiedzi.


Użyteczność jQuery do tworzenia żądań JSONP jest taka, że jQuery cała praca dla Ciebie w tle.

Domyślnie jQuery wymaga dołączenia &callback=? do adresu URL żądania AJAX. jQuery pobierze określoną przez Ciebie funkcję success, przypisze jej unikalną nazwę i opublikuje ją w zasięg globalny. Następnie zamieni znak zapytania ? w &callback=? na przypisaną nazwę.


Porównywalne implementacje JSON / JSONP

Następujący obiekt odpowiedzi { "bar" : "baz" }

JSON:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function () {
  if (xhr.readyState == 4 && xhr.status == 200) {
    document.getElementById("output").innerHTML = eval('(' + this.responseText + ')').bar;
  };
};

xhr.open("GET", "somewhere.php", true);
xhr.send();

JSONP:

function foo(response) {
  document.getElementById("output").innerHTML = response.bar;
};

var tag = document.createElement("script");
tag.src = 'somewhere_else.php?callback=foo';

document.getElementsByTagName("head")[0].appendChild(tag);
 736
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:03

Powiedzmy, że masz jakiś adres URL, który dał ci dane JSON:

{'field': 'value'}

...i miałeś podobny adres URL, z wyjątkiem tego, że używał JSONP, do którego przekazałeś nazwę funkcji zwrotnej " myCallback "( zwykle odbywa się to przez podanie parametru zapytania o nazwie "callback", np. http://example.com/dataSource?callback=myCallback). Wtedy wróci:

myCallback({'field':'value'})

...który nie jest tylko obiektem, ale w rzeczywistości jest kodem, który można wykonać. Jeśli więc zdefiniujesz funkcję myFunction w innym miejscu swojej strony i wykonasz ten skrypt, zostanie ona wywołana z dane z adresu URL.

Najfajniejsze w tym jest to, że możesz utworzyć tag skryptu i użyć swojego adresu URL (wraz z parametrem callback) jako atrybutu src, A przeglądarka go uruchomi. Oznacza to, że możesz obejść zasady bezpieczeństwa " tego samego pochodzenia "( ponieważ przeglądarki umożliwiają uruchamianie znaczników skryptów ze źródeł innych niż domena strony).

To właśnie robi jQuery, gdy składasz żądanie ajax (używając .ajax z' jsonp ' jako wartością właściwości dataType). Np.

$.ajax({
  url: 'http://example.com/datasource',
  dataType: 'jsonp',
  success: function(data) {
    // your code to handle data here
  }
});

Tutaj jQuery zajmuje się nazwą funkcji zwrotnej i parametrem zapytania-czyniąc API identycznym z innymi wywołaniami ajax. Ale w przeciwieństwie do innych typów żądań ajax, jak wspomniano, nie jesteś ograniczony do pobierania danych z tego samego źródła, co strona.

 72
Author: sje397,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-01 14:55:58

JSONP jest sposobem na obejście polityki samego pochodzenia przeglądarki . Jak? Tak:

Tutaj wpisz opis obrazka

Celem tutaj jest złożenie prośby o otherdomain.com i alert nazwę w odpowiedzi. Zwykle wykonujemy żądanie AJAX:

$.get('otherdomain.com', function (response) {
  var name = response.name;
  alert(name);
});

Jednakże, ponieważ żądanie jest wysyłane do innej domeny, nie będzie działać.

Możemy wykonać żądanie używając znacznika <script>. Zarówno <script src="otherdomain.com"></script> jak i $.get('otherdomain.com') spowoduje, że to samo żądanie będzie wykonane:

GET otherdomain.com

P: ale jeśli użyjemy znacznika <script>, Jak możemy uzyskać dostęp do odpowiedzi? Musimy mieć do niego dostęp, jeśli chcemy.

A: nie możemy. ale oto, co możemy zrobić-zdefiniować funkcję, która używa odpowiedzi, a następnie powiedzieć serwerowi, aby odpowiedział za pomocą JavaScript, który wywołuje naszą funkcję z odpowiedzią jako jej argumentem.

P: Ale co jeśli serwer nie zrobi tego za nas i będzie chciał tylko zwrócić nam JSON?

Odp: wtedy nie będziemy / align = "left" / JSONP wymaga do współpracy serwera.

P: używanie znacznika <script> jest brzydkie.

A: biblioteki takie jak jQuery czynią je ładniejszym . Ex:

$.ajax({
    url: "http://otherdomain.com",
    jsonp: "callback",
    dataType: "jsonp",
    success: function( response ) {
        console.log( response );
    }
});

Działa poprzez dynamiczne tworzenie elementu DOM znacznika <script>.

P: <script> znaczniki składają tylko żądania GET - co jeśli chcemy wysłać żądanie POST?

O: wtedy JSONP nie będzie dla nas działać.

P: w porządku, chcę tylko złożyć prośbę o GET. JSONP jest zajebisty i zamierzam użyć to-dzięki!

O: Właściwie, to nie jest takie niesamowite. To tylko włamanie. I to nie jest najbezpieczniejsza rzecz do użycia. Teraz, gdy CORS jest dostępny, powinieneś go używać, gdy tylko to możliwe.

 15
Author: Adam Zerner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:39

Znalazłem przydatny artykuł, który wyjaśnia również temat dość jasno i łatwo. Link to JSONP

Niektóre z wartych uwagi punktów to:

  1. JSONP pre-dates CORS.
  2. Jest to pseudo-standardowy sposób na odzyskanie danych z innej domeny,
  3. posiada ograniczone funkcje CORS (tylko metoda GET)

Działa następująco:

  1. <script src="url?callback=function_name"> jest zawarte w kodzie html
  2. gdy Krok 1 zostanie wykonany, sensuje funkcję z tą samą nazwą funkcji (podaną w parametrze url) jako odpowiedzią.
  3. Jeśli funkcja o podanej nazwie istnieje w kodzie, zostanie wykonana z danymi, jeśli istnieją, zwróconymi jako argument do tej funkcji.
 1
Author: Harshit Garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-05 22:06:11