HTTP CRUD (HttpClient)
Базовые операции CRUD
| Операция | Назначение | HTTP-метод |
|---|---|---|
| Create | Создание нового ресурса | POST |
| Read | Чтение/получение ресурса | GET |
| Update | Полное обновление ресурса | PUT |
| Delete | Удаление ресурса | DELETE |
PATCH vs PUT: Существует еще один метод, PATCH, который используется для частичного обновления ресурса. Например, если нужно изменить только название поста, а не все его поля. PUT же подразумевает полную замену ресурса.
Важно
Внимательно читайте все комментарии к примерам кода ниже
1. GET Запрос - получаем данные по API
Dart
// Выполняет GET запрос и выводит полученные данные.
Future<void> getData(String url) async {
final client = HttpClient();
try {
final request = await client.getUrl(Uri.parse(url));
final response = await request.close();
if (response.statusCode == HttpStatus.ok) {
final responseBody = await response.transform(utf8.decoder).join();
// responseBody содержит тело ответа в виде строки
// jsonDecode преобразует строку JSON в объект (Map или List)
print(jsonDecode(responseBody));
} else {
print('Ошибка при GET запросе. Статус код: $url: ${response.statusCode}');
}
} catch (e) {
print('GET Exception $url: $e');
} finally {
client.close();
}
}
Dart
import 'dart:convert';
import 'dart:io';
void main() async {
final baseUrl = 'https://jsonplaceholder.typicode.com';
await getData('$baseUrl/posts/1'); // получаем данные 1го поста
}
Вывод
{
userId: 1,
id: 1,
title: sunt aut facere repellat provident occaecati excepturi optio,
body: quia et suscipit suscipit recusandae consequuntur expedita et cum
}
2. POST Запрос - отправляем данные по API на сервер
Dart
/// POST запрос для отправки данных
Future<void> postData(String url, Map<String, dynamic> data) async {
final client = HttpClient();
try {
// client.postUrl() - создает POST-запрос
// Uri.parse(url) - преобразует строку URL в объект Uri
// URL это просто строка, Uri структурированный доступ к URL компонентам,
final request = await client.postUrl(Uri.parse(url));
// Устанавливаем заголовки
request.headers.set(HttpHeaders.contentTypeHeader, 'application/json');
// Преобразует объект data в строку JSON и записывает (отправляет)
// эту строку в тело HTTP-запроса
request.write(jsonEncode(data));
final response = await request.close();
// HttpStatus.created - код состояния 201 Created для POST
if (response.statusCode == HttpStatus.created) {
final responseBody = await response.transform(utf8.decoder).join();
print(jsonDecode(responseBody));
} else {
print('Ошибка при POST запросе. Статус код: $url: ${response.statusCode}');
final errorBody = await response.transform(utf8.decoder).join();
print('Ошибка в теле: $errorBody');
}
} catch (e) {
print('POST Exception for $url: $e');
} finally {
client.close();
}
}
Dart
import 'dart:convert';
import 'dart:io';
void main() async {
final baseUrl = 'https://jsonplaceholder.typicode.com';
// 1. GET запрос для получения данных
await getData('$baseUrl/posts/1'); // получаем данные 1го поста
// 2. POST запрос для отправки данных
final newPost = {
'title': 'HTTP Requests',
'body': ' GET POST PUT DELETE',
'userId': 1,
};
await postData('$baseUrl/posts', newPost);
}
Вывод
{
title: HTTP Requests,
body: GET POST PUT DELETE,
userId: 1,
id: 101
}
3. PUT Запрос - обновляет данные по API на сервере
Dart
/// PUT запрос для обновления данных.
Future<void> putData(String url, Map<String, dynamic> data) async {
final client = HttpClient();
try {
final request = await client.putUrl(Uri.parse(url));
request.headers.set(HttpHeaders.contentTypeHeader, 'application/json');
request.write(jsonEncode(data));
final response = await request.close();
if (response.statusCode == HttpStatus.ok) {
final responseBody = await response.transform(utf8.decoder).join();
print(jsonDecode(responseBody));
} else {
print('Ошибка при PUT запросе. Статус код: $url: ${response.statusCode}');
final errorBody = await response.transform(utf8.decoder).join();
print('Ошибка в теле: $errorBody');
}
} catch (e) {
print('PUT Exception $url: $e');
} finally {
client.close();
}
}
Dart
import 'dart:convert';
import 'dart:io';
void main() async {
final baseUrl = 'https://jsonplaceholder.typicode.com';
// 1. GET запрос для получения данных
await getData('$baseUrl/posts/1'); // получаем данные 1го поста
// 2. POST запрос для отправки данных
final newPost = {
'title': 'HTTP Requests',
'body': ' GET POST PUT DELETE',
'userId': 1,
};
await postData('$baseUrl/posts', newPost);
// 3. PUT запрос для обновления данных
final updatedPost = {
'id': 1, // Важно указать ID для обновления
'title': '1234',
'body': '7777777777',
'userId': 1,
};
await putData('$baseUrl/posts/1', updatedPost);
}
Вывод
{
id: 1,
title: 1234,
body: 7777777777,
userId: 1
}
4. DELETE Запрос - удаляет данные по API на сервере
Dart
/// DELETE запрос для удаления данных.
Future<void> deleteData(String url) async {
final client = HttpClient();
try {
// client.deleteUrl() - создает DELETE-запрос
final request = await client.deleteUrl(Uri.parse(url));
final response = await request.close();
if (response.statusCode == HttpStatus.ok) {
print('Всё успешно удалёно');
} else {
print('Ошибка при DELETE запросе. Статус код: $url:${response.statusCode}');
}
} catch (e) {
print('DELETE Exception $url: $e');
} finally {
client.close();
}
}
Dart
import 'dart:convert';
import 'dart:io';
void main() async {
final baseUrl = 'https://jsonplaceholder.typicode.com';
// 1. GET запрос для получения данных
await getData('$baseUrl/posts/1');
// 2. POST запрос для отправки данных
final newPost = {
'title': 'HTTP Requests',
'body': ' GET POST PUT DELETE',
'userId': 1,
};
await postData('$baseUrl/posts', newPost);
// 3. PUT запрос для обновления данных
final updatedPost = {
'id': 1, // Важно указать ID для обновления
'title': '1234',
'body': '7777777777',
'userId': 1,
};
await putData('$baseUrl/posts/1', updatedPost);
// 4. DELETE запрос для удаления данных
await deleteData('$baseUrl/posts/1');
}
Вывод
Всё успешно удалёно