freeCodeCamp/curriculum/challenges/ukrainian/05-back-end-development-and.../back-end-development-and-ap.../url-shortener-microservice.md

4.9 KiB
Raw Blame History

id title challengeType forumTopicId dashedName
bd7158d8c443edefaeb5bd0e Мікросервіс скорочування URL-адрес 4 301509 url-shortener-microservice

--description--

Створіть повний пакет додатку на JavaScript, який функціонально схожий до цього:https://url-shortener-microservice.freecodecamp.rocks/. Робота над цим проєктом включатиме написання коду одним із таких методів:

По завершенню переконайтеся, що працююча демо-версія вашого проекту розміщена у відкритому доступі. Потім введіть його URL-адресу в поле Solution Link. За бажанням також можете ввести посилання на вихідний код вашого проєкту в полі GitHub Link.

--instructions--

ПІДКАЗКА: не забудьте використовувати проміжне програмне забезпечення body parsing для обробки запитів POST. Також ви можете використовувати функцію dns.lookup(host, cb) з основного модуля dns для перевірки надісланої URL-адреси.

--hints--

Вам необхідно вказати свій власний проект, а не приклад URL-адреси.

(getUserInput) => {
  assert(
    !/.*\/url-shortener-microservice\.freecodecamp\.rocks/.test(
      getUserInput('url')
    )
  );
};

Ви можете POST URL до /api/shorturl та отримати відповідь JSON з властивостями original_url і short_url. Ось приклад: { original_url : 'https://freeCodeCamp.org', short_url : 1}

async (getUserInput) => {
  const url = getUserInput('url');
  const urlVariable = Date.now();
  const fullUrl = `${url}/?v=${urlVariable}`
  const res = await fetch(url + '/api/shorturl', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: `url=${fullUrl}`
  });
  if (res.ok) {
    const { short_url, original_url } = await res.json();
    assert.isNotNull(short_url);
    assert.strictEqual(original_url, `${url}/?v=${urlVariable}`);
  } else {
    throw new Error(`${res.status} ${res.statusText}`);
  }
};

Коли ви відкриєте /api/shorturl/<short_url>, вас буде перенаправлено на оригінальне URL.

async (getUserInput) => {
  const url = getUserInput('url');
  const urlVariable = Date.now();
  const fullUrl = `${url}/?v=${urlVariable}`
  let shortenedUrlVariable;
  const postResponse = await fetch(url + '/api/shorturl', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: `url=${fullUrl}`
  });
  if (postResponse.ok) {
    const { short_url } = await postResponse.json();
    shortenedUrlVariable = short_url;
  } else {
    throw new Error(`${postResponse.status} ${postResponse.statusText}`);
  }
  const getResponse = await fetch(
    url + '/api/shorturl/' + shortenedUrlVariable
  );
  if (getResponse) {
    const { redirected, url } = getResponse;
    assert.isTrue(redirected);
    assert.strictEqual(url,fullUrl);
  } else {
    throw new Error(`${getResponse.status} ${getResponse.statusText}`);
  }
};

Якщо ви введете недійсний URL, який не відповідає дійсному формату http://www.example.com , то відповідь JSON буде містити { error: 'invalid url' }

async (getUserInput) => {
  const url = getUserInput('url');
  const res = await fetch(url + '/api/shorturl', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: `url=ftp:/john-doe.invalidTLD`
  });
  if (res.ok) {
    const { error } = await res.json();
    assert.isNotNull(error);
    assert.strictEqual(error.toLowerCase(), 'invalid url');
  } else {
    throw new Error(`${res.status} ${res.statusText}`);
  }
};

--solutions--

/**
  Backend challenges don't need solutions, 
  because they would need to be tested against a full working project. 
  Please check our contributing guidelines to learn more.
*/