cupertino_http 2.0.1 copy "cupertino_http: ^2.0.1" to clipboard
cupertino_http: ^2.0.1 copied to clipboard

PlatformiOSmacOS

A macOS/iOS Flutter plugin that provides access to the Foundation URL Loading System.

pub package package publisher

A macOS/iOS Flutter plugin that provides access to the Foundation URL Loading System.

Motivation #

Using the Foundation URL Loading System, rather than the socket-based dart:io HttpClient implementation, has several advantages:

  1. It automatically supports iOS/macOS platform features such VPNs and HTTP proxies.
  2. It supports many more configuration options such as only allowing access through WiFi and blocking cookies.
  3. It supports more HTTP features such as HTTP/3 and custom redirect handling.

Using #

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();
59
likes
150
points
54k
downloads

Publisher

verified publisherdart.dev

Weekly Downloads

A macOS/iOS Flutter plugin that provides access to the Foundation URL Loading System.

Repository (GitHub)
View/report issues
Contributing

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

async, ffi, flutter, http, http_profile, objective_c, web_socket

More

Packages that depend on cupertino_http