mirror of
https://github.com/foss42/apidash.git
synced 2025-05-22 16:57:07 +08:00
Feat: python http.client codegen
This commit is contained in:
@ -1,82 +1,144 @@
|
||||
import 'dart:io';
|
||||
import 'dart:convert';
|
||||
import 'package:jinja/jinja.dart' as jj;
|
||||
import 'package:apidash/consts.dart';
|
||||
|
||||
import '../../models/request_model.dart';
|
||||
import 'package:apidash/utils/utils.dart'
|
||||
show getValidRequestUri, padMultilineString, rowsToMap;
|
||||
import 'package:apidash/models/models.dart' show RequestModel;
|
||||
|
||||
class PythonHttpClient {
|
||||
final String headerSnippet = """
|
||||
import http.client
|
||||
import json
|
||||
final String kTemplateStart = """import http.client
|
||||
""";
|
||||
|
||||
String kTemplateParams = """
|
||||
from urllib.parse import urlencode
|
||||
|
||||
queryParams = {{params}}
|
||||
queryParamsStr = '?' + urlencode(queryParams)
|
||||
|
||||
""";
|
||||
int kParamsPadding = 14;
|
||||
|
||||
String kTemplateBody = """
|
||||
|
||||
body = r'''{{body}}'''
|
||||
|
||||
""";
|
||||
|
||||
final String footerSnippet = """
|
||||
String kTemplateHeaders = """
|
||||
|
||||
headers = {{headers}}
|
||||
|
||||
""";
|
||||
|
||||
int kHeadersPadding = 10;
|
||||
|
||||
String kTemplateConnection = """
|
||||
|
||||
conn = http.client.HTTP{{isHttps}}Connection("{{authority}}")""";
|
||||
|
||||
String kTemplateRequest = """
|
||||
|
||||
conn.request("{{method}}", "{{path}}"{{queryParamsStr}}""";
|
||||
|
||||
String kStringRequestBody = """,
|
||||
body= body""";
|
||||
|
||||
String kStringRequestHeaders = """,
|
||||
headers= headers""";
|
||||
|
||||
final String kStringRequestEnd = """)
|
||||
|
||||
res = conn.getresponse()
|
||||
data = res.read()
|
||||
|
||||
print(data.decode("utf-8"))
|
||||
""";
|
||||
|
||||
String getCode(RequestModel requestModel) {
|
||||
String result = "";
|
||||
result += headerSnippet;
|
||||
result +=
|
||||
"conn = http.client.HTTPSConnection('${getUrl(requestModel)["host"]}'${getUrl(requestModel)["port"]})\n";
|
||||
result += "payload = json.dumps(${requestModel.requestBody ?? ""})\n";
|
||||
result +=
|
||||
"""headers = {\n'Content-Type':'${requestModel.requestBodyContentType == ContentType.json ? 'application/json' : 'text/plain'}'\n${addHeaders(requestModel)}},\n""";
|
||||
result +=
|
||||
"conn.request(\"${requestModel.method.name.toUpperCase()}\", \"${getUrl(requestModel)["endpoint"]}${addQueryParams(requestModel)}\", payload, headers)\n";
|
||||
result += footerSnippet;
|
||||
String? getCode(
|
||||
RequestModel requestModel,
|
||||
String defaultUriScheme,
|
||||
) {
|
||||
try {
|
||||
String result = "";
|
||||
bool hasHeaders = false;
|
||||
bool hasBody = false;
|
||||
|
||||
return result;
|
||||
}
|
||||
String url = requestModel.url;
|
||||
if (!url.contains("://") && url.isNotEmpty) {
|
||||
url = "$defaultUriScheme://$url";
|
||||
}
|
||||
|
||||
String addHeaders(RequestModel requestModel) {
|
||||
String result = "";
|
||||
if (requestModel.requestHeaders == null) {
|
||||
result += kTemplateStart;
|
||||
var rec = getValidRequestUri(url, requestModel.requestParams);
|
||||
Uri? uri = rec.$1;
|
||||
|
||||
if (uri != null) {
|
||||
if (uri.hasQuery) {
|
||||
var params = uri.queryParameters;
|
||||
if (params.isNotEmpty) {
|
||||
var templateParams = jj.Template(kTemplateParams);
|
||||
var paramsString = kEncoder.convert(params);
|
||||
paramsString = padMultilineString(paramsString, kParamsPadding);
|
||||
result += templateParams.render({"params": paramsString});
|
||||
}
|
||||
}
|
||||
|
||||
var method = requestModel.method;
|
||||
var requestBody = requestModel.requestBody;
|
||||
if (kMethodsWithBody.contains(method) && requestBody != null) {
|
||||
var contentLength = utf8.encode(requestBody).length;
|
||||
if (contentLength > 0) {
|
||||
hasBody = true;
|
||||
var templateBody = jj.Template(kTemplateBody);
|
||||
result += templateBody.render({"body": requestBody});
|
||||
}
|
||||
}
|
||||
|
||||
var headersList = requestModel.requestHeaders;
|
||||
if (headersList != null || hasBody) {
|
||||
var headers = rowsToMap(requestModel.requestHeaders) ?? {};
|
||||
if (headers.isNotEmpty || hasBody) {
|
||||
hasHeaders = true;
|
||||
if (hasBody) {
|
||||
headers[HttpHeaders.contentTypeHeader] =
|
||||
kContentTypeMap[requestModel.requestBodyContentType] ?? "";
|
||||
}
|
||||
var headersString = kEncoder.convert(headers);
|
||||
headersString = padMultilineString(headersString, kHeadersPadding);
|
||||
var templateHeaders = jj.Template(kTemplateHeaders);
|
||||
result += templateHeaders.render({"headers": headersString});
|
||||
}
|
||||
}
|
||||
|
||||
var templateConnection = jj.Template(kTemplateConnection);
|
||||
result += templateConnection.render({
|
||||
"isHttps": uri.scheme == "https" ? "S" : "",
|
||||
"authority": uri.authority
|
||||
});
|
||||
|
||||
var templateRequest = jj.Template(kTemplateRequest);
|
||||
result += templateRequest.render({
|
||||
"method": method.name.toUpperCase(),
|
||||
"path": uri.path,
|
||||
"queryParamsStr": (uri.hasQuery && uri.queryParameters.isNotEmpty)
|
||||
? " + queryParamsStr"
|
||||
: "",
|
||||
});
|
||||
|
||||
if (hasBody) {
|
||||
result += kStringRequestBody;
|
||||
}
|
||||
|
||||
if (hasHeaders) {
|
||||
result += kStringRequestHeaders;
|
||||
}
|
||||
|
||||
result += kStringRequestEnd;
|
||||
}
|
||||
return result;
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
for (final header in requestModel.requestHeaders!) {
|
||||
result += """'${header.name}':'${header.value}',\n""";
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
String addQueryParams(RequestModel requestModel) {
|
||||
String result = "";
|
||||
if (requestModel.requestParams == null) {
|
||||
return result;
|
||||
}
|
||||
result += "?";
|
||||
for (final queryParam in requestModel.requestParams!) {
|
||||
result +=
|
||||
"${queryParam.name.toString().replaceAll(" ", "%20")}=${queryParam.value.toString().replaceAll(" ", "%20")}&";
|
||||
}
|
||||
return result.substring(0, result.length - 1);
|
||||
}
|
||||
|
||||
Map<String, String> getUrl(RequestModel requestModel) {
|
||||
String result = "";
|
||||
if (requestModel.url.startsWith('http://') ||
|
||||
requestModel.url.startsWith('https://')) {
|
||||
result = requestModel.url.substring(requestModel.url.indexOf('://') + 3);
|
||||
} else {
|
||||
result = requestModel.url;
|
||||
}
|
||||
Map<String, String> resultMap = {};
|
||||
if (result.contains(":")) {
|
||||
resultMap["host"] = result.substring(0, result.indexOf(':'));
|
||||
resultMap["port"] =
|
||||
",${result.substring(result.indexOf(':') + 1, result.contains('/') ? result.indexOf('/') : result.length)}";
|
||||
resultMap["endpoint"] =
|
||||
"/${result.substring(result.contains('/') ? result.indexOf('/') + 1 : result.length)}";
|
||||
} else {
|
||||
resultMap["host"] = result.contains("/")
|
||||
? result.substring(0, result.indexOf('/'))
|
||||
: result;
|
||||
resultMap["port"] = "";
|
||||
resultMap["endpoint"] =
|
||||
"/${result.substring(result.contains('/') ? result.indexOf('/') + 1 : result.length)}";
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user