Dioは、DartおよびFlutter用の強力なHTTPネットワーキングパッケージであり、グローバル構成、インターセプター、FormData、リクエストのキャンセル、ファイルのアップロード/ダウンロード、タイムアウト、カスタムアダプター、トランスフォーマーなどをサポートしています。
インストール
dio
パッケージをpubspec.yaml
のdependenciesに追加してください。
dependencies:
dio: ^5.3.3
パッケージをアップデートする前に、メジャーバージョンやマイナーバージョンの変更で破壊的な変更がある可能性があるので、Migration Guideを確認してください。
使用例
以下は、シンプルなGETリクエストの例です。
import 'package:dio/dio.dart';
final dio = Dio();
void getHttp() async {
final response = await dio.get('https://dart.dev');
print(response);
}
Dioの特徴
- 強力なHTTPネットワーキングパッケージ
- Dart 3対応
- FlutterプラットフォームおよびDartプラットフォーム向け
- Android、iOS、Linux、macOS、Web、Windowsをサポート
サンプルコード
以下は、いくつかの一般的な操作のサンプルコードです。
GETリクエストの実行
import 'package:dio/dio.dart';
final dio = Dio();
void request() async {
Response response;
response = await dio.get('/test?id=12&name=dio');
print(response.data.toString());
// 上記のリクエストと同じです。
response = await dio.get(
'/test',
queryParameters: {'id': 12, 'name': 'dio'},
);
print(response.data.toString());
}
POSTリクエストの実行
response = await dio.post('/test', data: {'id': 12, 'name': 'dio'});
ファイルのダウンロード
response = await dio.download(
'https://pub.dev/',
(await getTemporaryDirectory()).path + 'pub.html',
);
アップロードの進捗監視
final response = await dio.post(
'https://www.dtworkroom.com/doris/1/2.0.0/test',
data: {'aa': 'bb' * 22},
onSendProgress: (int sent, int total) {
print('$sent $total');
},
);
これは一部のDioの機能とサンプルコードの一部です。Dioは非常に柔軟で機能豊富なHTTPパッケージであり、様々なシナリオに対応しています。詳細な使い方や機能については、Dioの公式ドキュメントを参照してください。
コピペで使えるRest API形式のDio
Rest API形式のDioをクラスで提供する拡張性のある実装例を以下に示します。このクラスでは、基本的なHTTPメソッド(GET、POST、PUT、DELETE)に対するリクエストを行うメソッドが含まれています。また、ベースURLや共通のヘッダー、エラーハンドリングなどの設定を柔軟に行えるようにしています。
import 'package:dio/dio.dart';
class RestApiClient {
Dio _dio;
// ベースURL
final String baseUrl;
// 共通のヘッダー
final Map<String, dynamic> headers;
RestApiClient({required this.baseUrl, Map<String, dynamic>? headers})
: this.headers = headers ?? {},
_dio = Dio(BaseOptions(baseUrl: baseUrl));
// GETリクエスト
Future<Response> get(String path, {Map<String, dynamic>? queryParameters}) async {
return _dio.get(path, queryParameters: queryParameters, options: _options());
}
// POSTリクエスト
Future<Response> post(String path, dynamic data) async {
return _dio.post(path, data: data, options: _options());
}
// PUTリクエスト
Future<Response> put(String path, dynamic data) async {
return _dio.put(path, data: data, options: _options());
}
// DELETEリクエスト
Future<Response> delete(String path, {dynamic data}) async {
return _dio.delete(path, data: data, options: _options());
}
// 共通のリクエストオプション設定
Options _options() {
return Options(headers: headers);
}
}
このクラスを使うと、次のようにしてRest API形式のリクエストを行えます。
void main() async {
final restApiClient = RestApiClient(baseUrl: 'https://api.example.com', headers: {'Authorization': 'Bearer YOUR_TOKEN'});
try {
// GETリクエストの例
final getResponse = await restApiClient.get('/users', queryParameters: {'page': 1});
print('GET Response: ${getResponse.data}');
// POSTリクエストの例
final postData = {'name': 'John Doe', 'email': 'john@example.com'};
final postResponse = await restApiClient.post('/users', postData);
print('POST Response: ${postResponse.data}');
} catch (e) {
print('Error: $e');
}
}
このようなクラスを利用することで、Rest APIへのリクエストが一貫して扱え、共通の設定やヘッダーの管理が容易になります。また、この実装は拡張性があり、必要に応じてカスタマイズや追加の機能を組み込むことができます。