Скачать строку по URL

Хочу сделать так:

    const url = "www.ya.ru";
    fetch(url, {mode: "no-cors"}).then(resp => resp.json()).then(d => console.log(d));

Получаю ошибку: Uncaught (in promise) SyntaxError: Unexpected end of input
Если убрать {mode: "no-cors"} тогда ругается другой ошибкой. Что-то про то что у меня локальный сервер не httpsный :man_shrugging:

Так смотрите что происходит, куда какой запрос идет.

Тут получается относительный URL типа https://www.programmersforum.rocks/t/skachat-stroku-po-url/5114/www.ya.ru. Надо https://ya.ru

Вот такой код работает:

btnDownload.onclick = () => {
    const url = "https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits";
    if (url === "") {
        return;
    }
    httpGet(url);
}

async function httpGet(url) {
    const r = await fetch(url);
    console.log(r.status);
}

Если ввести другую ссылку, например на страницу видосика с ютуба, выдаёт:
Access to fetch at 'https://www.youtube.com/watch?v=7szcXCT-Oqw' from origin 'http://127.0.0.1:5500' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
Если добавить no-cors - выдаёт код ошибки 0 на все ссылки.

no-cors не поможет, с ним браузер не даст прочитать ответ.

Надо не в браузере это делать.

А в браузере как? Почему одна ссылка работает, а другая нет?

Для первой её сервер указал, что можно запрашивать скриптами с любых сайтов.

image

Ютуб это не сделал.

CORS же нужен чтоб JS любого сайта не мог например получить страницы других сайтов, где пользователь залогинен и т.д., и как-то вредоносно использовать эти данные.

А почему нельзя вручную передать этот заголовок?

Так его передает сервер, к которому запрос, а не клиент. И браузер его проверяет. Иначе в чем смысл, каждый сам себе мог бы разрешить всё.

Почему тогда всяким левым скачивалкам разрешают?

Каким? Они скорее всего скачивают на своем сервере, а не браузером.

ну например из C#. Можно почти без ограничений скачивать любые страницы.

А почему сюда не идет запрос? :thinking:
https://www.youtube.com/youtubei/v1/player
Там же нет этого заголовка.

Так я ж говорю

при запросе не из скрипта на странице в браузере таких проблем нет. Так же как можно зайти куда угодно введя адрес в строку браузера.
CORS защищает пользователей браузера, а не содержимое сайта.

По умолчанию всё запрещено.

ой, блин, перепутал :man_facepalming: Разрешено это же когда заголовок есть.

Провернул небольшое читерство, чтобы запросы работали. Теперь код такой:

btnDownload.onclick = () => {
    const url = inputUrl.value;
    if (url === "") {
        return;
    }
    const response = getVideoInfo(url);
    if (response !== null) {
        console.log(response);
    }
}

async function getVideoInfo(videoId) {
    const serverIp = "127.0.0.1:5555";
    const url = `http://${serverIp}/video/${videoId}`;
    const r = await fetch(url);
    console.log(r.status);
    return r.status == 200 ? r.text() : null;;
}

r.text() выдаёт это:
Снимок экрана 2023-03-14 182730

Как правильно прочитать ответ? И почему ответ раньше выводится? :thinking:

await r.text()

:thinking: вроде уже так пробовал и не работало :man_shrugging: Но сейчас норм :+1: