tree: 09e265bee02a58691755b9500a2459559820dc47 [path history] [tgz]
  1. example/
  2. img/
  3. ios/
  4. lib/
  5. macos/
  6. src/
  7. .gitattributes
  8. .gitignore
  9. .metadata
  10. CHANGELOG.md
  11. cupertino_http.iml
  12. DEVELOPMENT.md
  13. ffigen.yaml
  14. LICENSE
  15. pubspec.yaml
  16. README.md
pkgs/cupertino_http/README.md

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 implemententation, 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 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'}));
}

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