How to make network requests in Dart
Fetch data from APIs using Dart's built-in http package
Add the http package
GET request
import 'package:http/http.dart' as http;
import 'dart:convert';
Future<void> fetchUsers() async {
final response = await http.get(Uri.parse('https://api.example.com/users'));
if (response.statusCode == 200) {
final List<dynamic> data = jsonDecode(response.body);
for (var user in data) {
print(user['name']);
}
} else {
throw Exception('Failed to load users: ${response.statusCode}');
}
}
POST request
Future<void> createUser() async {
final response = await http.post(
Uri.parse('https://api.example.com/users'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({'name': 'Ada', 'age': 30}),
);
if (response.statusCode == 201) {
final data = jsonDecode(response.body);
print('Created user with id: ${data['id']}');
} else {
throw Exception('Failed to create user: ${response.statusCode}');
}
}
PUT, PATCH, DELETE
// PUT — replace entire resource
final putResponse = await http.put(
Uri.parse('https://api.example.com/users/1'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({'name': 'Ada Lovelace', 'age': 31}),
);
// PATCH — partial update
final patchResponse = await http.patch(
Uri.parse('https://api.example.com/users/1'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({'age': 31}),
);
// DELETE
final deleteResponse = await http.delete(
Uri.parse('https://api.example.com/users/1'),
);
Handle errors
Future<void> safeFetch() async {
try {
final response = await http
.get(Uri.parse('https://api.example.com/data'))
.timeout(Duration(seconds: 10));
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
print(data);
} else {
print('Error: ${response.statusCode}');
}
} on TimeoutException {
print('Request timed out');
} on SocketException {
print('No internet connection');
} catch (e) {
print('Unexpected error: $e');
}
}