build_api 0.0.1 copy "build_api: ^0.0.1" to clipboard
build_api: ^0.0.1 copied to clipboard

一个简单易用的API框架

example/lib/main.dart

import 'package:build_api/build_api.dart';

void main() async {
  //ApiOptionManager.updateOption(logCallback: print);
  // head
  HeadModel headModel = await HeadRequest().head();
  print(headModel);
  DataModel singleData = await SingleDataRequest(id: 10).get<DataModel>();
  print(singleData);
  List<DataModel> multiData =
      await MultiDataRequest(start: 0, size: 10).get<List<DataModel>>();
  print(multiData);
  DataModel postData = await PostRequest().fetch<DataModel>();
  print(postData);
  DataModel putData = await PutRequest(id: 10).fetch<DataModel>();
  print(putData);
  int deleteData = await DeleteRequest(id: 10).fetch<int>();
  print(deleteData);
  HeaderModel headerData = await CustomHeaderRequest().get<HeaderModel>();
  print(headerData);
}

class HeadModel extends BaseModel {
  final bool isExists;

  HeadModel({this.isExists = false});

  @override
  fromJson(json) {
    if (json is! Map) {
      return this;
    }
    return HeadModel(isExists: json['isExists'] ?? false);
  }

  @override
  Map<String, dynamic> toJson() {
    return {'isExists': isExists};
  }
}

class HeadRequest extends BaseRequest {
  @override
  Future<String> buildUrl() async {
    return 'https://jsonplaceholder.typicode.com/posts';
  }

  @override
  Future<Map<String, dynamic>> buildQueryParameter() async {
    return {
      '_start': 0,
      '_limit': 10,
    };
  }

  @override
  BaseDelegate buildDelegate() {
    return ModelDelegate<HeadModel>(model: HeadModel());
  }

  @override
  parseResponse(int statusCode, _, __) {
    return {'isExists': statusCode == 200};
  }
}

class DataModel extends BaseModel {
  final int userId;
  final int id;
  final String title;
  final String body;

  DataModel({this.userId = 0, this.id = 0, this.title = '', this.body = ''});

  @override
  fromJson(json) {
    if (json is! Map) {
      return this;
    }
    return DataModel(
        userId: ApiUtil.toInt(json['userId']),
        id: ApiUtil.toInt(json['id']),
        title: ApiUtil.toStr(json['title']),
        body: ApiUtil.toStr(json['body']));
  }

  @override
  Map<String, dynamic> toJson() {
    return {
      'userId': userId,
      'id': id,
      'title': title,
      'body': body,
    };
  }
}

class SingleDataRequest extends BaseRequest {
  final int id;
  SingleDataRequest({this.id}) : assert(id != null);

  @override
  Future<String> buildUrl() async =>
      'https://jsonplaceholder.typicode.com/posts/$id';

  @override
  BaseDelegate buildDelegate() {
    return ModelDelegate<DataModel>(model: DataModel());
  }

  @override
  dynamic parseResponse(int statusCode, dynamic data, _) {
    if (statusCode != 200 && statusCode != 201) {
      throw ApiException(
          message: 'invalid status code($statusCode)', code: 1000);
    }
    return data;
  }
}

class MultiDataRequest extends BaseRequest {
  final int start;
  final int size;

  MultiDataRequest({this.start, this.size})
      : assert(start != null),
        assert(size != null);

  @override
  Future<String> buildUrl() async =>
      'https://jsonplaceholder.typicode.com/posts';

  @override
  Future<Map<String, dynamic>> buildQueryParameter() async {
    return {
      '_start': start ?? 0,
      '_limit': size ?? 10,
    };
  }

  @override
  BaseDelegate buildDelegate() {
    return MultiModelDelegate<DataModel>(model: DataModel());
  }

  @override
  dynamic parseResponse(int statusCode, dynamic data, _) {
    if (statusCode != 200 && statusCode != 201) {
      throw ApiException(
          message: 'invalid status code($statusCode)', code: 1000);
    }
    return data;
  }
}

