搜索插件、代码仓与 APP 分类

插件详情v1.0.1

http_api_handler

一个用于轻松处理 HTTP API 请求的 Flutter 包,包括文件上传和下载。

AndroidiOSWebmacOSWindowsLinux
近 30 天下载
13
喜欢数
2
Pub 分数
140

安装插件

flutter pub add http_api_handler

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

http_api_handler 是一个专为简化 HTTP API 交互而设计的 Flutter 包,提供简洁的方法来发起请求、处理文件上传和下载,适用于多个平台。它提供了一个清晰直观的接口,减少了样板代码,同时支持常见的 HTTP 操作,如 GET、POST、PUT 和 DELETE。该包以易用性为核心设计,可无缝集成到面向 Android、iOS、Web、macOS、Windows 和 Linux 的 Flutter 应用中。通过抽象复杂的网络逻辑,该包提升了开发者的生产力。

适合场景

  • 调用 REST API
  • 上传文件到服务器
  • 从 API 下载文件
  • 处理 JSON 响应
  • 简化网络请求管理
  • 跨平台 HTTP 通信

主要特点

  • 支持文件上传和下载
  • 内置错误处理
  • 跨平台兼容性
  • 简单 API 语法
  • 自动 JSON 解析
  • 请求取消

适合对象

  • Flutter 开发人员构建基于 API 的应用程序
  • 需要文件传输功能的项目
  • 注重快速开发的团队
  • 针对多个平台的应用
  • 寻求最小化样板代码的开发者

使用建议

  • 与原始的 http 包相比,自定义选项有限
  • 依赖外部 http 库
  • 可能需要额外设置以进行高级身份验证
  • 不太适合高度复杂的请求工作流
  • 最适合标准 REST API

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

HTTP API Handler

pub package License: MIT

A powerful and flexible Flutter package for handling HTTP API requests with built-in logging, error handling, and file operations. Designed to simplify API integration in Flutter applications.

Features 🚀

  • ✨ Easy-to-use HTTP methods (GET, POST, PUT, DELETE)
  • 📁 File upload support (single and multiple files)
  • ⬇️ File download capability
  • 📝 Built-in logging system
  • ❌ Comprehensive error handling
  • 🔐 Authentication token support
  • 🔍 Query parameters support
  • 🎯 Custom base URL support
  • 🧪 Fully tested

Installation 💻

Add this to your package's pubspec.yaml file:

dependencies:
  http_api_handler: ^1.0.0

Then run:

flutter pub get

Usage 📱

Initialize the API Handler
final api = ApiHandler(
  baseURL: 'https://api.example.com',  // Your API base URL
  authToken: 'your_auth_token',        // Optional: JWT or other auth token
  enableLogs: true,                    // Enable/disable logging
  additionalHeaders: {                 // Optional: Additional headers
    'Custom-Header': 'Value',
  },
);
Basic HTTP Requests
GET Request
// Simple GET request
try {
  final response = await api.get(
    endPoint: '/users',
  );
  print('Users: $response');
} catch (e) {
  print('Error: $e');
}

// GET request with query parameters
try {
  final response = await api.get(
    endPoint: '/users',
    queryParameters: {
      'page': '1',
      'limit': '10',
      'sort': 'desc',
    },
  );
  print('Filtered Users: $response');
} catch (e) {
  print('Error: $e');
}
POST Request
try {
  final response = await api.post(
    endPoint: '/users',
    body: {
      'name': 'John Doe',
      'email': 'john@example.com',
      'age': 30,
    },
  );
  print('Created User: $response');
} catch (e) {
  print('Error: $e');
}
PUT Request
try {
  final response = await api.put(
    endPoint: '/users/123',
    body: {
      'name': 'Updated Name',
      'email': 'updated@example.com',
    },
  );
  print('Updated User: $response');
} catch (e) {
  print('Error: $e');
}
DELETE Request
try {
  final response = await api.delete(
    endPoint: '/users/123',
  );
  print('Deleted User: $response');
} catch (e) {
  print('Error: $e');
}
File Operations
Upload Single File
try {
  final response = await api.uploadFiles(
    endPoint: '/upload',
    files: [yourFile],  // PlatformFile from file_picker
    singleFile: true,
    fields: {           // Optional additional fields
      'type': 'profile',
      'userId': '123',
    },
    onProgress: (sent, total) {
      final progress = (sent / total * 100).toStringAsFixed(2);
      print('Upload Progress: $progress%');
    },
  );
  print('Upload Response: $response');
} catch (e) {
  print('Upload Error: $e');
}
Upload Multiple Files
try {
  final response = await api.uploadFiles(
    endPoint: '/upload/multiple',
    files: yourFiles,  // List<PlatformFile> from file_picker
    singleFile: false,
    fields: {'type': 'gallery'},
    onProgress: (sent, total) {
      final progress = (sent / total * 100).toStringAsFixed(2);
      print('Upload Progress: $progress%');
    },
  );
  print('Multiple Upload Response: $response');
} catch (e) {
  print('Upload Error: $e');
}
Download File
try {
  final fileBytes = await api.downloadFile(
    endPoint: '/download',
    body: {'fileId': '123'},
  );
  // Handle the downloaded file bytes
  // Example: Save to file system
  await File('downloaded_file.pdf').writeAsBytes(fileBytes);
} catch (e) {
  print('Download Error: $e');
}
Error Handling

