From 7753e93e71a93bd2d9ecc7dbe94c7bc990a6be91 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Sun, 12 Jan 2025 15:44:45 +0530 Subject: [PATCH] Add graphql support in apicore_core --- .../lib/services/http_service.dart | 135 ++++++++++-------- .../apidash_core/lib/utils/graphql_utils.dart | 11 ++ .../lib/utils/http_request_utils.dart | 13 ++ packages/apidash_core/lib/utils/utils.dart | 1 + 4 files changed, 104 insertions(+), 56 deletions(-) create mode 100644 packages/apidash_core/lib/utils/graphql_utils.dart diff --git a/packages/apidash_core/lib/services/http_service.dart b/packages/apidash_core/lib/services/http_service.dart index 2fb6aa7a..0bbc0501 100644 --- a/packages/apidash_core/lib/services/http_service.dart +++ b/packages/apidash_core/lib/services/http_service.dart @@ -12,6 +12,7 @@ typedef HttpResponse = http.Response; Future<(HttpResponse?, Duration?, String?)> request( String requestId, + APIType apiType, HttpRequestModel requestModel, { SupportedUriSchemes defaultUriScheme = kDefaultUriScheme, bool noSSL = false, @@ -28,74 +29,96 @@ Future<(HttpResponse?, Duration?, String?)> request( if (uriRec.$1 != null) { Uri requestUrl = uriRec.$1!; Map headers = requestModel.enabledHeadersMap; - HttpResponse response; + HttpResponse? response; String? body; try { Stopwatch stopwatch = Stopwatch()..start(); - var isMultiPartRequest = - requestModel.bodyContentType == ContentType.formdata; + if (apiType == APIType.rest) { + var isMultiPartRequest = + requestModel.bodyContentType == ContentType.formdata; - if (kMethodsWithBody.contains(requestModel.method)) { - var requestBody = requestModel.body; - if (requestBody != null && !isMultiPartRequest) { + if (kMethodsWithBody.contains(requestModel.method)) { + var requestBody = requestModel.body; + if (requestBody != null && !isMultiPartRequest) { + var contentLength = utf8.encode(requestBody).length; + if (contentLength > 0) { + body = requestBody; + headers[HttpHeaders.contentLengthHeader] = + contentLength.toString(); + if (!requestModel.hasContentTypeHeader) { + headers[HttpHeaders.contentTypeHeader] = + requestModel.bodyContentType.header; + } + } + } + if (isMultiPartRequest) { + var multiPartRequest = http.MultipartRequest( + requestModel.method.name.toUpperCase(), + requestUrl, + ); + multiPartRequest.headers.addAll(headers); + for (var formData in requestModel.formDataList) { + if (formData.type == FormDataType.text) { + multiPartRequest.fields.addAll({formData.name: formData.value}); + } else { + multiPartRequest.files.add( + await http.MultipartFile.fromPath( + formData.name, + formData.value, + ), + ); + } + } + http.StreamedResponse multiPartResponse = + await multiPartRequest.send(); + stopwatch.stop(); + http.Response convertedMultiPartResponse = + await convertStreamedResponse(multiPartResponse); + return (convertedMultiPartResponse, stopwatch.elapsed, null); + } + } + switch (requestModel.method) { + case HTTPVerb.get: + response = await client.get(requestUrl, headers: headers); + break; + case HTTPVerb.head: + response = await client.head(requestUrl, headers: headers); + break; + case HTTPVerb.post: + response = + await client.post(requestUrl, headers: headers, body: body); + break; + case HTTPVerb.put: + response = + await client.put(requestUrl, headers: headers, body: body); + break; + case HTTPVerb.patch: + response = + await client.patch(requestUrl, headers: headers, body: body); + break; + case HTTPVerb.delete: + response = + await client.delete(requestUrl, headers: headers, body: body); + break; + } + } + if (apiType == APIType.graphql) { + var requestBody = getGraphQLBody(requestModel); + if (requestBody != null) { var contentLength = utf8.encode(requestBody).length; if (contentLength > 0) { body = requestBody; headers[HttpHeaders.contentLengthHeader] = contentLength.toString(); if (!requestModel.hasContentTypeHeader) { - headers[HttpHeaders.contentTypeHeader] = - requestModel.bodyContentType.header; + headers[HttpHeaders.contentTypeHeader] = ContentType.json.header; } } } - if (isMultiPartRequest) { - var multiPartRequest = http.MultipartRequest( - requestModel.method.name.toUpperCase(), - requestUrl, - ); - multiPartRequest.headers.addAll(headers); - for (var formData in requestModel.formDataList) { - if (formData.type == FormDataType.text) { - multiPartRequest.fields.addAll({formData.name: formData.value}); - } else { - multiPartRequest.files.add( - await http.MultipartFile.fromPath( - formData.name, - formData.value, - ), - ); - } - } - http.StreamedResponse multiPartResponse = - await multiPartRequest.send(); - stopwatch.stop(); - http.Response convertedMultiPartResponse = - await convertStreamedResponse(multiPartResponse); - return (convertedMultiPartResponse, stopwatch.elapsed, null); - } - } - switch (requestModel.method) { - case HTTPVerb.get: - response = await client.get(requestUrl, headers: headers); - break; - case HTTPVerb.head: - response = await client.head(requestUrl, headers: headers); - break; - case HTTPVerb.post: - response = - await client.post(requestUrl, headers: headers, body: body); - break; - case HTTPVerb.put: - response = await client.put(requestUrl, headers: headers, body: body); - break; - case HTTPVerb.patch: - response = - await client.patch(requestUrl, headers: headers, body: body); - break; - case HTTPVerb.delete: - response = - await client.delete(requestUrl, headers: headers, body: body); - break; + response = await client.post( + requestUrl, + headers: headers, + body: body, + ); } stopwatch.stop(); return (response, stopwatch.elapsed, null); diff --git a/packages/apidash_core/lib/utils/graphql_utils.dart b/packages/apidash_core/lib/utils/graphql_utils.dart new file mode 100644 index 00000000..afa874bf --- /dev/null +++ b/packages/apidash_core/lib/utils/graphql_utils.dart @@ -0,0 +1,11 @@ +import '../consts.dart'; +import '../models/models.dart'; + +String? getGraphQLBody(HttpRequestModel httpRequestModel) { + if (httpRequestModel.hasQuery) { + return kJsonEncoder.convert({ + "query": httpRequestModel.query, + }); + } + return null; +} diff --git a/packages/apidash_core/lib/utils/http_request_utils.dart b/packages/apidash_core/lib/utils/http_request_utils.dart index 2e1daea5..7a912ac1 100644 --- a/packages/apidash_core/lib/utils/http_request_utils.dart +++ b/packages/apidash_core/lib/utils/http_request_utils.dart @@ -1,5 +1,8 @@ +import 'package:apidash_core/consts.dart'; import 'package:collection/collection.dart'; import 'package:seed/seed.dart'; +import '../models/models.dart'; +import 'graphql_utils.dart'; Map? rowsToMap( List? kvRows, { @@ -88,3 +91,13 @@ List? getEnabledRows( rows.where((element) => isRowEnabledList[rows.indexOf(element)]).toList(); return finalRows == [] ? null : finalRows; } + +String? getRequestBody(APIType type, HttpRequestModel httpRequestModel) { + return switch (type) { + APIType.rest => + (httpRequestModel.hasJsonData || httpRequestModel.hasTextData) + ? httpRequestModel.body + : null, + APIType.graphql => getGraphQLBody(httpRequestModel), + }; +} diff --git a/packages/apidash_core/lib/utils/utils.dart b/packages/apidash_core/lib/utils/utils.dart index 201d4d64..f39e563d 100644 --- a/packages/apidash_core/lib/utils/utils.dart +++ b/packages/apidash_core/lib/utils/utils.dart @@ -1,4 +1,5 @@ export 'content_type_utils.dart'; +export 'graphql_utils.dart'; export 'http_request_utils.dart'; export 'http_response_utils.dart'; export 'string_utils.dart';