ηλί, ηλί, λαμά σαβαχθανί!?
Rest API fråga
Hej!
Försöker komma åt json-filen från ett API. Jag kan se den helt och hållet att allt fungerar som det ska när jag går in på urln med rätt via webbläsaren som vilken adress som helst.
Använder en mall för ajax anrop från andra små projekt så det bör fungera. Men jag får felmeddelandet i konsolen hela tiden: Access to XMLHttpRequest at 'api-urln' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Koden jag använder är (har bytt ut min url då den har privata nycklar osv i sig):
function requestData () {
var request = new XMLHttpRequest()
request.open('GET', 'api-urln', true)
request.send(null)
request.onreadystatechange = function () {
if (request.readyState === 4 && request.status === 200) {
showInformation(request.responseText)
}
}
}
function showInformation (response) {
response = JSON.parse(response)
console.log(response)
}
Någon som har någon aning om varför det inte fungerar för mig? tack på förhand!
Du kan testa lägga till,
request.withCredentials = true;
Innan du skickar din request.
Någon anledning till att du använder xhr över fetch?
CORS har att göra med att du försöker kontakta en domän som inte ligger på den du kontaktar från. Browsern blockerar sådanna requests av säkerhetsskäl.
Exempel med fetch:
async function fetchJSONData(url)
{
const res = await fetch(url);
const json = await res.json();
return json;
}
Hej!
Försöker komma åt json-filen från ett API. Jag kan se den helt och hållet att allt fungerar som det ska när jag går in på urln med rätt via webbläsaren som vilken adress som helst.
Använder en mall för ajax anrop från andra små projekt så det bör fungera. Men jag får felmeddelandet i konsolen hela tiden: Access to XMLHttpRequest at 'api-urln' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Koden jag använder är (har bytt ut min url då den har privata nycklar osv i sig):
function requestData () {
var request = new XMLHttpRequest()
request.open('GET', 'api-urln', true)
request.send(null)
request.onreadystatechange = function () {
if (request.readyState === 4 && request.status === 200) {
showInformation(request.responseText)
}
}
}
function showInformation (response) {
response = JSON.parse(response)
console.log(response)
}
Någon som har någon aning om varför det inte fungerar för mig? tack på förhand!
Det fungerar inte för att Javascript (browsers) tvingar en strikt CORS, mer specifikt Access-Control-Allow-Origin.
Det går att komma runt på flera sätt men allt är egentligen ganska komplicerat förutom JSONP och kanske iframe-meckande, vilket har sina nackdelar för sig. Att lägga in ACAO på servern är det rätta svaret, att göra en egenmeckad proxy ett alternativt svar.
Rent generellt kan man säga att de som har skrivit APIet inte vill att man använder client-side Javascript för att anropa/använda det.
Detta förstärks mer eftersom din url har koder/nycklar i sig vilket inte är lämpligt att ha client-side då vem som helst då kan få tag på dessa.
Om du enbart gör detta för något test så kan man starta browsern i "osäkert läge" vilket tillåter att man går runt dessa CORS-restriktioner.
Det fungerar inte för att Javascript (browsers) tvingar en strikt CORS, mer specifikt Access-Control-Allow-Origin.
Det går att komma runt på flera sätt men allt är egentligen ganska komplicerat förutom JSONP och kanske iframe-meckande, vilket har sina nackdelar för sig. Att lägga in ACAO på servern är det rätta svaret, att göra en egenmeckad proxy ett alternativt svar.
Rent generellt kan man säga att de som har skrivit APIet inte vill att man använder client-side Javascript för att anropa/använda det.
Detta förstärks mer eftersom din url har koder/nycklar i sig vilket inte är lämpligt att ha client-side då vem som helst då kan få tag på dessa.
Om du enbart gör detta för något test så kan man starta browsern i "osäkert läge" vilket tillåter att man går runt dessa CORS-restriktioner.
Oj låter väldigt mycket mer avancerat än vad jag har förståelse för... Men jag tackar så mycket för informationen!
- Idag Iphones marknadsandel faller i USA 15
- Igår Airtec Pro Type1 – batteridrivet alternativ till tryckluft på burk 48
- Igår Nu stiger hårddiskpriserna med uppemot 10 procent 15
- Igår Analytiker: Apple har överskattat intresset för Vision Pro 50
- 24 / 4 AMD, Nvidia och Intel – vad är det för skillnad mellan grafikkortstillverkarna? 28
- Telenors router och netgear sammankopplade5
- Nintendo-innehåll tas bort från Garrys Mod21
- Microsoft rullar ut Startmenyreklam till alla63
- LLama3 eller "Hur kan en språkmodell stapla saker?"42
- Tråden om PlayStation 514598
- Rabbel.se - Ett dagligt ordspel711
- Airtec Pro Type1 – batteridrivet alternativ till tryckluft på burk48
- Elbilar - Tråden för intresserade23178
- Epic games nere?2
- Herman Miller X Logitech G Embody Gaming Chair, recension?117
- Säljes i3-8100
- Köpes Luftkylning och Fläktar
- Köpes Nvidia Quadro P400,600 eller 620
- Säljes Dell Latitude 7530 15,6”
- Köpes Önskar köpa 6700xt eller 3070
- Säljes Asus Geforce RTX 2070 8GB Strix Gaming OC
- Köpes Köper bärbara datorer, trasiga, utan skärm etc.
- Säljes Lenovo Thinkcentre M73
- Säljes Lenovo Legion Slim 5 14” OLED
- Säljes Asus VG248 24"
- Iphones marknadsandel faller i USA15
- Konsumentverket granskar tio nätbutiker som lurat kunder14
- Airtec Pro Type1 – batteridrivet alternativ till tryckluft på burk48
- Nintendo-innehåll tas bort från Garrys Mod21
- Nu stiger hårddiskpriserna med uppemot 10 procent15
- Quiz: Vad kan du om Inet?68
- Analytiker: Apple har överskattat intresset för Vision Pro50
- Microsoft rullar ut Startmenyreklam till alla63
- EU röstar igenom ”rätten att reparera”53
- Viaplay sätter ner foten mot delade konton55