http_xtra 0.0.1
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;
}
}
}