Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flutter generic REST API call function

Tags:

flutter

dart

I am working on first my flutter app. App required to call rest api and return back result. I am looking to create generic function to call rest api. I have written below code but I am not understating, how can I decode api response in specific model.

Future<T> apiRequest<T>(
    String endPoint,
    RequestMethod method, {
    String body = '',
    String token = '',
  }) async {
    http.Response resp;
    final String url = LocalConstants.apiBaseUrl + endPoint;
    final Map<String, String> headers = new Map<String, String>();
    headers.putIfAbsent(
        HttpHeaders.contentTypeHeader, () => 'application/json');
    if (token != null && token.isNotEmpty) {
      headers.putIfAbsent(
          HttpHeaders.authorizationHeader, () => 'Bearer ' + token);
    }
    try {
      if (method == RequestMethod.get) {
        resp = await http.get(
          url,
          headers: headers,
        );
      } else if (method == RequestMethod.put) {
        resp = await http.put(
          url,
          headers: headers,
          body: body,
        );
      } else if (method == RequestMethod.post) {
        resp = await http.post(
          url,
          headers: headers,
          body: body,
        );
      } else if (method == RequestMethod.delete) {
        resp = await http.delete(
          url,
          headers: headers,
        );
      }
      if (resp != null && this.validateResponse(resp)) {
        return json.decode(resp.body);
      }
      // else {
      //   Response resp = new Response();
      //   resp.respMsg = LocalConstants.genericError;
      //   resp.respCode = LocalConstants.resp_failure;
      //   Response.
      // }
    } on TimeoutException catch (e) {
      //handleTimeout();
    } on SocketException catch (e) {
      print('Socket Error: $e');
      //handleTimeout();
    } on Error catch (e) {
      print('General Error: $e');
      //showError();
    }
  }

Below is code which I can use to call rest api

await ApiService.newInstance(context)
          .apiRequest<GenericResp>('/api/people', RequestMethod.get);

Here is my GenericResp class

import 'package:project/models/Response.dart';

class GenericResp extends Response {
  int id;
  int otherId;
  String mappingId;

  GenericResp({
    this.id,
    this.otherId,
    this.mappingId,
  });

  GenericResp.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    otherId = json['other_id'];
    mappingId = json['mapping_id'];
    respCode = json['resp_code'];
    respMsg = json['resp_msg'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['id'] = this.id;
    data['other_id'] = this.otherId;
    data['mapping_id'] = this.mappingId;
    data['resp_code'] = this.respCode;
    data['resp_msg'] = this.respMsg;
    return data;
  }
}

How can I decode body json.decode(resp.body); to GenericResp of type T?

like image 530
Ajay Avatar asked Oct 18 '25 13:10

Ajay


1 Answers

You can add a generic argument that will deserialize your json data to GenericResp. Something like that:

Future<T> apiRequest<T>(
    String endPoint,
    RequestMethod method, T Function(Object json) fromJson, {
      String body = '',
      String token = '',
    }) async { ... }

And after json decoding you are to use fromJson argument:

if (resp != null && this.validateResponse(resp)) {
  return fromJson(json.decode(resp.body));
}

And then a call would look like this:

await ApiService.newInstance(context).apiRequest<GenericResp>('/api/people',
    RequestMethod.get, (json) => GenericResp.fromJson(json));
like image 176
ChessMax Avatar answered Oct 21 '25 02:10

ChessMax



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!