Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'dart:convert';
- import 'package:dio/dio.dart';
- import 'package:dart_jsona/dart_jsona.dart';
- import 'package:flutter/foundation.dart';
- /// Dio Transformer used to automatically serialize and
- /// deserialize JSON-API payloads.
- class JsonApiTransformer extends DefaultTransformer {
- static const kJsonApiMimeType = 'application/vnd.api+json';
- @override
- Future<String> transformRequest(RequestOptions options) async {
- var data = options.data ?? '';
- if (data is! String) {
- if (options.contentType.mimeType == kJsonApiMimeType) {
- return _serializeJsonApi(options.data);
- } else {
- // Fallback to standard JSON encoding if it's not a JSON API payload
- return super.transformRequest(options);
- }
- }
- return data.toString();
- }
- @override
- Future transformResponse(
- RequestOptions options,
- ResponseBody response,
- ) async {
- if (response.headers.contentType.mimeType == kJsonApiMimeType) {
- var responseBody = await super.transformResponse(options, response);
- return _parseJsonApi(responseBody);
- }
- return super.transformResponse(options, response);
- }
- }
- /// Handles parsing in the background using an isolate
- _parseJsonApi(String text) {
- return compute(_parseAndDecodeJsonApi, text);
- }
- /// Decodes a JSON API response
- _parseAndDecodeJsonApi(String response) {
- return Jsona().deserialize(
- jsonDecode(response),
- );
- }
- /// Serializes a JSON API payload
- _serializeJsonApi(dynamic data) {
- return jsonEncode(
- Jsona().serialize(stuff: data),
- );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement