Saya mencoba mengatur AngularJS untuk berkomunikasi dengan sumber daya asal-silang di mana host aset yang memberikan file templat saya ada di domain yang berbeda dan oleh karena itu permintaan XHR yang berkinerja angular harus berupa cross-domain. Saya telah menambahkan header CORS yang sesuai ke server saya untuk permintaan HTTP untuk membuat ini berfungsi, tetapi tampaknya tidak berfungsi. Masalahnya adalah ketika saya memeriksa permintaan HTTP di browser saya (chrome), permintaan yang dikirim ke file aset adalah permintaan OPTIONS (seharusnya permintaan GET).
Saya tidak yakin apakah ini bug di AngularJS atau jika saya perlu mengkonfigurasi sesuatu. Dari apa yang saya pahami pembungkus XHR tidak dapat membuat permintaan HTTP OPSI sehingga sepertinya browser sedang mencari tahu apakah "diizinkan" untuk mengunduh aset terlebih dahulu sebelum melakukan permintaan GET. Jika demikian, apakah saya perlu mengatur header CORS (Access-Control-Allow-Origin: http://asset.host ... ) dengan host aset juga?
sumber
$resource
POST menghasilkan permintaan OPSI ke server backJS Expressend saya (pada host yang sama; tetapi port yang berbeda).Untuk Angular 1.2.0rc1 + Anda perlu menambahkan resourceUrlWhitelist.
1.2: versi rilis mereka menambahkan fungsi escapeForRegexp sehingga Anda tidak perlu lagi melarikan diri dari string. Anda bisa langsung menambahkan url
pastikan untuk menambahkan ** untuk sub folder. Berikut adalah jsbin yang berfungsi untuk 1.2: http://jsbin.com/olavok/145/edit
1.2.0rc: Jika Anda masih pada versi rc, Solusinya 1.2.0rc1 solusinya terlihat seperti:
Berikut adalah contoh jsbin di mana ia bekerja untuk 1.2.0rc1: http://jsbin.com/olavok/144/edit
Pra 1.2: Untuk versi yang lebih lama (ref http://better-inter.net/enabling-cors-in-angular-js/ ) Anda perlu menambahkan 2 baris berikut ke konfigurasi Anda:
Berikut adalah contoh jsbin di mana ia berfungsi untuk versi pra 1.2: http://jsbin.com/olavok/11/edit
sumber
CATATAN: Tidak yakin itu berfungsi dengan versi terbaru Angular.
ASLI:
Dimungkinkan juga untuk mengabaikan permintaan OPSI (hanya diuji di Chrome):
sumber
$resource('http://yourserver/yourentity/:id', {}, {query: {method: 'GET'});
Layanan Anda harus menjawab
OPTIONS
permintaan dengan tajuk seperti ini:Berikut ini adalah dokumen yang bagus: http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server
sumber
Dokumen yang sama mengatakan
Tidak seperti permintaan sederhana (dibahas di atas), permintaan "preflighted" pertama-tama mengirim tajuk permintaan HTTP OPTIONS ke sumber daya di domain lain, untuk menentukan apakah permintaan sebenarnya aman untuk dikirim. Permintaan lintas-situs telah ditetapkan sebelumnya seperti ini karena mungkin memiliki implikasi pada data pengguna. Secara khusus, permintaan sudah dicetak sebelumnya jika:
Ketika permintaan asli Dapatkan tanpa header khusus, browser tidak boleh membuat permintaan Pilihan yang sekarang. Masalahnya adalah ia menghasilkan header X-Diminta-Dengan yang memaksa permintaan Opsi. Lihat https://github.com/angular/angular.js/pull/1454 tentang cara menghapus tajuk ini
sumber
Ini memperbaiki masalah saya:
sumber
Jika Anda menggunakan server nodeJS, Anda dapat menggunakan perpustakaan ini, itu berfungsi dengan baik untuk saya https://github.com/expressjs/cors
dan setelah itu kamu bisa melakukan
npm update
.sumber
Inilah cara saya memperbaiki masalah ini pada ASP.NET
Pertama, Anda harus menambahkan paket nuget Microsoft.AspNet.WebApi.Cors
Kemudian modifikasi file App_Start \ WebApiConfig.cs
Tambahkan atribut ini pada kelas controller Anda
Saya bisa mengirim json ke aksi dengan cara ini
Referensi: Mengaktifkan Permintaan Lintas-Asal di ASP.NET Web API 2
sumber
Entah bagaimana saya memperbaikinya dengan mengubah
untuk
sumber
Dijelaskan dengan sempurna dalam komentar pkozlowski. Saya punya solusi yang berfungsi dengan AngularJS 1.2.6 dan ASP.NET Web Api tetapi ketika saya telah memutakhirkan AngularJS ke 1.3.3 maka permintaan gagal.
Solusi untuk server Web Api adalah menambahkan penanganan permintaan OPSI di awal metode konfigurasi (info lebih lanjut di posting blog ini ):
sumber
Jika Anda menggunakan Jersey untuk API REST, Anda dapat melakukannya seperti di bawah ini
Anda tidak perlu mengubah implementasi layanan web Anda.
Saya akan menjelaskan untuk Jersey 2.x
1) Pertama-tama tambahkan ResponseFilter seperti yang ditunjukkan di bawah ini
2) kemudian di web.xml, dalam deklarasi servlet jersey tambahkan di bawah ini
sumber
Saya menyerah berusaha memperbaiki masalah ini.
Web.config IIS saya memiliki "
Access-Control-Allow-Methods
" yang relevan di dalamnya, saya bereksperimen menambahkan pengaturan konfigurasi ke kode Angular saya, tetapi setelah membakar beberapa jam mencoba membuat Chrome memanggil layanan web JSON lintas-domain, saya menyerah dengan sedih.Pada akhirnya, saya menambahkan bodoh ASP.Net handler halaman web, mendapat bahwa untuk memanggil layanan JSON web saya, dan mengembalikan hasil. Sudah berjalan dan dalam 2 menit.
Berikut kode yang saya gunakan:
Dan di pengontrol sudut saya ...
Saya yakin ada cara yang lebih sederhana / lebih umum untuk melakukan ini, tetapi hidup ini terlalu singkat ...
Ini bekerja untuk saya, dan saya bisa melanjutkan pekerjaan normal sekarang !!
sumber
Untuk IIS MVC 5 / Angular CLI (Ya, saya sangat menyadari masalah Anda dengan Angular JS) proyek dengan API Saya melakukan hal berikut:
web.config di bawah
<system.webServer>
simpulglobal.asax.cs
Itu akan memperbaiki masalah Anda untuk MVC dan WebAPI tanpa harus melakukan yang lainnya. Saya kemudian membuat HttpInterceptor di proyek Angular CLI yang secara otomatis ditambahkan dalam informasi header yang relevan. Semoga ini bisa membantu seseorang keluar dalam situasi serupa.
sumber
Sedikit terlambat ke pesta,
Jika Anda menggunakan Angular 7 (atau 5/6/7) dan PHP sebagai API dan masih mendapatkan kesalahan ini, coba tambahkan opsi tajuk berikut ke titik akhir (PHP API).
Catatan : Yang dibutuhkan hanyalah
Access-Control-Allow-Methods
. Tapi, saya menempelkan di sini dua lainnyaAccess-Control-Allow-Origin
danAccess-Control-Allow-Headers
, hanya karena Anda perlu semua ini diatur dengan benar agar Aplikasi Angular dapat berbicara dengan benar ke API Anda.Semoga ini bisa membantu seseorang.
Bersulang.
sumber