Skip to content

Instantly share code, notes, and snippets.

@ipcjs
Created June 15, 2021 02:40
Show Gist options
  • Save ipcjs/c0896bf90effe955a863ed9813d006c5 to your computer and use it in GitHub Desktop.
Save ipcjs/c0896bf90effe955a863ed9813d006c5 to your computer and use it in GitHub Desktop.
Dio: ApiResultInterceptor
class ApiResult<T> {
final int code;
final T data;
final String? message;
const ApiResult({
required this.code,
required this.data,
this.message,
});
factory ApiResult.fromJson(Map<String, dynamic> json) {
return ApiResult(
code: json['code'] as int,
data: json['data'] as T,
message: json['message'] as String?,
);
}
Map<String, dynamic> toJson() {
return <String, dynamic>{
'code': this.code,
'data': this.data,
'message': this.message,
};
}
ApiException toException({dynamic cause}) => ApiException(code: code, message: message, cause: cause);
}
class ApiException extends DeprecatedDioError {
static const CODE_SUCCESS = 0;
static const CODE_UNKNOWN = 1000;
final int code;
final dynamic cause;
final String? _message;
ApiException({
required this.code,
String? message,
this.cause,
}) : _message = message;
@override
String get message => _message ?? cause?.toString() ?? '';
@override
String toString() {
var str = 'ApiException{code: $code, message: $message, cause: $cause}';
if (cause is Error) {
str += '\n${(cause as Error).stackTrace}';
}
return str;
}
}
class ApiResultInterceptor extends Interceptor {
ApiResultInterceptor();
@override
void onResponse(Response resp, ResponseInterceptorHandler handler) {
if (resp.data is Map) {
if (resp.statusCode != 200) {
handler.reject(
ApiException(
code: resp.statusCode ?? ApiException.CODE_UNKNOWN,
message: resp.statusMessage,
)..requestOptions = resp.requestOptions,
true);
return;
}
final result = ApiResult<dynamic>.fromJson(resp.data as Map<String, dynamic>);
if (result.code == 0) {
resp.data = result.data;
handler.next(resp);
return;
} else {
handler.reject(result.toException()..requestOptions = resp.requestOptions, true);
return;
}
}
handler.next(resp);
}
}
/// Created by ipcjs on 2020/9/2.
abstract class DeprecatedDioError implements DioError {
static const deprecatedMessage = 'fuck dio';
static final defaultErrorRequestOptions = RequestOptions(path: 'https://error.com');
@override
String get message;
@Deprecated(deprecatedMessage)
@override
dynamic error;
RequestOptions _requestOptions = defaultErrorRequestOptions;
@Deprecated(deprecatedMessage)
@override
RequestOptions get requestOptions => _requestOptions;
@override
set requestOptions(RequestOptions value) {
_requestOptions = value;
}
@Deprecated(deprecatedMessage)
@override
Response? response;
@Deprecated(deprecatedMessage)
@override
DioErrorType type = DioErrorType.other;
@Deprecated(deprecatedMessage)
@override
StackTrace? stackTrace;
}
@pythonhubdev
Copy link

Will this method be suitable for this trevorwang/retrofit.dart#357 kind of architecture.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment