Catatan mod : Pertanyaan ini tentang mengapa Postman tidak tunduk pada batasan CORS dengan cara yang sama seperti XMLHttpRequest. Pertanyaan ini bukan tentang bagaimana memperbaiki kesalahan "Tidak Ada 'Akses-Kontrol-Izinkan-Asal' ...".
Tolong hentikan posting :
- Konfigurasi CORS untuk setiap bahasa / kerangka kerja di bawah matahari. Alih-alih, temukan pertanyaan bahasa / kerangka kerja Anda yang relevan .
- Layanan pihak ke-3 yang memungkinkan permintaan untuk menghindari CORS
- Opsi baris perintah untuk mematikan CORS untuk berbagai browser
Saya mencoba melakukan otorisasi menggunakan JavaScript dengan menghubungkan ke RESTful API built-in Flask . Namun, ketika saya mengajukan permintaan, saya mendapatkan kesalahan berikut:
XMLHttpRequest tidak dapat memuat http: // myApiUrl / login . Header 'Access-Control-Allow-Origin' tidak ada pada sumber daya yang diminta. Karenanya, 'null' tidak diizinkan untuk mengakses.
Saya tahu bahwa API atau sumber daya jarak jauh harus mengatur tajuk, tetapi mengapa itu berfungsi saat saya mengajukan permintaan melalui ekstensi Chrome Postman ?
Ini adalah kode permintaan:
$.ajax({
type: "POST",
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain : true,
xhrFields: {
withCredentials: true
}
})
.done(function( data ) {
console.log("done");
})
.fail( function(xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
sumber
Jawaban:
Jika saya memahaminya dengan benar, Anda melakukan XMLHttpRequest ke domain yang berbeda dengan halaman Anda. Jadi browser memblokirnya karena biasanya memungkinkan permintaan dengan asal yang sama untuk alasan keamanan. Anda perlu melakukan sesuatu yang berbeda ketika Anda ingin melakukan permintaan lintas-domain. Tutorial tentang cara mencapainya adalah Menggunakan CORS .
Saat Anda menggunakan tukang pos, mereka tidak dibatasi oleh kebijakan ini. Dikutip dari Cross-Origin XMLHttpRequest :
sumber
Ini sangat sederhana untuk dipecahkan jika Anda menggunakan PHP . Cukup tambahkan skrip berikut di awal halaman PHP Anda yang menangani permintaan:
Jika Anda menggunakan Node-red Anda harus mengizinkan CORS dalam
node-red/settings.js
file dengan menghapus komentar pada baris berikut:Jika Anda menggunakan Flask sama dengan pertanyaan; Anda harus menginstal terlebih dahulu
flask-cors
Kemudian sertakan flask cors dalam aplikasi Anda.
Aplikasi sederhana akan terlihat seperti:
Untuk lebih jelasnya, Anda dapat memeriksa dokumentasi Flask .
sumber
Karena
$ .ajax ({type: "POST" - panggilan OPSI
$ .post ( - Panggilan POST
Keduanya berbeda. Tukang pos memanggil "POST" dengan benar, tetapi ketika kita menyebutnya, itu akan menjadi "PILIHAN".
Untuk layanan web C # - Web API
Silakan tambahkan kode berikut di file web.config Anda di bawah tag <system.webServer>. Ini akan berhasil:
Pastikan Anda tidak melakukan kesalahan apa pun dalam panggilan Ajax
jQuery
Catatan: Jika Anda mencari untuk mengunduh konten dari situs web pihak ketiga maka ini tidak akan membantu Anda . Anda dapat mencoba kode berikut, tetapi bukan JavaScript.
sumber
*
menggunakanhttps://www.myotherdomain.com
Menerapkan pembatasan CORS adalah fitur keamanan yang ditentukan oleh server dan diimplementasikan oleh browser .
Namun, alat tukang pos tidak peduli tentang kebijakan server CORS.
Itulah sebabnya kesalahan CORS muncul di browser, tetapi tidak di Postman.
sumber
Dalam penyelidikan di bawah ini sebagai API, saya menggunakan http://example.com daripada http: // myApiUrl / login dari pertanyaan Anda, karena ini yang pertama berfungsi.
Saya berasumsi bahwa halaman Anda ada di http: //my-site.local: 8088 .
Alasan mengapa Anda melihat hasil yang berbeda adalah Postman:
Host=example.com
(API Anda)Origin
Ini mirip dengan cara browser mengirim permintaan ketika situs dan API memiliki domain yang sama (browser juga mengatur item header
Referer=http://my-site.local:8088
, namun saya tidak melihatnya di Postman). KetikaOrigin
tajuk tidak disetel, biasanya server mengizinkan permintaan semacam itu secara default.Ini adalah cara standar bagaimana Postman mengirim permintaan. Tetapi browser mengirimkan permintaan secara berbeda ketika situs dan API Anda memiliki domain yang berbeda , dan kemudian CORS muncul dan browser secara otomatis:
Host=example.com
(milik Anda sebagai API)Origin=http://my-site.local:8088
(situs Anda)(Header
Referer
memiliki nilai yang sama denganOrigin
). Dan sekarang di tab Konsol & Jaringan Chrome Anda akan melihat:Ketika Anda memiliki
Host != Origin
ini adalah CORS, dan ketika server mendeteksi permintaan semacam itu, biasanya diblokir secara default .Origin=null
diatur ketika Anda membuka konten HTML dari direktori lokal, dan mengirimkan permintaan. Situasi yang sama adalah ketika Anda mengirim permintaan di dalam<iframe>
, seperti di cuplikan di bawah ini (tapi di siniHost
tajuk tidak disetel sama sekali) - secara umum, di mana pun spesifikasi HTML mengatakan asal buram, Anda dapat menerjemahkannya keOrigin=null
. Informasi lebih lanjut tentang ini dapat Anda temukan di sini .Jika Anda tidak menggunakan permintaan CORS sederhana, biasanya browser secara otomatis juga mengirimkan permintaan OPSI sebelum mengirim permintaan utama - informasi lebih lanjut ada di sini . Cuplikan di bawah ini menunjukkannya:
Anda dapat mengubah konfigurasi server Anda untuk memungkinkan permintaan CORS.
Berikut adalah contoh konfigurasi yang mengaktifkan CORS pada nginx (file nginx.conf) - sangat berhati-hati dengan pengaturan
always/"$http_origin"
untuk nginx dan"*"
untuk Apache - ini akan membuka blokir CORS dari domain apa pun.Tampilkan cuplikan kode
Berikut adalah contoh konfigurasi yang menyalakan CORS di Apache (file .htaccess)
Tampilkan cuplikan kode
sumber
Mengalami kesalahan yang sama dalam berbagai kasus penggunaan.
Use Case: Dalam chrome ketika mencoba memanggil titik akhir Spring REST dalam sudut.
Solusi: Tambahkan anotasi @CrossOrigin ("*") di atas masing-masing Kelas Kontroler.
sumber
Jika Anda menggunakan .NET sebagai tingkat menengah Anda, periksa atribut rute dengan jelas, misalnya,
Saya punya masalah ketika sudah seperti ini,
Memperbaikinya dengan ini,
sumber
Hanya untuk proyek .NET Core Web API, tambahkan perubahan berikut:
services.AddMvc()
baris dalamConfigureServices()
metode file Startup.cs:app.UseMvc()
baris dalamConfigure()
metode file Startup.cs:sumber