A macOS/iOS Flutter plugin that provides access to the Foundation URL Loading System.
Using the Foundation URL Loading System, rather than the socket-based dart:io HttpClient implementation, has several advantages:
- It automatically supports iOS/macOS platform features such VPNs and HTTP proxies.
- It supports many more configuration options such as only allowing access through WiFi and blocking cookies.
- It supports more HTTP features such as HTTP/3 and custom redirect handling.
The easiest way to use this library is via the high-level interface defined by package:http Client.
This approach allows the same HTTP code to be used on all platforms, while still allowing platform-specific setup.
import 'package:cupertino_http/cupertino_http.dart';
import 'package:http/http.dart';
import 'package:http/io_client.dart';
void main() async {
final Client httpClient;
if (Platform.isIOS || Platform.isMacOS) {
final config = URLSessionConfiguration.ephemeralSessionConfiguration()
..cache = URLCache.withCapacity(memoryCapacity: 2 * 1024 * 1024)
..httpAdditionalHeaders = {'User-Agent': 'Book Agent'};
httpClient = CupertinoClient.fromSessionConfiguration(config);
} else {
httpClient = IOClient(HttpClient()..userAgent = 'Book Agent');
}
final response = await client.get(Uri.https(
'www.googleapis.com',
'/books/v1/volumes',
{'q': 'HTTP', 'maxResults': '40', 'printType': 'books'}));
}
CupertinoWebSocket provides a package:web_socket WebSocket implementation.
import 'package:cupertino_http/cupertino_http.dart';
import 'package:web_socket/web_socket.dart';
void main() async {
final socket = await CupertinoWebSocket.connect(
Uri.parse('wss://ws.postman-echo.com/raw'));
socket.events.listen((e) async {
switch (e) {
case TextDataReceived(text: final text):
print('Received Text: $text');
await socket.close();
case BinaryDataReceived(data: final data):
print('Received Binary: $data');
case CloseReceived(code: final code, reason: final reason):
print('Connection to server closed: $code [$reason]');
}
});
}
You can also use the Foundation URL Loading System API directly.
final url = Uri.https(
'www.googleapis.com',
'/books/v1/volumes',
{'q': 'HTTP', 'maxResults': '40', 'printType': 'books'});
final session = URLSession.sharedSession();
final task = session.dataTaskWithCompletionHandler(URLRequest.fromUrl(url),
(data, response, error) {
if (error == null && response!.statusCode == 200) {
print(data!.bytes);
}
});
task.resume();