Co to jest JSONP?
Ważną rzeczą do zapamiętania w przypadku jsonp jest to, że w rzeczywistości nie jest to protokół ani typ danych. Jest to po prostu sposób na załadowanie skryptu w locie i przetworzenie skryptu wprowadzanego na stronę. W duchu JSONP oznacza to wprowadzenie nowego obiektu javascript z serwera do aplikacji / skryptu klienta.
Kiedy potrzebny jest JSONP?
Jest to jedna z metod umożliwiania jednej domenie asynchronicznego dostępu do danych z innej domeny / przetwarzania ich na tej samej stronie. Przede wszystkim służy do przesłonięcia ograniczeń CORS (Cross Origin Resource Sharing), które wystąpiłyby w przypadku żądania XHR (ajax). Ładowanie skryptów nie podlega ograniczeniom CORS.
Jak to jest zrobione
Wprowadzenie nowego obiektu javascript z serwera można zaimplementować na wiele sposobów, ale najczęstszą praktyką jest zaimplementowanie przez serwer funkcji „callback” z przekazaniem do niej wymaganego obiektu. Funkcja zwrotna to po prostu funkcja, którą już skonfigurowałeś na kliencie, którą ładowany skrypt wywołuje w momencie ładowania skryptu w celu przetworzenia przekazanych do niego danych.
Przykład:
Mam aplikację, która rejestruje wszystkie pozycje w czyimś domu. Moja aplikacja jest skonfigurowana i chcę teraz pobrać wszystkie przedmioty w głównej sypialni.
Moja aplikacja jest włączona app.home.com
. Interfejs API, z którego chcę załadować dane, jest włączony api.home.com
.
O ile serwer nie jest wyraźnie skonfigurowany, aby na to zezwolić, nie mogę użyć Ajax do ładowania tych danych, ponieważ nawet strony w oddzielnych subdomenach podlegają ograniczeniom XHR CORS.
W idealnym przypadku skonfiguruj rzeczy tak, aby umożliwić XHR
W idealnym przypadku, ponieważ interfejs API i aplikacja znajdują się w tej samej domenie, mógłbym mieć dostęp do skonfigurowania nagłówków api.home.com
. Jeśli tak, mogę dodać element Access-Control-Allow-Origin:
nagłówka zapewniający dostęp do app.home.com
. Zakładając, że nagłówek jest skonfigurowany w następujący sposób: Access-Control-Allow-Origin: "http://app.home.com"
jest to znacznie bezpieczniejsze niż konfiguracja JSONP. Dzieje się tak, ponieważ app.home.com
może uzyskać wszystko, czego chce, api.home.com
bez api.home.com
zapewniania CORS dostępu do całego Internetu.
Powyższe rozwiązanie XHR nie jest możliwe. Skonfiguruj JSONP Na moim skrypcie klienta: Ustawiłem funkcję przetwarzania odpowiedzi z serwera, gdy wykonuję wywołanie JSONP. :
function processJSONPResponse(data) {
var dataFromServer = data;
}
Serwer będzie musiał być tak skonfigurowany, aby zwracał mini skrypt wyglądający jakoś. "processJSONPResponse('{"room":"main bedroom","items":["bed","chest of drawers"]}');"
Może być przeznaczony do zwracania takiego ciągu, jeśli //api.home.com?getdata=room&room=main_bedroom
zostanie wywołane coś podobnego .
Następnie klient konfiguruje tag skryptu jako taki:
var script = document.createElement('script');
script.src = '//api.home.com?getdata=room&room=main_bedroom';
document.querySelector('head').appendChild(script);
To ładuje skrypt i natychmiast wywołuje window.processJSONPResponse()
jako napisane / echo / wydrukowane przez serwer. Dane przekazane jako parametr do funkcji są teraz przechowywane w dataFromServer
zmiennej lokalnej i możesz z nimi zrobić, co chcesz.
Sprzątać
Gdy klient ma już dane tj. natychmiast po dodaniu skryptu do DOM, element skryptu można usunąć z DOM:
script.parentNode.removeChild(script);