Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
Tags
- Bitbucket Slack 연동
- Algorithm
- 플러터
- 멀티모듈 고 라우터
- 멀티패키지
- 알고리즘
- ios
- 스위프트
- 네트워크
- go_router
- Flutter Network Interceptor
- Python
- 단편화
- pub workspace go_router
- Flutter
- 고 라우터
- Di
- 난수
- 패킷
- 펍 워크스페이스
- IP
- ci/cd
- Flutter Logging
- Swift
- Flutter Netwrok Logging
- Match
- 인터셉터 구현
- Jira Slack 연동
- 플러터 인터셉터
- flutter interceptor
Archives
- Today
- Total
INEEDACHACHA
Flutter Network Module => Swift Moya Style로 만들어보기 본문
api_service.dart
import 'package:network_module_sample/network_foundation/network_interface.dart';
class Host {
// TODO: SecretClient를 추후에 구현해서 환경별로 baseURL을 바꿔준다.
static String get baseURL => "https://jsonplaceholder.typicode.com";
}
// HTTP Method Enum
enum HttpMethod { get, post, put, delete }
enum MyApi with TargetType {
getUsers,
getUserDetail,
createUser;
@override
String get baseUrl => Host.baseURL;
@override
String get path {
switch (this) {
case MyApi.getUsers:
return "/users";
case MyApi.getUserDetail:
return "/users/1";
case MyApi.createUser:
return "/users";
}
}
@override
HttpMethod get method {
switch (this) {
case MyApi.getUsers:
case MyApi.getUserDetail:
return HttpMethod.get;
case MyApi.createUser:
return HttpMethod.post;
}
}
@override
Map<String, dynamic>? get headers => {
"Content-Type": "application/json; charset=UTF-8",
};
@override
dynamic get body {
switch (this) {
case MyApi.createUser:
return {
"name": "John Doe",
"username": "johndoe",
"email": "john@example.com",
};
default:
return null;
}
}
@override
Map<String, dynamic>? get queryParams => null;
}
- enum을 extension해서 TargetType을 구현하는 것이 불가능하다.
- enum을 Swift 처럼 사용하려고 하면 안 된다.
- 테스트 겸 구현이지만, 목적에 맞는 도구인가 에 대한 고민이 필요하다.
- Moya Style에 의존하지 않고, dio + retrofit의 가장 클래식한 형태가 필요하다.
- https://github.com/Moya/Moya
network_interface.dart
import 'package:network_module_sample/network_foundation/api_service.dart';
mixin TargetType {
String get baseUrl;
String get path;
HttpMethod get method;
Map<String, dynamic>? get headers;
dynamic get body;
Map<String, dynamic>? get queryParams;
}
network.dart
import 'package:dio/dio.dart';
import 'package:network_module_sample/network_foundation/network_interface.dart';
class NetworkManager {
final Dio _dio = Dio();
Future<Response> request(TargetType api) async {
try {
_dio.options.baseUrl = api.baseUrl;
final options = Options(
method: api.method.name.toUpperCase(),
headers: api.headers,
);
return await _dio.request(
api.path,
options: options,
data: api.body,
queryParameters: api.queryParams,
);
} catch (e) {
rethrow;
}
}
}'Flutter > 전환실록' 카테고리의 다른 글
| Flutter Project Atlassian Setting (0) | 2025.07.23 |
|---|---|
| Flutter Network Logging Interceptor (4) | 2025.07.22 |
| Pub Workspace에서 go_router 기반 네비게이션 시스템 구현 (0) | 2025.07.15 |
| Flutter Pub Workspaces 구조 – 현재 프로젝트 기준 (1) | 2025.07.15 |
| Flutter Cocoapods -> SPM 전환 Trouble Shooting (6) | 2025.07.10 |