Saya mengerti JSON, tetapi bukan JSONP. Dokumen Wikipedia tentang JSON adalah hasil pencarian teratas untuk JSONP. Dikatakan ini:
JSONP atau "JSON with padding" adalah ekstensi JSON di mana awalan ditentukan sebagai argumen input dari panggilan itu sendiri.
Hah? Panggilan apa? Itu tidak masuk akal bagi saya. JSON adalah format data. Tidak ada panggilan.
Hasil pencarian kedua berasal dari beberapa pria bernama Remy , yang menulis ini tentang JSONP:
JSONP adalah injeksi tag skrip, meneruskan respons dari server ke fungsi yang ditentukan pengguna.
Saya bisa memahaminya, tetapi itu masih tidak masuk akal.
Jadi, apa itu JSONP? Mengapa itu dibuat (masalah apa yang dipecahkannya)? Dan mengapa saya menggunakannya?
Tambahan : Saya baru saja membuat halaman baru untuk JSONP di Wikipedia; sekarang memiliki deskripsi yang jelas dan menyeluruh tentang JSONP, berdasarkan jawaban jvenema .
sumber
Jawaban:
Ini sebenarnya tidak terlalu rumit ...
Katakan Anda menggunakan domain
example.com
, dan Anda ingin membuat permintaan ke domainexample.net
. Untuk melakukannya, Anda harus melewati batas domain , yang boleh-boleh saja di sebagian besar browserland.Satu item yang melewati batasan ini adalah
<script>
tag. Saat Anda menggunakan tag skrip, batasan domain diabaikan, tetapi dalam kondisi normal, Anda tidak dapat melakukan apa pun dengan hasilnya, skrip akan dievaluasi.Masukkan
JSONP
. Saat Anda mengajukan permintaan ke server yang mengaktifkan JSONP, Anda memberikan parameter khusus yang memberi tahu server sedikit tentang halaman Anda. Dengan begitu, server dapat menyelesaikan responsnya dengan cara yang dapat ditangani oleh halaman Anda.Sebagai contoh, katakanlah server mengharapkan parameter yang dipanggil
callback
untuk mengaktifkan kemampuan JSONP-nya. Maka permintaan Anda akan terlihat seperti:Tanpa JSONP, ini mungkin mengembalikan beberapa objek JavaScript dasar, seperti:
Namun, dengan JSONP, ketika server menerima parameter "callback", itu membungkus hasilnya sedikit berbeda, mengembalikan sesuatu seperti ini:
Seperti yang Anda lihat, itu sekarang akan memanggil metode yang Anda tentukan. Jadi, di halaman Anda, Anda menentukan fungsi panggilan balik:
Dan sekarang, ketika skrip dimuat, itu akan dievaluasi, dan fungsi Anda akan dieksekusi. Voila, permintaan lintas domain!
Penting juga mencatat satu masalah utama dengan JSONP: Anda kehilangan banyak kendali atas permintaan. Misalnya, tidak ada cara "baik" untuk mendapatkan kode kegagalan yang benar kembali. Akibatnya, Anda akhirnya menggunakan penghitung waktu untuk memantau permintaan, dll, yang selalu sedikit mencurigakan. Proposisi untuk JSONRequest adalah solusi yang bagus untuk memungkinkan skrip lintas domain, menjaga keamanan, dan memungkinkan kontrol permintaan yang tepat.
Saat ini (2015), CORS adalah pendekatan yang disarankan vs. JSONRequest. JSONP masih berguna untuk dukungan browser yang lebih lama, tetapi mengingat implikasi keamanannya, kecuali Anda tidak punya pilihan, CORS adalah pilihan yang lebih baik.
sumber
JSONP benar-benar trik sederhana untuk mengatasi kebijakan domain XMLHttpRequest yang sama. (Seperti yang Anda ketahui, seseorang tidak dapat mengirim permintaan AJAX (XMLHttpRequest) ke domain lain.)
Jadi - alih-alih menggunakan XMLHttpRequest, kita harus menggunakan tag HTML skrip , yang biasanya Anda gunakan untuk memuat file js, agar js mendapatkan data dari domain lain. Kedengarannya aneh?
Masalahnya - ternyata tag skrip dapat digunakan dengan cara yang mirip dengan XMLHttpRequest ! Lihat ini:
Anda akan berakhir dengan segmen skrip yang terlihat seperti ini setelah memuat data:
Namun ini agak merepotkan, karena kita harus mengambil array ini dari tag skrip . Jadi pembuat JSONP memutuskan bahwa ini akan bekerja lebih baik (dan memang demikian):
Perhatikan fungsi my_callback di sana? Jadi - ketika server JSONP menerima permintaan Anda dan menemukan parameter panggilan balik - alih-alih mengembalikan array js biasa, ia akan mengembalikan ini:
Lihat di mana keuntungannya: sekarang kita mendapatkan panggilan balik otomatis (my_callback) yang akan dipicu begitu kita mendapatkan data.
Hanya itu yang perlu diketahui tentang JSONP : ini adalah tag panggilan balik dan skrip.
CATATAN: ini adalah contoh sederhana penggunaan JSONP, ini bukan skrip yang siap produksi.
Contoh JavaScript dasar (umpan Twitter sederhana menggunakan JSONP)
Contoh jQuery dasar (umpan Twitter sederhana menggunakan JSONP)
JSONP adalah singkatan dari JSON dengan Padding . (teknik yang dinamai sangat buruk karena tidak ada hubungannya dengan apa yang oleh kebanyakan orang akan dianggap sebagai "padding".)
sumber
JSONP bekerja dengan membangun elemen "skrip" (baik dalam markup HTML atau dimasukkan ke DOM melalui JavaScript), yang meminta ke lokasi layanan data jarak jauh. Responsnya adalah javascript yang dimuat ke browser Anda dengan nama fungsi yang telah ditentukan bersama dengan parameter yang diteruskan yaitu data JSON yang diminta. Ketika skrip dijalankan, fungsi dipanggil bersama dengan data JSON, memungkinkan halaman yang meminta untuk menerima dan memproses data.
Untuk Bacaan Lebih Lanjut Kunjungi: https://blogs.sap.com/2013/07/15/secret-behind-jsonp/
cuplikan kode sisi klien
Sepotong sisi server dari kode PHP
sumber
Karena Anda dapat meminta server untuk menambahkan awalan ke objek JSON yang dikembalikan. Misalnya
function_prefix(json_object);
agar browser dapat
eval
"inline" string JSON sebagai ekspresi. Trik ini memungkinkan server untuk "menyuntikkan" kode javascript langsung di browser Klien dan ini dengan melewati batasan "asal yang sama".Dengan kata lain, Anda dapat mencapai pertukaran data lintas domain .
Biasanya,
XMLHttpRequest
tidak mengizinkan pertukaran data lintas domain secara langsung (seseorang harus melalui server di domain yang sama) sedangkan:<script src="some_other_domain/some_data.js&prefix=function_prefix
> `seseorang dapat mengakses data dari domain yang berbeda dari dari asalnya.Juga patut dicatat: meskipun server harus dianggap sebagai "tepercaya" sebelum mencoba "trik" semacam itu, efek samping dari kemungkinan perubahan dalam format objek dll. Dapat diatasi. Jika a
function_prefix
(yaitu fungsi js yang tepat) digunakan untuk menerima objek JSON, fungsi tersebut dapat melakukan pemeriksaan sebelum menerima / memproses lebih lanjut data yang dikembalikan.sumber
JSONP adalah cara yang bagus untuk mengatasi kesalahan skrip lintas domain. Anda dapat menggunakan layanan JSONP murni dengan JS tanpa harus menerapkan proxy AJAX di sisi server.
Anda dapat menggunakan layanan b1t.co untuk melihat cara kerjanya. Ini adalah layanan JSONP gratis yang memungkinkan Anda untuk mengecilkan URL Anda. Berikut ini url yang akan digunakan untuk layanan:
http://b1t.co/Site/api/External/MakeUrlWithGet?callback=[resultCallBack[&url=[escapedUrlToMinify]
Misalnya panggilan, http://b1t.co/Site/api/External/MakeUrlWithGet?callback=wh whateverJavascriptName&url=google.com
akan kembali
Dan dengan demikian ketika itu dimuat di js Anda sebagai src, itu akan secara otomatis menjalankanJavascriptName apa pun yang harus Anda terapkan sebagai fungsi callback Anda:
Untuk benar-benar melakukan panggilan JSONP, Anda dapat melakukannya tentang beberapa cara (termasuk menggunakan jQuery) tetapi di sini adalah contoh JS murni:
Contoh langkah demi langkah dan layanan web jsonp untuk berlatih tersedia di: posting ini
sumber
Contoh sederhana untuk penggunaan JSONP.
client.html
server.php
sumber
Sebelum memahami JSONP, Anda perlu mengetahui format JSON dan XML. Saat ini format data yang paling sering digunakan di web adalah XML, tetapi XML sangat rumit. Itu membuat pengguna tidak nyaman untuk memproses tertanam di halaman Web.
Untuk membuat JavaScript dapat dengan mudah bertukar data, bahkan sebagai program pemrosesan data, kami menggunakan kata-kata sesuai dengan objek JavaScript dan mengembangkan format pertukaran data sederhana, yaitu JSON. JSON dapat digunakan sebagai data, atau sebagai program JavaScript.
JSON dapat langsung disematkan dalam JavaScript, dengan menggunakannya Anda dapat langsung menjalankan program JSON tertentu, tetapi karena kendala keamanan, mekanisme Sandbox browser menonaktifkan eksekusi kode JSON lintas domain.
Untuk membuat JSON dapat diteruskan setelah eksekusi, kami mengembangkan JSONP. JSONP melewati batas keamanan browser dengan fungsi JavaScript Callback dan tag <script>.
Jadi singkatnya ini menjelaskan apa itu JSONP, masalah apa yang dipecahkannya (kapan menggunakannya).
sumber
TL; DR
JSONP adalah trik lama yang diciptakan untuk melewati pembatasan keamanan yang melarang kita untuk mendapatkan data JSON dari server yang berbeda ( asal yang berbeda * ).
Caranya bekerja dengan menggunakan
<script>
tag yang meminta JSON dari tempat itu, misalnya{ "user":"Smith" }
:, tetapi dibungkus dengan fungsi, JSONP yang sebenarnya ("JSON with Padding"):Menerima dalam bentuk ini memungkinkan kita untuk menggunakan data dalam
peopleDataJSONP
fungsi kita . JSONP adalah praktik yang buruk , jangan menggunakannya (baca di bawah)Masalah
Katakanlah kita sedang menavigasi
ourweb.com
, dan kami ingin mendapatkan data JSON (atau data mentah apa pun) darianotherweb.com
. Jika kami menggunakan permintaan GET (sepertiXMLHttpRequest
,fetch
panggilan$.ajax
, dll.), Browser kami akan memberi tahu kami bahwa itu tidak diizinkan dengan kesalahan jelek ini:Bagaimana cara mendapatkan data yang kita inginkan? Yah,
<script>
tag tidak dikenakan batasan seluruh server (asal *) ini! Itu sebabnya kami dapat memuat pustaka seperti jQuery atau Google Maps dari server apa pun, seperti CDN, tanpa kesalahan.Poin penting : jika Anda memikirkannya, pustaka tersebut adalah kode JS aktual yang dapat dijalankan (biasanya fungsi besar dengan semua logika di dalamnya). Tapi data mentah? Data JSON bukan kode . Tidak ada yang bisa dijalankan; itu hanya data biasa.
Karenanya, tidak ada cara untuk menangani atau memanipulasi data berharga kami. Browser akan mengunduh data yang ditunjukkan oleh
<script>
tag kami dan ketika memprosesnya akan mengeluh:Retas JSONP
Cara lama / hacky untuk memanfaatkan data itu? Kami membutuhkan server itu untuk mengirimkannya dengan beberapa logika, jadi ketika itu dimuat, kode Anda di browser akan dapat menggunakan data tersebut. Jadi server asing mengirimi kami data JSON di dalam fungsi JS. Data itu sendiri diatur sebagai input fungsi itu. Ini terlihat seperti ini:
yang membuatnya menjadi kode JS browser kita akan diurai tanpa mengeluh! Persis seperti halnya dengan pustaka jQuery. Sekarang, untuk mendapatkannya seperti itu, klien "meminta" server JSONP-friendly untuk itu, biasanya dilakukan seperti ini:
Browser kami akan menerima JSONP dengan nama fungsi itu, maka kami membutuhkan fungsi dengan nama yang sama dalam kode kami, seperti ini:
Atau seperti ini, hasil yang sama:
Browser akan mengunduh JSONP dan menjalankannya, yang memanggil fungsi kami , di mana argumennya
data
adalah JSON kami. Kita sekarang dapat melakukan dengan data apa pun yang kita inginkan.Jangan gunakan JSONP, gunakan CORS
JSONP adalah peretasan lintas situs dengan beberapa kelemahan:
Yang perlu diperhatikan adalah tidak perlu menggunakannya saat ini .
JSONP adalah trik untuk mendapatkan data JSON dari server lain, tetapi kami akan melanggar prinsip keamanan yang sama (Asal-Sama) jika kita memerlukan jenis lain dari hal-hal lintas situs.
Anda harus membaca tentang CORS di sini , tetapi intinya adalah:
* asal didefinisikan oleh 3 hal: protokol , port , dan host . Jadi, misalnya,
https://web.com
adalah asal yang berbeda darihttp://web.com
(protokol berbeda) danhttps://web.com:8081
(port berbeda) dan jelashttps://thatotherweb.net
(host berbeda)sumber
Jawaban yang bagus telah diberikan, saya hanya perlu memberikan bagian saya dalam bentuk blok kode dalam javascript (saya juga akan memasukkan solusi yang lebih modern dan lebih baik untuk permintaan lintas asal: CORS dengan HTTP Header):
JSONP:
1.client_jsonp.js
2.server_jsonp.js
CORS :
3.client_cors.js
4.server_cors.js
sumber
Berikut adalah situsnya, dengan contoh yang bagus , dengan penjelasan dari penggunaan teknik ini yang paling sederhana hingga yang paling canggih dalam JavaScript pesawat:
w3schools.com / JSONP
Salah satu teknik favorit saya yang dijelaskan di atas adalah Dynamic JSON Result , yang memungkinkan untuk mengirim JSON ke file PHP dalam parameter URL , dan membiarkan file PHP juga mengembalikan objek JSON berdasarkan informasi yang didapatnya .
Alat seperti jQuery juga memiliki fasilitas untuk menggunakan JSONP :
sumber