Saya menggunakan fungsi jQuery ajax untuk mengakses layanan web, tetapi server, alih-alih mengembalikan respons dengan kode status yang menjelaskan masalah, permintaan tersebut dialihkan ke halaman dengan header 200, yang menjelaskan masalahnya. Saya tidak dapat membuat perubahan apa pun untuk ini, jadi saya harus menyelesaikannya pada klien entah bagaimana caranya.
Contoh: Permintaan pergi ke beberapa URL yang tidak ditemukan, jadi saya menerima 302 Redirect ke lokasi lain. Permintaan baru dikirim, dan saya menerima 200 OK, sehingga mencegah kesalahan panggilan balik untuk diaktifkan.
Adakah cara agar saya dapat mencegah permintaan ajax mengikuti pengalihan dan sebagai gantinya memanggil callback, sebaiknya metode kesalahan. Atau, apakah mungkin untuk mendeteksi jika pengalihan telah terjadi di klien?
sumber
Jawaban:
Saya menemukan pertanyaan Anda menarik, tetapi masalah secara keseluruhan tampaknya lebih merupakan kesalahpahaman. Setidaknya saya akan mencoba menjelaskan pemahaman saya tentang masalah tersebut.
Pengalihan diam (transparan) adalah bagian dari
XMLHttpRequest
spesifikasi (lihat di sini terutama kata-kata "... secara transparan ikuti pengalihan ..."). Standar hanya menyebutkan bahwa agen pengguna (browser web) dapat mencegah atau memberi tahu beberapa jenis pengalihan otomatis, tetapi itu bukan bagian dariXMLHttpRequest
. Ini adalah bagian dari konfigurasi klien HTTP (konfigurasi OS) atau konfigurasi browser web. JadijQuery.ajax
tidak dapat memiliki opsi apa pun di mana Anda dapat mencegah pengalihan.Anda dapat melihat bahwa pengalihan HTTP adalah bagian dari protokol HTTP dan bukan bagian dari
XMLHttpRequest
. Jadi ini ada di level abstraksi lain atau tumpukan jaringan. Misalnya data dariXMLHttpRequest
dapat diambil dari proxy HTTP atau dari cache browser lokal, dan itu adalah bagian dari protokol HTTP. Sebagian besar server yang menyediakan data dan bukan klien dapat memengaruhi caching.Anda dapat membandingkan persyaratan dari pertanyaan Anda dengan persyaratan untuk mencegah perubahan alamat IP server web atau perubahan rute IP selama komunikasi. Semua hal bisa menarik dalam beberapa skenario, tetapi ada bagian dari tumpukan komunikasi tingkat lain dan tidak dapat dikelola oleh
jQuery.ajax
atauXMLHttpRequest
.The
XMLHttpRequest
standar mengatakan bahwa konfigurasi klien dapat memiliki pilihan yang mencegah pengalihan. Dalam kasus "Microsoft world", yang lebih saya ketahui, Anda dapat melihat fungsi WinHttpSetOption yang dapat digunakan untuk mengaturWINHTTP_OPTION_DISABLE_FEATURE
opsi denganWINHTTP_DISABLE_REDIRECTS
nilai. Cara lain adalah penggunaanWINHTTP_OPTION_REDIRECT_POLICY
opsi denganWINHTTP_OPTION_REDIRECT_POLICY_NEVER
nilai. Satu lagi fitur yang dapat digunakan di Windows adalah fungsi WinHttpSetStatusCallback yang dapat mengatur fungsi panggilan balik menerima beberapa pemberitahuan sepertiWINHTTP_CALLBACK_FLAG_REDIRECT
.Jadi mungkin saja untuk mengimplementasikan persyaratan Anda secara umum, tetapi solusinya mungkin tidak terlepas dari sistem operasi atau browser web dan tidak berada pada level
jQuery.ajax
atauXMLHttpRequest
.sumber
Saya tidak percaya itu mungkin. Library yang mendasari (XHR) membuat permintaan baru secara transparan. Karena itu, apa yang telah saya lakukan dalam situasi ini (biasanya jenis kesepakatan waktu tunggu sesi yang membawa saya ke halaman login) adalah mengirim kembali header respons kustom. Saya juga telah menyiapkan penangan ajax global yang memeriksa keberadaan header itu, dan merespons dengan tepat saat ada (misalnya, mengarahkan seluruh halaman ke layar login).
Jika Anda tertarik, berikut kode jQuery yang harus saya perhatikan untuk tajuk khusus itu:
sumber
Saya menemukan fitur untuk memeriksa apakah panggilan Anda telah dialihkan. Ini xhr.state (): jika "ditolak" maka pengalihan terjadi.
Contoh dengan panggilan balik sukses:
Contoh dengan error callback:
sumber
Saya tidak mungkin menambahkan kearifan berwawasan dari pembuat kode sebelumnya yang telah menanggapi, tetapi saya akan menambahkan kasus spesifik yang mungkin berguna untuk diketahui orang lain.
Saya menemukan 302 pengalihan diam ini dalam konteks SharePoint. Saya memiliki beberapa kode klien Javascript sederhana yang mengirim ping ke sub-situs SharePoint, dan jika menerima respons HTTP 200, ia pindah ke situs itu, melalui
window.location
. Jika menerima hal lain, ini memberi pengguna pemberitahuan bahwa situs tersebut tidak ada.Namun, dalam kasus di mana situs tersebut ada tetapi pengguna tidak memiliki izin, SharePoint secara diam-diam mengalihkan ke halaman AccessDenied.aspx. SharePoint telah melakukan jabat tangan otentikasi HTTP 401 di tingkat server / pertanian - pengguna memiliki akses ke SharePoint. Tetapi akses ke sub-situs ditangani, saya kira menggunakan semacam bendera database. Pengalihan diam-diam melewati klausa "lain" saya, jadi saya tidak bisa menampilkan kesalahan saya sendiri. Dalam kasus saya, ini bukan show-stopper - ini adalah perilaku yang dapat diprediksi secara konsisten. Tapi itu sedikit mengejutkan, dan saya belajar sesuatu tentang permintaan HTTP dalam prosesnya!
sumber
Saya tertarik pada hal yang sama dan tidak dapat menemukan
state()
metode yang disebutkan oleh Takman dan melakukan sedikit penggalian untuk diri saya sendiri. Demi orang-orang yang muncul di sini untuk mencari jawaban, inilah temuan saya:Seperti yang dinyatakan beberapa kali, Anda tidak dapat mencegah pengalihan, tetapi Anda dapat mendeteksinya. Menurut MDN, Anda dapat menggunakan
responseURL
dariXMLHttpRequestObject
, yang akan berisi URL final tempat tanggapan berasal, setelah semua pengalihan. Satu-satunya peringatan adalah bahwa itu tidak didukung oleh Internet Explorer (Edge memilikinya). Karenaxhr
/jqXHR
diteruskan kesuccess
/done
fungsi jquery adalah perpanjangan dari aktualXMLHttpRequest
, itu juga harus tersedia di sana.sumber
Saya kira Anda menerima 200 respon karena kedua kalinya tidak ada pengalihan, karena halaman 404 tidak kedaluwarsa, itu disimpan di cache. Artinya, untuk kedua kalinya browser memberi Anda halaman dalam cache. Ada properti "cache" di ajax jquery. http://api.jquery.com/jQuery.ajax/
Anda harus menuliskannya ke "false"
sumber
Meskipun tidak mungkin menonaktifkan pengalihan lokasi yang mengikuti XmlHttpRequests , itu adalah saat menggunakan fetch () :
sumber
Saya tidak yakin apakah ini akan berlaku dalam kasus Anda, tetapi Anda dapat menulis kode untuk menanggapi kode status tertentu dalam fungsi AJAX -
sumber
Dalam header permintaan dalam kasus permintaan ajax Anda akan memiliki yang berikut ini
Dengan kriteria ini di sisi server Anda dapat memfilter permintaan.
sumber