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

Http encapsulation to parse easily

HttpX #

HttpX is a package which aims to facilitate the use of the http package

Features #

HttpX parse http response in an easy way.

HttpX can manage the following methods :

  • GET
  • POST
  • PUT
  • DELETE

Usage #

import 'dart:convert';
import 'dart:io';

import 'package:http/http.dart' as http;
import 'package:http_xtra/src/extensions/map.dart';
import 'package:http_xtra/src/extensions/string.dart';

typedef Parser<T, ResponseBodyType> = T Function(ResponseBodyType value);
typedef Headers = Map<String, String>;
typedef Body = Map<String, dynamic>;

class HttpXtra {
  final String _baseUrl;
  final Headers _defaultHeaders;

  HttpXtra({
    required String baseUrl,
    Headers? defaultHeaders,
  })  : _baseUrl = baseUrl,
        _defaultHeaders = defaultHeaders ?? {};

  /// Replace existing default headers by [newHeaders]
  void setDefaultHeader(Headers newHeaders) {
    _defaultHeaders.clear();
    _defaultHeaders.addAll(newHeaders);
  }

  /// Add [newHeaders] to the default headers
  void addDefaultHeaders(Headers newHeaders) {
    _defaultHeaders.addAll(newHeaders);
  }

  /// Set the Authorization header with [token]. By default [isBearer] is true
  /// so header value will looks like : Bearer eyJhbGciOiJ...
  void setAuthorization(String token, {bool isBearer = true}) {
    _defaultHeaders['Authorization'] = "${isBearer ? "Bearer " : ""}$token";
  }

  Future<ReturnValueType> get<ReturnValueType, ResponseBodyType>(
    String route, {
    Parser<ReturnValueType, ResponseBodyType>? parser,
    Headers? headers,
  }) {
    return http
        .get(
          "$_baseUrl$route".toUri(),
          headers: _defaultHeaders.merge(headers ?? {}),
        )
        .then((value) =>
            _parseResponse<ReturnValueType, ResponseBodyType>(value, parser));
  }

  Future<ReturnValueType> post<ReturnValueType, BodyType>(
    String route, {
    Parser<ReturnValueType, BodyType>? parser,
    Body? body,
    Headers? headers,
  }) {
    if (headers == null || !headers.containsKey("Content-Type")) {
      headers = (headers ?? {}).merge({"Content-Type": "application/json"});
    }

    return http
        .post(
          "$_baseUrl$route".toUri(),
          body: body != null ? jsonEncode(body) : null,
          headers: _defaultHeaders.merge(headers),
        )
        .then((value) =>
            _parseResponse<ReturnValueType, BodyType>(value, parser));
  }

  Future<ReturnValueType> put<ReturnValueType, BodyType>(
    String route, {
    Parser<ReturnValueType, BodyType>? parser,
    Body? body,
    Headers? headers,
  }) {
    if (headers == null || !headers.containsKey("Content-Type")) {
      headers = (headers ?? {}).merge({"Content-Type": "application/json"});
    }

    return http
        .put(
          "$_baseUrl$route".toUri(),
          body: body != null ? jsonEncode(body) : null,
          headers: _defaultHeaders.merge(headers),
        )
        .then((value) =>
            _parseResponse<ReturnValueType, BodyType>(value, parser));
  }

  Future<ReturnValueType> delete<ReturnValueType, BodyType>(
    String route, {
    Parser<ReturnValueType, BodyType>? parser,
    Headers? headers,
  }) {
    return http
        .delete(
          "$_baseUrl$route".toUri(),
          headers: _defaultHeaders.merge(headers ?? {}),
        )
        .then((value) =>
            _parseResponse<ReturnValueType, BodyType>(value, parser));
  }

  ReturnValueType _parseResponse<ReturnValueType, ResponseBodyType>(
    http.Response response,
    Parser<ReturnValueType, ResponseBodyType>? parser,
  ) {
    if (response.statusCode >= 400) {
      throw HttpException(utf8.decode(response.bodyBytes));
    }

    try {
      final ResponseBodyType body = jsonDecode(utf8.decode(response.bodyBytes));

      return parser != null ? parser(body) : body as ReturnValueType;
    } on Exception {
      return parser != null
          ? parser(response.body as ResponseBodyType)
          : response.body as ReturnValueType;
    }
  }
}
2
likes
0
points
44
downloads

Publisher

unverified uploader

Weekly Downloads

Http encapsulation to parse easily

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

http

More

Packages that depend on http_xtra