Tidak bisa mendapatkan data dengan XMLHttpRequest (status 0 dan responseText kosong):
xmlhttp = new XMLHttpRequest (); xmlhttp.open ("DAPATKAN", "http://www.w3schools.com/XML/cd_catalog.xml", benar); xmlhttp.onreadystatechange = function () { jika (xmlhttp.readyState == 4) alert ("status" + xmlhttp.status); } xmlhttp.send ();
Ini mengingatkan "status 0".
Situasi yang sama dengan permintaan localhost (cd_catalog.xml disimpan sebagai file lokal)
xmlhttp.open ("GET", "http: //localhost/cd_catalog.xml", true);
Tetapi dengan permintaan IP localhost
xmlhttp.open ("GET", "http://127.0.0.1/cd_catalog.xml", true);
dan dengan permintaan file lokal
xmlhttp.open ("GET", "cd_catalog.xml", true);
semuanya baik-baik saja (status 200)
Apa yang dapat menyebabkan masalah (status = 0) dengan permintaan online?
PS: Header HTTP Langsung menunjukkan bahwa semuanya baik-baik saja dalam 4 kasus:
HTTP / 1.1 200 Oke Panjang Konten: 4742
PS2: Server web lokal Apache di VMWare (host OS Win7, OS Tamu Ubuntu, Adaptor jaringan - NAT). Browser - Firefox.
javascript
ajax
xmlhttprequest
arigasa
sumber
sumber
http://127.0.0.1
kebetulan? ;)XMLHttpRequest
tidak dapat melakukan permintaan lintas domain. Ada beberapa solusi. Lihat jquery, misalnya.Jawaban:
statusnya adalah 0 ketika file html Anda yang berisi skrip dibuka di browser melalui skema file. Pastikan untuk menempatkan file di server Anda (apache atau tomcat apa saja) dan kemudian buka melalui protokol http di browser. (yaitu http: //localhost/myfile.html ) Ini solusinya.
sumber
file://
skema). Jelas, Anda harus mengizinkan pemuatan file lokal terlebih dahulu dengan menonaktifkan CORS.Penyebab masalah Anda adalah Anda mencoba melakukan panggilan lintas domain dan gagal .
Jika Anda melakukan pengembangan localhost, Anda dapat melakukan panggilan lintas domain - Saya melakukannya setiap saat.
Untuk Firefox, Anda harus mengaktifkannya di pengaturan konfigurasi Anda
Kemudian tambahkan sesuatu seperti ini ke kode terbuka XHR Anda:
Untuk IE, jika saya tidak salah ingat, yang harus Anda lakukan adalah mengaktifkan pengaturan Keamanan browser di bawah "Miscellaneous → Access data sources lintas domain" agar dapat berfungsi dengan ActiveX XHRs.
IE8 dan yang lebih baru juga menambahkan kemampuan lintas domain ke objek XmlHttpRequest asli, tetapi saya belum bermain dengan itu.
sumber
--allow-file-access-from-files
--allow-file-access-from-files
switch, tetapi Anda tidak perlu menutup semua instance lain yang sedang berjalan. Persis seperti dalam Mode Penyamaran Chrome - Anda dapat menggunakannya, tanpa menutup instance lain yang sedang berjalan.Sebenarnya pastikan jenis tombol Anda adalah Button not Submit, yang menyebabkan konflik status di mana saya bertemu baru-baru ini.
sumber
e.preventDefault()
Jika server merespons metode OPTIONS dan GET dan POST (mana pun yang Anda gunakan) dengan header seperti:
Mungkin berhasil. Sepertinya di FireFox 3.5 dan rekonq 0.4.0. Rupanya, dengan tajuk itu dan respons awal ke OPTIONS, server mengatakan ke browser, "Lanjutkan dan biarkan permintaan lintas domain ini diproses."
sumber
XMLHttpRequest
(yaitu sesuai pertanyaan awal), karena sumber daya tersebut tidak (setidaknya, mulai 24 Apr 2015) menyertakan header CORS tersebut.Pertimbangkan juga permintaan waktu tunggu :
Browser modern mengembalikan readyState = 4 dan s tatus = 0 jika terlalu banyak waktu berlalu sebelum respons server.
sumber
Tambahkan
setRequestHeader("Access-Control-Allow-Origin","*")
ke respons server Anda.sumber
Saya pernah menghadapi masalah serupa. Semuanya baik-baik saja, "readystate" adalah 4, tetapi "status" adalah 0. Itu karena saya menggunakan server portabel Apache PHP dan file saya di mana saya menggunakan objek "XMLHttpRequest" adalah file html. Saya mengubah ekstensi file menjadi php dan masalahnya teratasi.
sumber
Buka konsol javascript . Anda akan melihat pesan kesalahan di sana. Dalam kasus saya, itu CORS.
sumber
Untuk menjawab pertanyaan mengapa
http://127.0.0.1/cd_catalog.xml
berfungsi sementarahttp://localhost/cd_catalog.xml
tidak: Firefox memperlakukan 127.0.0.1 dan localhost sebagai dua domain berbeda.sumber
Untuk melihat apa masalahnya, ketika Anda mendapatkan kesalahan samar 0 pergi ke ... | Lebih Banyak Alat | Alat Pengembang (Ctrl + Shift + I) di Chrome (di halaman yang memberikan kesalahan)
Baca teks merah di log untuk mendapatkan pesan kesalahan yang sebenarnya. Jika terlalu banyak di sana, klik kanan dan Hapus Konsol, lalu lakukan permintaan terakhir Anda lagi.
Masalah pertama saya adalah, saya menyampaikan header Otorisasi ke layanan web lintas domain saya sendiri untuk browser untuk pertama kalinya.
Saya sudah memiliki:
Tapi tidak:
di header respons layanan web saya.
Setelah saya menambahkan itu, kesalahan nol saya telah hilang dari server web saya sendiri, serta ketika menjalankan file index.html secara lokal tanpa server web, tetapi masih memberikan kesalahan dalam pena kode.
Kembali ke ... | Alat Lainnya | Developer Tools sementara mendapatkan error di codepen, dan dijelaskan dengan jelas: codepen menggunakan https, jadi saya tidak dapat melakukan panggilan ke http, karena keamanannya lebih rendah.
Oleh karena itu, saya perlu menghosting layanan web saya di https.
Mengetahui bagaimana mendapatkan pesan kesalahan yang sebenarnya - tak ternilai harganya!
sumber
'https://mysiteoriginsite'
dimuat melalui HTTPS, tetapi meminta titik akhir XMLHttpRequest yang tidak aman'http://MyDestinationSite/MyService.svc'
. Permintaan ini telah diblokir; konten harus disajikan melalui HTTPS.Berikut kasus lain di mana
status === 0
, khusus untuk mengunggah:Jika Anda melampirkan
'load'
event handler keXHR.upload
, seperti yang disarankan oleh MDN (gulir ke bawah ke bagian unggahan 'Pemantauan kemajuan'), objek XHR akan memilikistatus=0
dan semua properti lainnya akan menjadi string kosong. Jika Anda memasang'load'
penangan langsung ke objek XHR, seperti yang Anda lakukan saat mengunduh konten, Anda akan baik-baik saja (mengingat Anda tidak menjalankan localhost).Namun, jika Anda ingin mendapatkan data yang bagus di
'progress'
event handler, Anda perlu melampirkan handler keXHR.upload
, bukan langsung ke objek XHR itu sendiri.Saya baru mengujinya sejauh ini di Chrome OSX, jadi saya tidak yakin berapa banyak masalah di sini adalah dokumentasi MDN dan seberapa besar penerapan Chrome ...
sumber
Alex Robinson sudah (dan pertama) memberikan jawaban yang benar untuk masalah ini. Tetapi untuk menguraikannya sedikit lebih ...
Anda harus menambahkan header tanggapan HTTP:
Access-Control-Allow-Origin: *
Jika Anda melakukan ini, hasilnya bukan hanya 'mungkin berhasil', tetapi 'akan berhasil'.
NB Yang perlu Anda tambahkan adalah header respons HTTP - jadi Anda hanya dapat melakukan ini di server yang Anda kontrol. Tidak mungkin untuk langsung mengambil http://w3schools.com/XML/cd_catalog.xml dari URL aslinya menggunakan
XMLHttpRequest
(sesuai pertanyaan OP), karena sumber daya itu tidak (setidaknya, tidak sejak 24 Apr 2015) menyertakan header CORS seperti itu.http://en.wikipedia.org/wiki/Cross-origin_resource_sharing memberikan info lebih lanjut.
sumber
Masalah saya yang mirip dengan ini diselesaikan dengan memeriksa kode html saya. Saya memiliki
onclick
penangan dalam tombol kirim formulir saya ke suatu metode. seperti ini:onclick="sendFalconRequestWithHeaders()"
. Metode ini pada gilirannya memanggil ajax seperti milik Anda, dan melakukan apa yang saya inginkan. Tapi tidak seperti yang diharapkan, browser saya tidak menghasilkan apa-apa.Belajar Dari kerja keras seseorang , saya telah mengembalikan salah di pawang ini, dan diselesaikan. Izinkan saya menyebutkan bahwa sebelum tiba di posting ini, saya telah menghabiskan seluruh akhir pekan 3 hari dan setengah hari di kantor menulis kode penerapan
CORS filters
,, hal-hal terkaitjetty config
lainnyajersey and embedded jetty
- hanya untuk memperbaiki ini., Berputar semua pemahaman saya sekitarcross domain ajax requests
dan hal-hal standar. Sungguh konyol betapa kesalahan sederhana dalam javascript membuat Anda bodoh.Sejujurnya, saya telah mencoba
signed.applets.codebase_principal_support = true
dan menulisisLocalHost() **if**
. mungkin metode ini perlu diterapkan oleh kami, firefox mengatakan tidak ada seperti itu Sekarang saya harus membersihkan kode saya untuk mengirimkan git patch dengan bersih. Terima kasih untuk seseorang itu.sumber
Permintaan browser "127.0.0.1/somefile.html" tidak berubah ke server web lokal, sementara "localhost / somefile.html" mungkin datang sebagai "0: 0: 0: 0: 0: 0: 0: 1 / somefile.html "jika IPv6 didukung. Jadi yang terakhir dapat diproses seperti berpindah dari domain ke domain lain.
sumber
Alex Robinson dan bmju memberikan informasi berharga untuk memahami masalah lintas sumber. Saya ingin menambahkan bahwa Anda mungkin perlu membuat panggilan OPTIONS eksplisit dalam kode klien Anda sebelum membuat GET / POST yang diinginkan (mis. Terhadap titik akhir layanan CORS OAuth). Browser / perpustakaan Anda mungkin tidak secara otomatis menangani permintaan OPTIONS. Gruber, ini adalah salah satu kemungkinan jawaban atas pertanyaan Anda.
sumber
Saya memiliki masalah yang sama (readyState adalah 4 dan status 0) , lalu saya mengikuti pendekatan berbeda yang dijelaskan dalam tutorial ini: https://spring.io/guides/gs/consuming-rest-jquery/
Dia tidak menggunakan XMLHttpRequest sama sekali, sebagai gantinya dia menggunakan metode jquery $ .ajax () :
dan untuk file publik / hello.js (atau Anda dapat memasukkannya ke dalam kode HTML yang sama secara langsung):
sumber
$.ajax()
menggunakanXMLHttpRequest
di dalam, bukan?Saya harus menambahkan alamat IP saya saat ini (lagi) ke daftar putih Atlas MongoDB dan menyingkirkan kesalahan status XMLHttpRequest 0
sumber
Saya baru saja mengalami masalah ini karena saya menggunakan
0.0.0.0
sebagai server saya, mengubahnya menjadilocalhost
dan berhasil.sumber
Edit: Silakan baca komentar Malvolio di bawah karena pengetahuan jawaban ini sudah ketinggalan zaman.
Anda tidak dapat melakukan XMLHttpRequests lintas domain.
Panggilan ke
127.0.0.1
berfungsi karena halaman pengujian Anda berada di127.0.0.1
, dan pengujian lokal juga berfungsi karena, yah ... ini adalah pengujian lokal.Dua pengujian lainnya gagal karena JavaScript tidak dapat berkomunikasi dengan server jauh melalui XMLHttpRequest.
Sebagai gantinya, Anda dapat mempertimbangkan:
Semoga membantu
sumber
XMLHttpRequest
bukan hanya ide yang bagus , ini sangat umum saat ini sehingga TIDAK melakukannya di aplikasi web modern (di luar semacam HelloWorlds) adalah sesuatu yang konyol. Layanan REST eksternal apa pun yang digunakan aplikasi Anda memerlukan lintas domainXMLHttpRequest
. Dan itulah mengapa semua hal CORS ditambahkan.