Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 110 additions & 0 deletions src/content/docs/ru/guides/data-fetching.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
---
title: Получение данных
description: Узнайте, как получать удалённые данные в Astro с помощью fetch API.
i18nReady: true
---

Файлы `.astro` могут получать удалённые данные, которые помогут вам генерировать страницы.

## `fetch()` в Astro

Все [компоненты Astro](/ru/basics/astro-components/) имеют доступ к [глобальной функции `fetch()`](https://developer.mozilla.org/ru/docs/Web/API/Window/fetch) в скрипте компонента, чтобы выполнять HTTP-запросы к API по полному URL (например, `https://example.com/api`).
Кроме того, с помощью [`new URL("/api", Astro.url)`](/ru/reference/api-reference/#url) можно построить URL к страницам и эндпойнтам вашего проекта, которые рендерятся на сервере по запросу.

Такой вызов fetch будет выполнен во время сборки, и данные будут доступны шаблону компонента для генерации динамического HTML. Если включён режим [SSR](/ru/guides/on-demand-rendering/), все вызовы fetch будут выполняться во время работы сервера.

💡 Используйте [**`await` верхнего уровня**](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/await#top_level_await) в скрипте компонента Astro.

💡 Передавайте полученные данные как пропсы и в компоненты Astro, и в компоненты фреймворков.

```astro /await fetch\\(.*?\\);/
---
// src/components/User.astro
import Contact from "../components/Contact.jsx";
import Location from "../components/Location.astro";

const response = await fetch("https://randomuser.me/api/");
const data = await response.json();
const randomUser = data.results[0];
---
<!-- Данные, полученные при сборке, можно отрендерить в HTML -->
<h1>Пользователь</h1>
<h2>{randomUser.name.first} {randomUser.name.last}</h2>

<!-- Данные, полученные при сборке, можно передать компонентам как пропсы -->
<Contact client:load email={randomUser.email} />
<Location city={randomUser.location.city} />
```

:::note
Помните: все данные в компонентах Astro запрашиваются в момент рендеринга компонента.

Развёрнутый сайт Astro запрашивает данные **один раз, во время сборки**. В режиме разработки запросы данных происходят при обновлении компонентов. Если данные нужно многократно запрашивать на стороне клиента, используйте в компоненте Astro [компонент фреймворка](/ru/guides/framework-components/) или [клиентский скрипт](/ru/guides/client-side-scripts/).
:::

## `fetch()` в компонентах фреймворков

Функция `fetch()` также глобально доступна в любых [компонентах фреймворков](/ru/guides/framework-components/):

```tsx title="src/components/Movies.tsx" /await fetch\\(.*?\\)/
import type { FunctionalComponent } from 'preact';

const data = await fetch('https://example.com/movies.json').then((response) => response.json());

// Компоненты, рендерящиеся во время сборки, выводят логи в CLI.
// При рендеринге с директивой `client:*` они выводят логи и в консоль браузера.
console.log(data);

const Movies: FunctionalComponent = () => {
// Выводим результат на страницу
return <div>{JSON.stringify(data)}</div>;
};

export default Movies;
```

## GraphQL-запросы

Astro также может использовать `fetch()` для обращения к GraphQL-серверу с любым корректным GraphQL-запросом.

```astro title="src/components/Film.astro" "await fetch"
---
const response = await fetch(
"https://swapi-graphql.netlify.app/.netlify/functions/index",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
query: `
query getFilm ($id:ID!) {
film(id: $id) {
title
releaseDate
}
}
`,
variables: {
id: "ZmlsbXM6MQ==",
},
}),
}
);


const json = await response.json();
const { film } = json.data;
---
<h1>Получаем информацию о фильме «Звёздные войны: Новая надежда»</h1>
<h2>Название: {film.title}</h2>
<p>Год: {film.releaseDate}</p>
```

## Получение данных из headless CMS

Компоненты Astro могут получать данные из вашей любимой CMS и рендерить их как содержимое страницы. С помощью [динамических маршрутов](/ru/guides/routing/#dynamic-routes) компоненты могут даже генерировать страницы на основе содержимого CMS.

Подробности об интеграции Astro с headless CMS, включая Storyblok, Contentful и WordPress, смотрите в наших [руководствах по CMS](/ru/guides/cms/).

## Ресурсы сообщества

- [Создание fullstack-приложения с Astro + GraphQL](https://robkendal.co.uk/blog/how-to-build-astro-site-with-graphql/)
Loading