Czy można wysyłać dane do JsonP? A może wszystkie dane muszą być przekazywane w zapytaniu jako żądanie GET?
Mam dużo danych, które muszę wysłać do usługi, między domenami i są one zbyt duże, aby wysłać je za pośrednictwem zapytania
Jakie są możliwości obejścia tego problemu?
POST
żądania do innych domen, o ile zarówno ta domena, jak i Twoja przeglądarka obsługująCORS
. Ale to całkowicie prawdaPOST
iJSONP
nie są kompatybilne.<script>
tagów wskazujących na inną domenę. Jedynym sposobem wykonania żądań POST w przeglądarce jest użycie formularzy HTML lub XMLHttpRequest.Jeśli potrzebujesz przesłać dużo danych między domenami. Zwykle tworzę usługę, do której możesz zadzwonić w dwóch krokach:
Najpierw klient przesyła FORMULARZ (przesyłanie dozwolone między domenami). Usługa przechowuje dane wejściowe sesji na serwerze (używając identyfikatora GUID jako klucza). (klient tworzy identyfikator GUID i wysyła go jako część danych wejściowych)
Następnie klient wykonuje zwykłe wstrzyknięcie skryptu (JSONP) jako parametr, którego używasz tego samego identyfikatora GUID, który został użyty w poście FORMULARZA. Usługa przetwarza dane wejściowe z sesji i zwraca dane w normalnym trybie JSONP. Po tym sesja jest niszczona.
Zależy to oczywiście od tego, że napiszesz zaplecze serwera.
źródło
XMLHttpRequest
nie powinien być w ogóle zaangażowany. W odpowiedzi Per wykorzystuje zwykłe przesłanie formularza do żądania POST, a następnie wstrzyknięcie elementu skryptu w celu wykonania żądania GET.Wiem, że to poważna nekromancja, ale pomyślałem, że opublikuję moją implementację JSONP POST przy użyciu jQuery, którego z powodzeniem używam do mojego widgetu JS (służy do rejestracji i logowania klienta):
Zasadniczo używam podejścia IFrame, zgodnie z sugestią zawartą w zaakceptowanej odpowiedzi. Inaczej robię po wysłaniu zapytania, obserwuję, czy do formularza można dotrzeć w ramce iframe, używając timera. Gdy formularz nie jest dostępny, oznacza to, że żądanie zostało zwrócone. Następnie używam zwykłego żądania JSONP, aby zapytać o stan operacji.
Mam nadzieję, że komuś się przyda. Przetestowano w> = IE8, Chrome, FireFox i Safari.
źródło
Ogólnie rzecz biorąc, JSONP jest implementowane przez dodanie pliku
<script>
tagu do wywołującego dokumentu, tak że adres URL usługi JSONP to „src”. Przeglądarka pobiera źródło skryptu z transakcją HTTP GET.Teraz, jeśli Twoja usługa JSONP znajduje się w tej samej domenie, co strona wywołująca, prawdopodobnie możesz coś połączyć za pomocą prostego
$.ajax()
połączenia. Jeśli nie znajduje się w tej samej domenie, nie jestem pewien, jak byłoby to możliwe.źródło
CORS
, będzie to możliwe, o ile przeglądarka również ją obsługuje. W takich przypadkach użyjesz zwykłegoJSON
zamiastJSONP
.Przy użyciu tego projektu można użyć serwera proxy CORS . Skierowałoby cały ruch do punktu końcowego w Twojej domenie i przekazałby te informacje do domeny zewnętrznej. Ponieważ przeglądarka rejestruje wszystkie żądania w tej samej domenie, możemy wysyłać JSON. UWAGA: Działa to również z certyfikatami SSL przechowywanymi na serwerze.
źródło
Istnieje (hack) rozwiązanie. Robiłem to wiele razy, będziesz mógł publikować za pomocą JsonP. (Będziesz mógł wysłać formularz, większy niż 2000 znaków, niż możesz użyć przez GET)
Aplikacja kliencka Javascript
JAWA:
PHP:
Robiąc w ten sposób, otwierasz swój serwer na każde żądanie postu, powinieneś ponownie zabezpieczyć to, podając identyfikator lub coś innego.
Dzięki tej metodzie możesz również zmienić typ żądania z jsonp na json, oba działają, po prostu ustaw odpowiedni typ zawartości odpowiedzi
jsonp
json
Proszę nie, że twój serwer nie będzie już przestrzegać SOP (tej samej polityki pochodzenia), ale kogo to obchodzi?
źródło
<script>
tagów do swojego HTML DOM (do diabła, możesz ich nawet używać w aplikacjach komputerowych, powiedzmy, że chcesz wysłać wiele żądań JSON do tego samego serwera i chcesz użyć nazwy funkcji na przykład jako identyfikator śledzenia żądań).Jest to możliwe, oto moje rozwiązanie:
W twoim javascript:
W twoim url.php:
źródło