The package provides specific exceptions for different scenarios:

try {
  final response = await api.get(endPoint: '/protected-resource');
} on AuthenticationException catch (e) {
  // Handle 401 Unauthorized
  print('Authentication Error: ${e.message}');
  // Example: Redirect to login
} on BadRequestException catch (e) {
  // Handle 400 Bad Request
  print('Bad Request: ${e.message}');
  // Example: Show validation errors
} on ServerException catch (e) {
  // Handle 500 Server Error
  print('Server Error: ${e.message}');
  // Example: Show server error message
} on NetworkException catch (e) {
  // Handle network/connectivity issues
  print('Network Error: ${e.message}');
  // Example: Show offline message
} on ApiException catch (e) {
  // Handle other API errors
  print('API Error: ${e.message} (${e.statusCode})');
  // Example: Show generic error message
}
Logging

The package includes comprehensive logging that can be enabled/disabled:

// Enable logging (default: true)
final api = ApiHandler(
  baseURL: 'https://api.example.com',
  enableLogs: true,
);

// Logs will include:
// ✓ Request URL
// ✓ Request Method
// ✓ Request Headers
// ✓ Request Body
// ✓ Response Status Code
// ✓ Response Body
// ✓ Error Details (if any)
Custom Base URL

You can use a different base URL for specific requests:

final response = await api.post(
  endPoint: '/special-endpoint',
  body: {'data': 'value'},
  customBaseURL: 'https://another-api.com',
);

Error Types 🚨

Exception Type Description Status Code
ApiException Base exception class Any
AuthenticationException Authentication failed 401
BadRequestException Invalid request 400
ServerException Server error 500
NetworkException Network/connectivity issues N/A

Contributing 🤝

Contributions are welcome! Here's how you can help:

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

Testing 🧪

The package includes comprehensive tests. Run them with:

flutter test

License 📄

This project is licensed under the MIT License - see the LICENSE file for details.

Author ✍️

Anwar Safy

  • GitHub: @anwarsafy
  • LinkedIn: @anwar-safy

Support ❤️

If you find this package helpful, please give it a ⭐️ on GitHub!

Changelog 📝

See CHANGELOG.md for all changes.

Issues and Feedback 💭

Please file specific issues, bugs, or feature requests in our issue tracker.

FAQ 📚

Q: Can I use this package with DIO?

A: Currently, the package uses the http package. DIO support might be added in future versions.

Q: Is this package null-safe?

A: Yes, this package is null-safe and requires Dart SDK 2.12.0 or later.

Q: Does it support file upload progress?

A: Yes, file upload progress can be monitored using the onProgress callback in file upload methods.

Q: Can I use custom error handling?

A: Yes, you can catch the base ApiException and implement your own error handling logic.

Q: Is it compatible with Flutter Web?

A: Yes, this package is fully compatible with Flutter Web and all other Flutter platforms.

Q: Can I add custom headers?

A: Yes, you can add custom headers through the additionalHeaders parameter when initializing the ApiHandler.

Q: How do I handle refresh tokens?

A: You can implement a custom interceptor by extending the ApiHandler class and overriding the necessary methods.

所属分类

依赖

依赖清单 3 项

源码仓库

使用此插件的项目

暂无相关数据。