Как реализуется работа с REST API или GraphQL в приложении?
Работа с REST API или GraphQL в React Native реализуется через сетевые запросы, отправляемые из JavaScript-кода в бекенд-сервер. React Native, в отличие от браузера, не использует стандартные браузерные API как XMLHttpRequest или window.fetch напрямую, но предоставляет полифиллы и совместимые библиотеки, которые делают работу с сетью практически идентичной веб-разработке.
Работа с REST API
REST (Representational State Transfer) — это архитектурный стиль, где взаимодействие между клиентом и сервером осуществляется через HTTP-запросы: GET, POST, PUT, DELETE и т.д. Ответы приходят чаще всего в формате JSON.
1. fetch — базовый способ
React Native поддерживает API fetch из коробки. Это Promise-базированный способ отправки HTTP-запросов.
useEffect(() => {
fetch('https://api.example.com/posts')
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => console.error(error));
}, \[\]);
Пример с POST-запросом
fetch('https://api.example.com/posts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ title: 'Новая запись', content: 'Содержимое' }),
});
2. Использование библиотеки axios
axios — более мощная альтернатива fetch, поддерживает interceptors, автоматическое преобразование данных и обработку ошибок.
Установка:
npm install axios
Пример запроса:
import axios from 'axios';
useEffect(() => {
axios.get('https://api.example.com/posts')
.then(response => setPosts(response.data))
.catch(error => console.error(error));
}, \[\]);
POST-запрос:
axios.post('https://api.example.com/posts', {
title: 'Новая запись',
content: 'Текст записи'
});
Интерсепторы:
axios.interceptors.request.use(config => {
config.headers.Authorization = \`Bearer ${token}\`;
return config;
});
3. Хранение и использование токенов
Для аутентификации с API часто используют JWT или OAuth-токены. Их можно хранить с помощью AsyncStorage:
npm install @react-native-async-storage/async-storage
import AsyncStorage from '@react-native-async-storage/async-storage';
await AsyncStorage.setItem('token', 'abc123');
const token = await AsyncStorage.getItem('token');
Работа с GraphQL
GraphQL — это язык запросов к API, позволяющий запрашивать только необходимые поля и объединять несколько ресурсов в одном запросе.
1. Установка Apollo Client
Apollo — наиболее популярная библиотека для работы с GraphQL в React и React Native.
Установка:
npm install @apollo/client graphql
Создание клиента:
import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';
const client = new ApolloClient({
uri: 'https://api.example.com/graphql',
cache: new InMemoryCache(),
});
Обёртка ApolloProvider:
<ApolloProvider client={client}>
<App />
</ApolloProvider>
2. Выполнение запроса
import { gql, useQuery } from '@apollo/client';
const GET_POSTS = gql\`
query {
posts {
id
title
content
}
}
\`;
const Posts = () => {
const { loading, error, data } = useQuery(GET_POSTS);
if (loading) return <Text>Загрузка...</Text>;
if (error) return <Text>Ошибка: {error.message}</Text>;
return (
<View>
{data.posts.map(post => (
<Text key={post.id}>{post.title}</Text>
))}
</View>
);
};
3. Отправка мутаций (POST-запросов)
import { useMutation, gql } from '@apollo/client';
const ADD_POST = gql\`
mutation AddPost($title: String!, $content: String!) {
addPost(title: $title, content: $content) {
id
title
}
}
\`;
const AddPostButton = () => {
const \[addPost, { data }\] = useMutation(ADD_POST);
return (
<Button
title="Добавить"
onPress={() =>
addPost({ variables: { title: 'Заголовок', content: 'Текст' } })
}
/>
);
};
4. Управление кэшом Apollo
Apollo кэширует полученные данные и повторно их использует:
client.cache.readQuery({ query: GET_POSTS });
client.cache.writeQuery({
query: GET_POSTS,
data: { posts: \[...oldPosts, newPost\] }
});
Обработка ошибок и состояний
Состояния загрузки
if (loading) return <ActivityIndicator />;
if (error) return <Text>Ошибка!</Text>;
Примеры на практике
REST: получение данных о пользователе
useEffect(() => {
const loadUser = async () => {
try {
const res = await axios.get('https://api.example.com/user');
setUser(res.data);
} catch (e) {
console.error(e);
}
};
loadUser();
}, \[\]);
GraphQL: добавление комментария
const ADD_COMMENT = gql\`
mutation AddComment($postId: ID!, $content: String!) {
addComment(postId: $postId, content: $content) {
id
content
}
}
\`;
Работа с авторизацией
REST
axios.get('/profile', {
headers: {
Authorization: \`Bearer ${token}\`
}
});
GraphQL
const client = new ApolloClient({
uri: 'https://api.example.com/graphql',
request: async (operation) => {
const token = await AsyncStorage.getItem('token');
operation.setContext({
headers: {
Authorization: \`Bearer ${token}\`
}
});
},
cache: new InMemoryCache()
});
Повтор запросов и обновление
-
В REST можно использовать axios-retry или вручную реализовать повтор при ошибках.
-
В GraphQL можно применять refetch() или pollInterval.
Инструменты отладки
-
Reactotron — поддерживает отслеживание сетевых запросов
-
Flipper — отладка через плагин Network и Apollo DevTools
-
Chrome DevTools — можно использовать через debug JS remotely
Работа в оффлайн-режиме
-
Храните данные в AsyncStorage или SQLite
-
Используйте библиотеки:
-
react-query — кэш, refetch, фоновая синхронизация
-
[apollo-link-offline] — кэш GraphQL и работа в оффлайн
-
Дополнительные библиотеки
REST
-
react-query — асинхронный data layer
-
swr — стратегия cache-first
-
axios-cache-interceptor — кэширование запросов
GraphQL
-
urql — лёгкая альтернатива Apollo
-
graphql-request — минималистичная библиотека
-
Relay — масштабируемый GraphQL-клиент от Meta
Работа с API в React Native строится на асинхронных запросах к серверу с последующей обработкой ответов. Для REST чаще применяются fetch или axios, для GraphQL — Apollo Client или urql. В обоих случаях важно учитывать управление состояниями, кэшированием, авторизацией и ошибками, а также оптимизировать работу с сетью и данными для обеспечения высокой отзывчивости и надёжности приложения.