Rozumiem JSON, ale nie JSONP. Dokument Wikipedii dotyczący JSON jest (był) najwyższym wynikiem wyszukiwania dla JSONP. Mówi to:
JSONP lub „JSON with padding” to rozszerzenie JSON, w którym przedrostek jest określony jako argument wejściowy samego wywołania.
Co? Jakie połączenie? To nie ma dla mnie żadnego sensu. JSON to format danych. Nie ma połączenia.
2-cia wynik wyszukiwania jest z jakimś facetem o imieniu Remy , który pisze ten temat jsonp:
JSONP to wstrzykiwanie tagów skryptowych, przekazujące odpowiedź z serwera do funkcji określonej przez użytkownika.
Rozumiem to, ale nadal nie ma to sensu.
Czym jest JSONP? Dlaczego został stworzony (jaki problem rozwiązuje)? I dlaczego miałbym tego używać?
Dodatek : Właśnie utworzyłem nową stronę dla JSONP na Wikipedii; teraz ma jasny i dokładny opis JSONP, oparty na odpowiedzi Jvenema .
źródło
Odpowiedzi:
To właściwie nie jest zbyt skomplikowane ...
Powiedz, że jesteś w domenie
example.com
i chcesz złożyć wniosek o domenęexample.net
. Aby to zrobić, musisz przekroczyć granice domen , co jest nie-nie w większości obszarów przeglądarki.Jedynym elementem, który omija to ograniczenie, są
<script>
tagi. Kiedy używasz znacznika skryptu, ograniczenie domeny jest ignorowane, ale w normalnych okolicznościach nie można naprawdę nic zrobić z wynikami, skrypt jest po prostu oceniany.Enter
JSONP
. Kiedy wysyłasz zapytanie do serwera z włączoną obsługą JSONP, przekazujesz specjalny parametr, który mówi serwerowi trochę o twojej stronie. W ten sposób serwer jest w stanie ładnie zamknąć swoją odpowiedź w sposób, który może obsłużyć twoja strona.Powiedzmy na przykład, że serwer oczekuje parametru wywołanego w
callback
celu włączenia jego możliwości JSONP. Twoja prośba wyglądałaby następująco:Bez JSONP może to zwrócić jakiś podstawowy obiekt JavaScript, taki jak:
Jednak w przypadku JSONP, gdy serwer odbiera parametr „callback”, podsumowuje wynik nieco inaczej, zwracając coś takiego:
Jak widać, wywoła teraz wybraną metodę. Tak więc na swojej stronie definiujesz funkcję oddzwaniania:
A teraz, gdy skrypt zostanie załadowany, zostanie oceniony i twoja funkcja zostanie wykonana. Voila, żądania między domenami!
Warto również zwrócić uwagę na jeden główny problem z JSONP: tracisz dużą kontrolę nad żądaniem. Na przykład nie ma „miłego” sposobu na odzyskanie odpowiednich kodów błędów. W rezultacie używasz timerów do monitorowania żądania itp., Co zawsze jest nieco podejrzane. Propozycja JSONRequest jest doskonałym rozwiązaniem pozwalającym na wykonywanie skryptów między domenami, utrzymywanie bezpieczeństwa i odpowiednią kontrolę żądania.
Obecnie (2015) CORS jest zalecanym podejściem w porównaniu z JSONRequest. JSONP jest nadal przydatny do obsługi starszych przeglądarek, ale biorąc pod uwagę implikacje bezpieczeństwa, chyba że nie masz wyboru, CORS jest lepszym wyborem.
źródło
JSONP jest naprawdę prostą sztuczką, aby pokonać zasadę tej samej domeny XMLHttpRequest . (Jak wiadomo, nie można wysłać żądania AJAX (XMLHttpRequest) do innej domeny).
Tak więc - zamiast używać XMLHttpRequest, musimy użyć skryptowych znaczników HTML, tych, których zwykle używasz do ładowania plików js, aby js mógł pobrać dane z innej domeny. Brzmi dziwnie?
Chodzi o to - okazuje się, że tagi skryptu mogą być używane w sposób podobny do XMLHttpRequest ! Spójrz na to:
Otrzymasz segment skryptu, który wygląda tak po załadowaniu danych:
Jest to jednak nieco niewygodne, ponieważ musimy pobrać tę tablicę ze znacznika script . Dlatego twórcy JSONP zdecydowali, że będzie to działać lepiej (i tak jest):
Czy zauważyłeś tam funkcję my_callback ? Tak więc - gdy serwer JSONP otrzyma twoje żądanie i znajdzie parametr wywołania zwrotnego - zamiast zwracać zwykłą tablicę js zwróci to:
Zobacz, gdzie jest zysk: teraz otrzymujemy automatyczne oddzwanianie (my_callback), które zostanie uruchomione, gdy otrzymamy dane.
To wszystko, co należy wiedzieć o JSONP : jest to callback i tagi skryptowe.
UWAGA: są to proste przykłady użycia JSONP, nie są to skrypty gotowe do produkcji.
Podstawowy przykład JavaScript (prosty kanał Twittera przy użyciu JSONP)
Podstawowy przykład jQuery (prosty kanał Twittera przy użyciu JSONP)
JSONP oznacza JSON z Padding . (bardzo źle nazwana technika, ponieważ tak naprawdę nie ma nic wspólnego z tym, co większość ludzi uważałaby za „padding”).
źródło
JSONP działa poprzez konstruowanie elementu „script” (albo w znacznikach HTML, albo wstawionego do DOM za pomocą JavaScript), który żąda zdalnej lokalizacji usługi danych. Odpowiedzią jest javascript załadowany do przeglądarki z nazwą wstępnie zdefiniowanej funkcji wraz z przekazywanym parametrem, czyli żądaniem danych JSON. Podczas wykonywania skryptu funkcja jest wywoływana wraz z danymi JSON, umożliwiając stronie żądającej otrzymanie i przetworzenie danych.
Więcej informacji na stronie : https://blogs.sap.com/2013/07/15/secret-behind-jsonp/
fragment kodu po stronie klienta
Część kodu PHP po stronie serwera
źródło
Ponieważ możesz poprosić serwer o dodanie prefiksu do zwróconego obiektu JSON. Na przykład
function_prefix(json_object);
aby przeglądarka
eval
„wstawiała” ciąg JSON jako wyrażenie. Ta sztuczka umożliwia serwerowi „wstrzykiwanie” kodu javascript bezpośrednio w przeglądarce klienta, z pominięciem ograniczeń „tego samego pochodzenia”.Innymi słowy, możesz osiągnąć wymianę danych między domenami .
Zwykle
XMLHttpRequest
nie zezwala na bezpośrednią wymianę danych między domenami (należy przejść przez serwer w tej samej domenie), podczas gdy:<script src="some_other_domain/some_data.js&prefix=function_prefix
> `można uzyskać dostęp do danych z domeny innej niż pochodzenie.Warto również zauważyć: nawet jeśli serwer powinien zostać uznany za „zaufany” przed podjęciem tego rodzaju „sztuczki”, można ograniczyć skutki uboczne ewentualnej zmiany formatu obiektu itp. Jeżeli
function_prefix
do odebrania obiektu JSON zostanie użyta (tj. Właściwa funkcja js), wspomniana funkcja może wykonać kontrole przed zaakceptowaniem / dalszym przetwarzaniem zwróconych danych.źródło
JSONP to świetny sposób na omijanie błędów skryptów między domenami. Możesz korzystać z usługi JSONP wyłącznie z JS bez konieczności implementowania proxy AJAX po stronie serwera.
Możesz skorzystać z usługi b1t.co , aby zobaczyć, jak to działa. Jest to bezpłatna usługa JSONP, która pozwala zminimalizować adresy URL. Oto adres URL do korzystania z usługi:
http://b1t.co/Site/api/External/MakeUrlWithGet?callback=[resultsCallBack]&url=[escapedUrlToMinify]
Na przykład wezwanie: http://b1t.co/Site/api/External/MakeUrlWithGet?callback=whokolwiekJavascriptName&url=google.com
wróciłby
A zatem, gdy ten get zostanie załadowany do twojego js jako src, automatycznie uruchomi dowolną wartość JavascriptName, którą powinieneś zaimplementować jako funkcję wywołania zwrotnego:
Aby faktycznie wykonać wywołanie JSONP, możesz to zrobić na kilka sposobów (w tym za pomocą jQuery), ale oto przykład JS:
Przykład krok po kroku oraz usługa internetowa jsonp, na której można ćwiczyć, jest dostępna pod adresem: ten post
źródło
Prosty przykład użycia JSONP.
client.html
server.php
źródło
Przed zrozumieniem JSONP musisz znać format JSON i XML. Obecnie najczęściej używanym formatem danych w sieci jest XML, ale XML jest bardzo skomplikowany. Utrudnia to użytkownikom przetwarzanie danych osadzonych na stronach internetowych.
Aby JavaScript mógł łatwo wymieniać dane, nawet jako program do przetwarzania danych, używamy sformułowania zgodnego z obiektami JavaScript i opracowaliśmy prosty format wymiany danych, którym jest JSON. JSON może być używany jako dane lub jako program JavaScript.
JSON może być bezpośrednio osadzony w JavaScript, za jego pomocą można bezpośrednio uruchomić określony program JSON, ale z powodu ograniczeń bezpieczeństwa mechanizm piaskownicy przeglądarki wyłącza wykonywanie kodu JSON między domenami.
Aby JSON mógł zostać przekazany po wykonaniu, opracowaliśmy JSONP. JSONP omija ograniczenia bezpieczeństwa przeglądarki dzięki funkcji JavaScript Callback i znacznikowi <script>.
W skrócie wyjaśnia, czym jest JSONP, jaki problem rozwiązuje (kiedy go używać).
źródło
TL; DR
JSONP to stara sztuczka wymyślona w celu ominięcia ograniczenia bezpieczeństwa, które zabrania nam pobierania danych JSON z innego serwera (innego pochodzenia * ).
Sztuczka działa przy użyciu
<script>
znacznika, który prosi o JSON z tego miejsca, np .:{ "user":"Smith" }
ale zawinięty w funkcję, rzeczywisty JSONP („JSON z Paddingiem”):Otrzymanie go w tym formularzu umożliwia nam wykorzystanie danych w ramach naszej
peopleDataJSONP
funkcji. JSONP to zła praktyka , nie używaj jej (czytaj poniżej)Problem
Powiedzmy, że nawigujemy dalej
ourweb.com
i chcemy uzyskać dane JSON (lub dowolne surowe dane)anotherweb.com
. Gdybyśmy byli w użyciu żądania GET (jakXMLHttpRequest
, nafetch
rozmowy$.ajax
, itd.), Nasza przeglądarka powie nam, że nie wolno z tego brzydkiego błędu:Jak zdobyć potrzebne nam dane? Cóż,
<script>
tagi nie podlegają temu ograniczeniu do całego serwera (pochodzenie *)! Właśnie dlatego możemy załadować bibliotekę taką jak jQuery lub Mapy Google z dowolnego serwera, takiego jak CDN, bez żadnych błędów.Ważna uwaga : jeśli się nad tym zastanowić, te biblioteki są rzeczywistym, działającym kodem JS (zwykle jest to ogromna funkcja z całą logiką wewnątrz). Ale surowe dane? Dane JSON nie są kodem . Nie ma co biegać; to tylko zwykłe dane.
Dlatego nie ma sposobu, aby obchodzić się z naszymi cennymi danymi lub nimi manipulować. Przeglądarka pobierze dane wskazane przez nasz
<script>
tag, a podczas przetwarzania słusznie narzeka:Hack JSONP
Stary / hacky sposób na wykorzystanie tych danych? Potrzebujemy tego serwera, aby wysłać go z pewną logiką, więc gdy zostanie załadowany, twój kod w przeglądarce będzie mógł używać tych danych. Więc obcy serwer wysyła nam dane JSON wewnątrz funkcji JS. Same dane są konfigurowane jako dane wejściowe tej funkcji. To wygląda tak:
co sprawia, że kod JS nasza przeglądarka będzie analizować bez narzekań! Dokładnie tak jak w przypadku biblioteki jQuery. Teraz, aby uzyskać to w ten sposób, klient „prosi” o to serwer przyjazny dla JSONP, zwykle tak:
Nasza przeglądarka otrzyma JSONP o tej nazwie funkcji, dlatego potrzebujemy funkcji o tej samej nazwie w naszym kodzie, jak poniżej:
Lub w ten sposób ten sam wynik:
Przeglądarka pobierze JSONP i uruchomi go, który wywołuje naszą funkcję , gdzie argumentem
data
będzie nasz JSON. Możemy teraz robić z naszymi danymi, co tylko chcemy.Nie używaj JSONP, używaj CORS
JSONP to hack między witrynami z kilkoma wadami:
Na wynos nie ma potrzeby korzystania z niego w dzisiejszych czasach .
JSONP jest sztuczką, aby uzyskać dane JSON z innego serwera, ale naruszymy tę samą zasadę bezpieczeństwa (Same-Origin), jeśli będziemy potrzebować innego rodzaju rzeczy między witrynami.
Powinieneś przeczytać o CORS tutaj , ale jego sedno brzmi:
* pochodzenie jest definiowane przez 3 rzeczy: protokół , port i host . Na przykład,
https://web.com
ma inne pochodzenie niżhttp://web.com
(inny protokół) ihttps://web.com:8081
(inny port) i oczywiściehttps://thatotherweb.net
(inny host)źródło
Świetne odpowiedzi zostały już podane, muszę tylko podać swój kawałek w postaci bloków kodu w javascript (dodam również bardziej nowoczesne i lepsze rozwiązanie dla żądań krzyżowych: CORS z nagłówkami HTTP):
JSONP:
1.client_jsonp.js
2.server_jsonp.js
CORS :
3.client_cors.js
4.server_cors.js
źródło
Oto strona z świetnymi przykładami , z wyjaśnieniem od najprostszego zastosowania tej techniki do najbardziej zaawansowanego w JavaScript JavaScript:
w3schools.com / JSONP
Jedną z moich bardziej ulubionych technik opisanych powyżej jest Dynamiczny wynik JSON , który pozwala wysłać JSON do pliku PHP w parametrze URL i pozwolić, aby plik PHP również zwrócił obiekt JSON na podstawie otrzymanych informacji .
Narzędzia takie jak jQuery mają również możliwości korzystania z JSONP :
źródło