Bir REST API'den veri almaya çalışırken istenen kaynakta 'Access-Control-Allow-Origin' başlığı yok
HP Alm'nin REST API'sinden bazı verileri almaya çalışıyorum. Küçük bir curl betiği ile oldukça iyi çalışıyor - verilerimi alıyorum.
Şimdi bunu JavaScript, fetch ve ES6 (aşağı yukarı) ile yapmak daha büyük bir sorun gibi görünüyor. Bu hata mesajını almaya devam ediyorum:
Fetch API yüklenemiyor. Preflight isteğine yanıt gelmiyor erişim kontrolünü geçemiyor: Hiçbir 'Erişim Kontrolü-İzin Ver-Kaynak' başlığı yok istenen kaynak üzerinde mevcut. Köken 'http://127.0.0.1:3000' şudur bu nedenle erişim izni verilmemiştir. Yanıt HTTP durum kodu 501'e sahipti. Eğer opak bir yanıt ihtiyaçlarınızı karşılıyorsa, isteğin modunu şu şekilde ayarlayın Kaynağı CORS devre dışı bırakılmış olarak almak için > 'no-cors'.
Bunun, bu verileri localhost'umdan almaya çalışmamdan kaynaklandığını ve çözümün CORS kullanmak olması gerektiğini anlıyorum. Şimdi bunu gerçekten yaptığımı düşündüm, ama bir şekilde ya başlıkta yazdıklarımı görmezden geliyor ya da sorun başka bir şey mi?
Peki, bir uygulama sorunu var mı? Yanlış mı yapıyorum? Ne yazık ki sunucu kayıtlarını kontrol edemiyorum. Burada gerçekten biraz sıkışmış durumdayım.
function performSignIn() {
let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept', 'application/json');
headers.append('Access-Control-Allow-Origin', 'http://localhost:3000');
headers.append('Access-Control-Allow-Credentials', 'true');
headers.append('GET', 'POST', 'OPTIONS');
headers.append('Authorization', 'Basic ' + base64.encode(username + ":" + password));
fetch(sign_in, {
//mode: 'no-cors',
credentials: 'include',
method: 'POST',
headers: headers
})
.then(response => response.json())
.then(json => console.log(json))
.catch(error => console.log('Authorization failed : ' + error.message));
}
Chrome kullanıyorum. Chrome CORS Eklentisini kullanmayı da denedim, ancak o zaman başka bir hata mesajı alıyorum:
Yanıttaki 'Access-Control-Allow-Origin' başlığının değeri istek'kimlik bilgileri modu olduğunda '*' joker karakteri olmamalıdır 'şunları içerir'. Köken 'http://127.0.0.1:3000' bu nedenle izin verilmez erişim. tarafından başlatılan isteklerin kimlik bilgileri modu XMLHttpRequest, withCredentials niteliği tarafından kontrol edilir.
Bu cevap çok geniş bir alanı kapsamaktadır, bu nedenle üç bölüme ayrılmıştır:
CORS ön uçuşundan nasıl kaçınılır "Access-Control-Allow-Origin başlığı joker karakter olmamalıdır " sorunları nasıl düzeltilir
*"Access-Control-Allow-Origin başlığı yok " sorunlarını aşmak için bir CORS proxy'si nasıl kullanılır** Ön uç JavaScript kodunuzun istek gönderdiği sunucuyu kontrol etmiyorsanız ve bu sunucudan gelen yanıtla ilgili sorun yalnızca gerekli
Access-Control-Allow-Origin
başlığının olmamasıysa, isteği bir CORS proxy aracılığıyla yaparak yine de işlerin yürümesini sağlayabilirsiniz. Bunun nasıl çalıştığını göstermek için, önce CORS proxy kullanmayan bazı kodları burada bulabilirsiniz:Catch
bloğunun oraya çarpmasının nedeni, tarayıcının bu kodun
https://example.comadresinden geri gelen yanıta erişmesini engellemesidir. Tarayıcının bunu yapmasının nedeni, yanıtın
Access-Control-Allow-Origin` yanıt başlığından yoksun olmasıdır. Şimdi, burada tam olarak aynı örnek var ama sadece bir CORS proxy eklenmiş:Not: Eğer https://cors-anywhere.herokuapp.com denediğinizde kapalı veya kullanılamıyorsa, Heroku'da kendi CORS Anywhere sunucunuzu sadece 2-3 dakika içinde nasıl dağıtacağınızı öğrenmek için aşağıya bakın. Yukarıdaki ikinci kod parçacığı yanıta başarıyla erişebilir çünkü istek URL'sini alıp https://cors-anywhere.herokuapp.com/https://example.com-by olarak değiştirmek ve önüne proxy URL'sini eklemek isteğin bu proxy üzerinden yapılmasına neden olur:
https://example.com
adresine yönlendirir.https://example.com
adresinden alır.Access-Control-Allow-Origin
başlığını ekler.Access-Control-Allow-Origin
yanıt başlığını içeren bu yanıt tarayıcının gördüğü yanıttır. https://github.com/Rob--W/cors-anywhere/.Eğer
OPTIONS' yanıtı bu başlıkları içermiyorsa, tarayıcı burada duracak ve
POST' isteğini göndermeyi asla denemeyecektir. Ayrıca, yanıt için HTTP durum kodu 2xx (genellikle 200 veya 204) olmalıdır. Eğer başka bir durum kodu ise, tarayıcı orada duracaktır. Sorudaki sunucuOPTIONS' isteğine 501 durum koduyla yanıt veriyor, bu da görünüşe göre
OPTIONS' istekleri için destek uygulamadığını belirtmeye çalıştığı anlamına geliyor. Diğer sunucular bu durumda genellikle 405 "Method not allowed" durum koduyla yanıt verir. Dolayısıyla, sunucuOPTIONS
isteğine 405 veya 501 ya da 200 veya 204 dışında bir yanıt verirse veya bu gerekli yanıt başlıklarıyla yanıt vermezse, ön uç JavaScript kodunuzdan doğrudan bu sunucuyaPOST
istekleri yapamazsınız. Sorudaki durum için bir ön kontrol tetiklemekten kaçınmanın yolu şöyle olacaktır:Yetkilendirme
istek başlığı gerektirmiyorsa, bunun yerine (örneğin)POST
isteğinin gövdesine veya bir sorgu parametresi olarak gömülü kimlik doğrulama verilerine güveniyorsaSunucu
POST
gövdesinin birContent-Type: application/json
medya türüne sahip olmasını gerektirmiyorsa, bunun yerinePOST
gövdesini değeri JSON verisi olanjson
(veya başka bir şey) adlı bir parametre ileapplication/x-www-form-urlencoded
olarak kabul ediyorsa*"Access-Control-Allow-Origin başlığı joker karakter olmamalıdır " sorunları nasıl düzeltilir** Başka bir hata mesajı alıyorum:
Ancak bu sadece bir örnektir; diğer (web) sunucu sistemleri de orijin değerlerini yankılamak için benzer yollar sağlar.
Şu çizgileri kaldırın. Erişim Kontrolü İzin Ver- başlıkları yanıt* başlıklarıdır. Bunları asla bir istek içinde göndermek istemezsiniz. Bunun tek etkisi bir tarayıcıyı ön kontrol yapması için tetiklemek olacaktır.
Bu hata, port numarası da dahil olmak üzere istemci URL'si ve sunucu URL'si eşleşmediğinde ortaya çıkar. Bu durumda, çapraz kaynak paylaşımı olan CORS için hizmetinizi etkinleştirmeniz gerekir.
Bir Spring REST hizmeti barındırıyorsanız, bunu Spring Framework'te CORS desteği blog yazısında bulabilirsiniz.
Node.js sunucusu kullanarak bir hizmet barındırıyorsanız
Node.js sunucusunu durdurun.
npm install cors --save
Aşağıdaki satırları server.js dosyanıza ekleyin
var cors = require('cors')
app.use(cors()) // Bunu değişken bildiriminden sonra kullanın
Kaldır şunu: