Czy ktos moze wyjasnic czym jest JSONP w kategoriach laika? [duplikat]
To pytanie ma już odpowiedź tutaj:
- na czym polega JSONP? 7 odpowiedzi
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.
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);
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.
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:
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.
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:
- JSONP pre-dates CORS. Jest to pseudo-standardowy sposób na odzyskanie danych z innej domeny,
- posiada ograniczone funkcje CORS (tylko metoda GET)
Działa następująco:
-
<script src="url?callback=function_name">
jest zawarte w kodzie html - gdy Krok 1 zostanie wykonany, sensuje funkcję z tą samą nazwą funkcji (podaną w parametrze url) jako odpowiedzią.
- Jeśli funkcja o podanej nazwie istnieje w kodzie, zostanie wykonana z danymi, jeśli istnieją, zwróconymi jako argument do tej funkcji.
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