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:
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();