업데이트
2021.07.16 http_interceptor 버전 0.4.1 → 1.0.1 업데이트 되었습니다
클래스 이름이 변경되었습니다. HttpClientWithInterceptor ⇒ InterceptedClient
HTTP Interceptor 가 필요한 내용들
•
API Request Header 에 Authorization 값을 넣는 것
•
Access Token 만료 시 Refresh 하는 로직
•
API Request, Response Logging
Dependency
flutter pub add http_interceptor
Bash
복사
Implement
AuthorizationInterceptor.dart
import 'package:http_interceptor/http_interceptor.dart';
import 'package:firebase_auth/firebase_auth.dart';
class AuthorizationInterceptor implements InterceptorContract {
Future<RequestData> interceptRequest({RequestData data}) async {
try {
String token = await FirebaseAuth.instance.currentUser.getIdToken();
data.headers['authorization'] = 'Bearer ' + token;
data.headers['content-type'] = 'application/json';
} catch (e) {
print(e);
}
return data;
}
Future<ResponseData> interceptResponse({ResponseData data}) async {
return data;
}
}
class ExpiredTokenRetryPolicy extends RetryPolicy {
int maxRetryAttempts = 2;
Future<bool> shouldAttemptRetryOnResponse(ResponseData response) async {
if (response.statusCode == 401) {
await FirebaseAuth.instance.currentUser.getIdTokenResult(true);
return true;
}
return false;
}
}
Dart
복사
•
AuthorizationInterceptor
API Header에 Authorization 값을 추가하는 Interceptor 입니다. Firebase Auth 로 부터 token 을 가져와 header 에 주입합니다.
•
ExpiredTokenRetryPolicy
API Response 에 따라서 Retry 로직을 결정합니다. 유효하지 않은 access token 으로 401 response가 내려오는 경우 refreshToken 이후 retry 하도록 합니다.
Use Interceptor
class PromotionProvider with ChangeNotifier {
List<Promotion> promotion = [];
final client = InterceptedClient.build(interceptors: [
AuthorizationInterceptor()
]); 👈👈👈👈👈👈👈👈👈👈👈👈 :)
void fetchPromotions() async {
final response = await client.get(Uri.parse(Constants.API + 'booster/v1/promotions'));
final data = ResponseListJSON<Promotion>.fromJson(json.decode(response.body), (data) => Promotion.fromJson(data)).data;
promotion = data;
notifyListeners();
}
}
Dart
복사