Apakah mungkin untuk mengirim data ke JsonP? Atau apakah semua data harus diteruskan di querystring sebagai permintaan GET?
Saya memiliki banyak data yang harus saya kirim ke layanan, lintas domain, dan terlalu besar untuk dikirim melalui querystring
Apa sajakah pilihan untuk menyiasati ini?
POST
request ke domain lain selama domain tersebut dan browser Anda mendukungCORS
. Tapi itu sepenuhnya benarPOST
danJSONP
tidak kompatibel.<script>
tag yang mengarah ke domain lain. Satu-satunya cara untuk menjalankan permintaan POST di browser adalah melalui formulir HTML atau XMLHttpRequest.Jika Anda perlu mengirim banyak data lintas domain. Saya biasanya membuat layanan yang dapat Anda panggil dalam dua langkah:
Pertama klien melakukan pengiriman FORM (posting diperbolehkan lintas domain). Layanan menyimpan input dalam sesi di server (menggunakan GUID sebagai kunci). (klien membuat GUID dan mengirimkannya sebagai bagian dari input)
Kemudian klien melakukan suntikan-skrip normal (JSONP) sebagai parameter Anda menggunakan GUID yang sama seperti yang Anda gunakan dalam posting FORMULIR. Layanan memproses masukan dari sesi dan mengembalikan data dalam mode JSONP normal. Setelah sesi ini dihancurkan.
Ini tentu saja bergantung pada apa yang Anda tulis di server-backend.
sumber
XMLHttpRequest
seharusnya tidak terlibat sama sekali. Jawaban Per menggunakan pengiriman formulir biasa untuk membuat permintaan POST, lalu injeksi elemen skrip untuk membuat permintaan GET.Saya tahu ini adalah necromancy yang serius, tetapi saya pikir saya akan memposting implementasi JSONP POST saya menggunakan jQuery, yang berhasil saya gunakan untuk widget JS saya (ini digunakan untuk pendaftaran dan login pelanggan):
Pada dasarnya, saya menggunakan pendekatan IFrame, seperti yang disarankan dalam jawaban yang diterima. Yang saya lakukan berbeda adalah setelah mengirim permintaan, saya perhatikan, jika formulir bisa dihubungi di iframe, menggunakan timer. Ketika formulir tidak dapat dihubungi, itu berarti permintaan telah dikembalikan. Kemudian, saya menggunakan permintaan JSONP normal untuk menanyakan status operasi.
Saya berharap seseorang merasakan manfaatnya. Diuji di> = IE8, Chrome, FireFox, dan Safari.
sumber
Umumnya JSONP diimplementasikan dengan menambahkan
<script>
tag ke dokumen pemanggil, sehingga URL layanan JSONP adalah "src". Browser mengambil sumber skrip dengan transaksi HTTP GET.Sekarang, jika layanan JSONP Anda berada di domain yang sama dengan halaman panggilan Anda, maka Anda mungkin dapat menggabungkan sesuatu dengan
$.ajax()
panggilan sederhana . Jika tidak dalam domain yang sama, maka saya tidak yakin bagaimana mungkin.sumber
CORS
maka akan dimungkinkan selama browser juga mendukungnya. Dalam kasus ini Anda akan menggunakan polosJSON
daripadaJSONP
.Anda dapat menggunakan Proxy CORS menggunakan proyek ini . Ini akan mengarahkan semua lalu lintas ke titik akhir di domain Anda dan menyampaikan informasi tersebut ke domain eksternal. Karena browser mendaftarkan semua permintaan untuk berada di domain yang sama, kami dapat memposting JSON. CATATAN: Ini juga berfungsi dengan sertifikat SSL yang disimpan di server.
sumber
Ada solusi (peretasan) yang saya lakukan berkali-kali, Anda akan dapat memposting dengan JsonP. (Anda akan dapat Mengirim Formulir, lebih besar dari 2000 karakter daripada yang dapat Anda gunakan oleh GET)
Javascript aplikasi klien
JAWA:
PHP:
Melakukan seperti ini, Anda membuka server Anda untuk permintaan kiriman apa pun, Anda harus mengamankan kembali ini dengan memberikan ident atau sesuatu yang lain.
Dengan metode ini, Anda juga dapat mengubah jenis permintaan dari jsonp ke json, keduanya berfungsi, cukup setel jenis konten respons yang tepat
jsonp
json
Mohon tidak bahwa server Anda tidak akan lagi menghormati SOP (kebijakan asal yang sama), tapi siapa yang peduli?
sumber
<script>
tag ke DOM HTML Anda (bahkan Anda dapat menggunakannya di aplikasi desktop, katakanlah Anda ingin membuat beberapa permintaan JSON ke server yang sama, dan ingin menggunakan nama fungsi sebagai ID pelacakan permintaan misalnya).Mungkin saja, inilah solusi saya:
Di javascript Anda:
Di url.php Anda:
sumber