JSON Serialization and Deserialization for models

This commit is contained in:
Ankit Mahato
2023-03-23 03:46:19 +05:30
parent 454ebd4b8a
commit 9c31118cd7
2 changed files with 115 additions and 10 deletions

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:apidash/consts.dart'; import 'package:apidash/consts.dart';
import 'package:apidash/utils/utils.dart' show mapToRows, rowsToMap;
import 'kvrow_model.dart'; import 'kvrow_model.dart';
import 'response_model.dart'; import 'response_model.dart';
@ -26,7 +27,7 @@ class RequestModel {
final List<KVRow>? requestHeaders; final List<KVRow>? requestHeaders;
final List<KVRow>? requestParams; final List<KVRow>? requestParams;
final ContentType requestBodyContentType; final ContentType requestBodyContentType;
final dynamic requestBody; final String? requestBody;
final int? responseStatus; final int? responseStatus;
final String? message; final String? message;
final ResponseModel? responseModel; final ResponseModel? responseModel;
@ -53,7 +54,7 @@ class RequestModel {
List<KVRow>? requestHeaders, List<KVRow>? requestHeaders,
List<KVRow>? requestParams, List<KVRow>? requestParams,
ContentType? requestBodyContentType, ContentType? requestBodyContentType,
dynamic requestBody, String? requestBody,
int? responseStatus, int? responseStatus,
String? message, String? message,
ResponseModel? responseModel, ResponseModel? responseModel,
@ -74,12 +75,74 @@ class RequestModel {
); );
} }
factory RequestModel.fromJson(Map<String, dynamic> data) {
HTTPVerb method;
ContentType requestBodyContentType;
ResponseModel? responseModel;
final id = data["id"] as String;
try {
method = HTTPVerb.values.byName(data["method"] as String);
} catch (e) {
method = kDefaultHttpMethod;
}
final url = data["url"] as String;
final requestHeaders =
mapToRows(data["requestHeaders"] as Map<String, String>?);
final requestParams =
mapToRows(data["requestParams"] as Map<String, String>?);
try {
requestBodyContentType =
ContentType.values.byName(data["requestBodyContentType"] as String);
} catch (e) {
requestBodyContentType = kDefaultContentType;
}
final requestBody = data["requestBody"] as String?;
final responseStatus = data["responseStatus"] as int?;
final message = data["message"] as String?;
final responseModelJson = data["responseModel"] as Map<String, dynamic>?;
if (responseModelJson != null) {
responseModel = ResponseModel.fromJson(responseModelJson);
} else {
responseModel = null;
}
return RequestModel(
id: id,
method: method,
url: url,
requestTabIndex: 0,
requestHeaders: requestHeaders,
requestParams: requestParams,
requestBodyContentType: requestBodyContentType,
requestBody: requestBody,
responseStatus: responseStatus,
message: message,
responseModel: responseModel,
);
}
Map<String, dynamic> toJson() {
return {
"id": id,
"method": method.name,
"url": url,
"requestHeaders": rowsToMap(requestHeaders),
"requestParams": rowsToMap(requestParams),
"requestBodyContentType": requestBodyContentType.name,
"requestBody": requestBody,
"responseStatus": responseStatus,
"message": message,
"responseModel": responseModel?.toJson(),
};
}
@override @override
String toString() { String toString() {
return [ return [
id, "Request Id: $id",
method.name, "Request Method: ${method.name}",
"URL: $url", "Request URL: $url",
"Request Tab Index: ${requestTabIndex.toString()}", "Request Tab Index: ${requestTabIndex.toString()}",
"Request Headers: ${requestHeaders.toString()}", "Request Headers: ${requestHeaders.toString()}",
"Request Params: ${requestParams.toString()}", "Request Params: ${requestParams.toString()}",

View File

@ -2,7 +2,7 @@ import 'dart:io';
import 'dart:convert'; import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart' show mergeMaps;
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:http_parser/http_parser.dart'; import 'package:http_parser/http_parser.dart';
import 'package:apidash/utils/utils.dart'; import 'package:apidash/utils/utils.dart';
@ -49,7 +49,6 @@ class ResponseModel {
final body = (mediaType?.subtype == kSubTypeJson) final body = (mediaType?.subtype == kSubTypeJson)
? utf8.decode(response.bodyBytes) ? utf8.decode(response.bodyBytes)
: response.body; : response.body;
final formattedBody = formatBody(body, mediaType);
return ResponseModel( return ResponseModel(
statusCode: response.statusCode, statusCode: response.statusCode,
headers: responseHeaders, headers: responseHeaders,
@ -57,19 +56,62 @@ class ResponseModel {
contentType: contentType, contentType: contentType,
mediaType: mediaType, mediaType: mediaType,
body: body, body: body,
formattedBody: formattedBody, formattedBody: formatBody(body, mediaType),
bodyBytes: response.bodyBytes, bodyBytes: response.bodyBytes,
time: time, time: time,
); );
} }
factory ResponseModel.fromJson(Map<String, dynamic> data) {
MediaType? mediaType;
Duration? timeElapsed;
final statusCode = data["statusCode"] as int?;
final headers = data["headers"] as Map<String, String>?;
final requestHeaders = data["requestHeaders"] as Map<String, String>?;
final contentType = headers?[HttpHeaders.contentTypeHeader];
try {
mediaType = MediaType.parse(contentType!);
} catch (e) {
mediaType = null;
}
final body = data["body"] as String?;
final bodyBytes = data["bodyBytes"] as Uint8List?;
final time = data["time"] as int?;
if (time != null) {
timeElapsed = Duration(microseconds: time);
}
return ResponseModel(
statusCode: statusCode,
headers: headers,
requestHeaders: requestHeaders,
contentType: contentType,
mediaType: mediaType,
body: body,
formattedBody: formatBody(body, mediaType),
bodyBytes: bodyBytes,
time: timeElapsed,
);
}
Map<String, dynamic> toJson() {
return {
"statusCode": statusCode,
"headers": headers,
"requestHeaders": requestHeaders,
"body": body,
"bodyBytes": bodyBytes,
"time": time?.inMicroseconds,
};
}
@override @override
String toString() { String toString() {
return [ return [
"Response Status: $statusCode", "Response Status: $statusCode",
"Response Time: $time", "Response Time: $time",
"Response Headers: ${headers.toString()}", "Response Headers: $headers",
"Response Request Headers: ${requestHeaders.toString()}", "Response Request Headers: $requestHeaders",
"Response Content-Type: $contentType",
"Response Body: $body", "Response Body: $body",
].join("\n"); ].join("\n");
} }