class PostRequest extends BaseRequest {
  @override
  Future<String> buildUrl() async {
    return 'https://jsonplaceholder.typicode.com/posts';
  }

  @override
  String buildContentType() {
    return ApiOption.jsonContentType;
  }

  @override
  MethodType buildMethodType() {
    return MethodType.post;
  }

  @override
  Future<Map<String, dynamic>> buildData() async {
    return {
      'title': 'title',
      'body': 'body',
      'userId': 1000,
    };
  }

  @override
  BaseDelegate buildDelegate() {
    return ModelDelegate<DataModel>(model: DataModel());
  }

  @override
  parseResponse(int statusCode, dynamic data, _) {
    if (statusCode != 200 && statusCode != 201) {
      throw ApiException(
          message: 'invalid status code($statusCode)', code: 1000);
    }
    return data;
  }
}

class PutRequest extends BaseRequest {
  final int id;

  PutRequest({this.id}) : assert(id != null);

  @override
  Future<String> buildUrl() async {
    return 'https://jsonplaceholder.typicode.com/posts/$id';
  }

  @override
  String buildContentType() {
    return ApiOption.jsonContentType;
  }

  @override
  MethodType buildMethodType() {
    return MethodType.put;
  }

  @override
  Future<Map<String, dynamic>> buildData() async {
    return {
      'title': 'title',
      'body': 'body',
      'userId': 1000,
    };
  }

  @override
  BaseDelegate buildDelegate() {
    return ModelDelegate<DataModel>(model: DataModel());
  }

  @override
  parseResponse(int statusCode, dynamic data, _) {
    if (statusCode != 200 && statusCode != 201) {
      throw ApiException(
          message: 'invalid status code($statusCode)', code: 1000);
    }
    return data;
  }
}

class DeleteRequest extends BaseRequest {
  final int id;

  DeleteRequest({this.id}) : assert(id != null);

  @override
  Future<String> buildUrl() async {
    return 'https://jsonplaceholder.typicode.com/posts/$id';
  }

  @override
  String buildContentType() {
    return ApiOption.jsonContentType;
  }

  @override
  MethodType buildMethodType() {
    return MethodType.delete;
  }

  @override
  BaseDelegate buildDelegate() {
    return ValueDelegate<int>(defaultValue: 0);
  }

  @override
  parseResponse(int statusCode, _, __) {
    if (statusCode != 200 && statusCode != 201) {
      return 0;
    }
    return 1;
  }
}

class HeaderModel extends BaseModel {
  final String customKey;

  HeaderModel({this.customKey = ''});

  @override
  fromJson(json) {
    if (json is! Map) {
      return this;
    }
    return HeaderModel(customKey: ApiUtil.toStr(json['Custom-Key']));
  }

  @override
  Map<String, dynamic> toJson() {
    return {
      'customKey': customKey,
    };
  }
}

class CustomHeaderRequest extends BaseRequest {
  @override
  Future<String> buildUrl() async {
    return 'https://httpbin.org/get';
  }

  @override
  MethodType buildMethodType() {
    return MethodType.get;
  }

  @override
  BaseDelegate buildDelegate() {
    return ModelDelegate<HeaderModel>(model: HeaderModel());
  }

  @override
  Future<Map<String, dynamic>> buildHeaders(_, __) async {
    return {
      'Custom-Key': 'CustomValue',
    };
  }

  @override
  parseResponse(
      int statusCode, dynamic data, Map<String, List<String>> headers) {
    if (statusCode != 200 && statusCode != 201) {
      throw ApiException(
          message: 'invalid status code($statusCode)', code: 1000);
    }
    if (data is! Map) {
      throw ApiException(message: 'data invalid', code: 1000);
    }
    return data['headers'];
  }
}
1
likes
25
pub points
0%
popularity

Publisher

unverified uploader

一个简单易用的API框架

Homepage

License

MulanPSL-2.0 (LICENSE)

Dependencies

dio, flutter

More

Packages that depend on build_api