
Nedaří se mi načíst odpověď přes http get
Snažím se načíst odpověď z URL https://pastebin.com/raw/5kG3bsEy
V prohlížeči Chrome to funguje OK, stejně tak v MS Edge i v klientovi Postman.
Ovšem, když se snažím tu odpověď načíst programově ve VueJS s využitím vue-resource.js, vrací mi to chybu.
Tady je kód funkce, která (ne)čte data:
getData: function(){
var url = "https://pastebin.com/raw/5kG3bsEy";
var options = {
"method" : "GET",
"followRedirects" : true,
"muteHttpExceptions": true,
};
var headers = {
"Accept": "*/*",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36",
"Host": "pastebin.com",
"Connection": "keep-alive",
"Accept-Encoding": "gzip, deflate, br"
};
console.log("loading...");
this.$http.get(url, options, headers).then(function (response) {
console.log(response.data);
this.md = response.data;
}).catch(function(error) {
console.log("Error: ", error)
});
}
A dostanu odpověď - to co si zobrazím v konzoli:
Error: { url: 'https://pastebin.com/raw/5kG3bsEy',
ok: false,
status: 0,
statusText: '',
headers: { map: { '': [Array] } },
body: '',
bodyText: '' }
Přitom ale, když si načtu ve stejné funkci (!) URL třeba https://api.coindesk.com/v1/bpi/currentprice.json, pak dostanu odpověď s daty.
Věděl by někdo, kde je chyba? Mám něco v kódu špatně? Nebo mi prostě protistrana, tj. https://pastebin.com/raw/5kG3bsEy schválně vrací chybu?
Už si fakt nevím rady...
V pastebinu máš text, v tom druhom odkaze JSON... resp.data v Axiosu standardne odkazuje na objekt, což v tvojom textovom súbore neexistuje.
Ďalšia vec sú hlavičky, snaž sa používať len tie čo potrebuješ...
Inu, nepoužívám axios, ale vue-resource.js; ty hlavičky jsem přidával postupně právě proto, že mi to nefungovalo, zkusím to ještě jednou bez nich.
Nevěřím tomu, že by mělo vliv na odpověď z URL adresy to, zda se vrací text v plain/text nebo JSON v plain/text.
To neznám... hm... ja už som Vue prestal riešiť skôr než začal (momentálne som sa zamiloval do Svelte/Sapper, což je 5x lepší Angular)... btw, tie vue-resources používa axios, takže je to jedno. Popravdebod kedy daly do JS fetch() tak je to najlepší spôsob ako získať dáta..
inak síce to neviem, ale nezdá sa mi že i to this. by malo byť v this.$http.get() když tam máš promise, a neviem prečo je tam option get když get už voláš nad $http
On ten kód je podle všeho v principu dobře, z jiných URL tu odpověď dostanu. This je v pořádku.
no ja momentálne používam Svelte/Sapper a tieto ajax/rest veci riešim cez fetch(), skúšal som v takto JSONy z pastebinu a nemal som problém.
Vyzkoušel jsem ještě načíst místo textu objekt JSON a opět stejná chyba. Vysvětlení viz hynajs. Škoda, že mi to nefunguje.
V rychlosti jsem zkusil PHP a k úspěchu stačily tyto řádky:
Díky za ověření, v PHP ti to teda funguje dobře.
Pořád nevím co ještě udělat, abych to načetl ve svým JS; zkusil jsem to i bez posílání hlaviček a problém nadále trvá. Je to divný.
Chyba asi nebude v kódu.
Když použiju jQuery k jednoduchému
dostanu sice error, ale v Nástrojích pro vývojáře->Síť->Odpověď tu plaintext odpověď vidím .
Až teď mne napadlo podívat se do konzole a vidím vysvětlení:
Cross-Origin požadavek byl zablokován: Same Origin zásada nepovoluje načtení vzdáleného zdroje na https://pastebin.com/raw/5kG3bsEy. (Důvod: chybí hlavička CORS 'Access-Control-Allow-Origin').
Takže Javascriptem přes prohlížeč odpověď nedostaneš (leda by sis něco vypnul -ale to nevím) . Ta hlavička musí být v odpovědi.
Chyba není v knihovně ani v kódu.
Musíš použít PHP či jiný serverový jazyk.
A co zkusit použít místo
toto
Zkusil jsem https://cors.io/?https://pastebin.com/raw/5kG3bsEy i přidat hlavičku
Ale nepomohlo to.
Ta hlavička musí být v odpovědi, jak jsem psal - takže by ji tam musel přidat tvůrce pastebin.com .
On ten server i odpoví, prohlížeč odpověď dostane, ale zablokuje ji.
Možná bude skript fungovat na nějaké staré verzi prohlížeče na starém PC s XP, což je slabá útěcha.
Nevím, zda ti dost rozumím. Když tu URL adresu uadám do adresního řádku prohlížeče, normálně se mi zobrazí odpověď.
Ale tam žádost netvoříš a odpověď nečteš Javascriptem.
Podívej se, prosím, do web-konzole - určitě uvidíš něco podobného jako já, viz má odpověď nahoře 12.02.2020 10:21.
Jestli to správně chápu: Já pošlu požadavek a ten je OK, server pošle odpověď a ta je taky OK. Na mé straně se JS skript běžící v prohlížeči Chrome k odpovědi nedostane, protože dřív než se k ní dostane ji blokne právě ten Chrome. Chápu to dobře?
Ano - jinak si hlášení neumím vysvětlit.
Nejenom Chrome. Psal jsem hlášení Firefox.
V Chrome vypadá hlášení ještě jasněji takto:
Access to XMLHttpRequest at 'https://pastebin.com/raw/5kG3bsEy' from origin 'http://www.bystricky.b3.cz' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
A v Network->XHR->Response vidím Fail to load response data.
Kdežto Firefox požadovanou odpověď v Síť->Odpověď aspoň takto zobrazí, jak jsem psal výše.
https://pastebin.com/api
Připoj, prosím, ještě funkční příklad kódu v klientském Javascriptu.
Zdůraznil jsem v klientském - o něm diskuse je.
Nepochybuji, že serverový Javascript (např. Nodejs) bude úspěšný, ale o něj se tady nejedná.
Nějaké další doplňky nebo aplikace pro Firefox nebo Android najdeme na tools .
Pujde ti to pouze v PRO verzi pastebin, ta pridava CORS hlavicky.
https://pastebin.com/pro?help=1
Pokud to chces volat z klienta, musis si udelat proxy treba v PHP a do nej si prijdej CORS hlavicky. Klienta pak odkazes na tento script.
Díky za info.
Platit za to nebudu, šlo o hobby záležitost; vyřeším si to jiným způsobem.
Platit nemusis, ten proxy script muzes mit na jakemkoliv freehostinu s PHP...