mirror of
https://github.com/foss42/apidash.git
synced 2025-08-06 05:32:26 +08:00
feat: added http and dio code gen
This commit is contained in:
@ -1,7 +1,9 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:apidash/consts.dart';
|
||||
import 'package:apidash/models/models.dart' show RequestModel;
|
||||
import 'package:apidash/utils/convert_utils.dart';
|
||||
import 'package:code_builder/code_builder.dart';
|
||||
import 'package:dart_style/dart_style.dart';
|
||||
|
||||
@ -24,6 +26,7 @@ class DartHttpCodeGen {
|
||||
headers: requestModel.headersMap,
|
||||
body: requestModel.requestBody,
|
||||
contentType: requestModel.requestBodyContentType,
|
||||
formData: rowsToFormDataMap(requestModel.formDataList) ?? [],
|
||||
);
|
||||
return next;
|
||||
} catch (e) {
|
||||
@ -38,6 +41,7 @@ class DartHttpCodeGen {
|
||||
required Map<String, String> headers,
|
||||
required String? body,
|
||||
required ContentType contentType,
|
||||
required List<Map<String, dynamic>> formData,
|
||||
}) {
|
||||
final uri = Uri.parse(url);
|
||||
|
||||
@ -99,7 +103,9 @@ class DartHttpCodeGen {
|
||||
);
|
||||
}
|
||||
final responseExp = declareFinal('response').assign(InvokeExpression.newOf(
|
||||
refer('http.${method.name}'),
|
||||
refer(
|
||||
'http.${method.name}',
|
||||
),
|
||||
[refer('uri')],
|
||||
{
|
||||
if (headerExp != null) 'headers': refer('headers'),
|
||||
@ -107,7 +113,36 @@ class DartHttpCodeGen {
|
||||
},
|
||||
[],
|
||||
).awaited);
|
||||
final multiPartRequest =
|
||||
declareFinal('request').assign(InvokeExpression.newOf(
|
||||
refer(
|
||||
'http.MultipartRequest',
|
||||
),
|
||||
[refer(jsonEncode(method.name.toUpperCase())), refer('uri')],
|
||||
));
|
||||
final multiPartFiles = declareFinal('formDataList').assign(refer(
|
||||
jsonEncode(formData),
|
||||
));
|
||||
|
||||
final addHeaders = refer('request.headers.addAll').call([refer('headers')]);
|
||||
const multiPartList = Code('''
|
||||
for (Map<String, String> formData in formDataList){
|
||||
if (formData['type'] == 'text') {
|
||||
request.fields.addAll({formData['name']: formData['value']});
|
||||
} else {
|
||||
request.files.add(
|
||||
await http.MultipartFile.fromPath(
|
||||
formData['name'],
|
||||
formData['value'],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
''');
|
||||
var multiPartRequestSend =
|
||||
declareFinal('response').assign(refer('request.send()').awaited);
|
||||
var multiPartResponseBody = declareFinal('responseBody')
|
||||
.assign(refer('response.stream.bytesToString()').awaited);
|
||||
final mainFunction = Method((m) {
|
||||
final statusRef = refer('statusCode');
|
||||
m
|
||||
@ -132,25 +167,49 @@ class DartHttpCodeGen {
|
||||
b.statements.add(headerExp.statement);
|
||||
}
|
||||
b.statements.add(const Code('\n'));
|
||||
b.statements.add(responseExp.statement);
|
||||
b.statements.add(const Code('\n'));
|
||||
b.statements.add(declareVar('statusCode', type: refer('int'))
|
||||
.assign(refer('response').property('statusCode'))
|
||||
.statement);
|
||||
if (contentType == ContentType.formdata) {
|
||||
if (formData.isNotEmpty) {
|
||||
b.statements.add(multiPartFiles.statement);
|
||||
}
|
||||
b.statements.add(multiPartRequest.statement);
|
||||
if (formData.isNotEmpty) {
|
||||
b.statements.add(multiPartList);
|
||||
}
|
||||
if (headerExp != null) {
|
||||
b.statements.add(addHeaders.statement);
|
||||
}
|
||||
b.statements.add(multiPartRequestSend.statement);
|
||||
b.statements.add(multiPartResponseBody.statement);
|
||||
b.statements.add(declareVar('statusCode', type: refer('int'))
|
||||
.assign(refer('response').property('statusCode'))
|
||||
.statement);
|
||||
b.statements.add(const Code('\n'));
|
||||
} else {
|
||||
b.statements.add(responseExp.statement);
|
||||
b.statements.add(const Code('\n'));
|
||||
b.statements.add(declareVar('statusCode', type: refer('int'))
|
||||
.assign(refer('response').property('statusCode'))
|
||||
.statement);
|
||||
}
|
||||
|
||||
b.statements.add(declareIfElse(
|
||||
condition: statusRef
|
||||
.greaterOrEqualTo(literalNum(200))
|
||||
.and(statusRef.lessThan(literalNum(300))),
|
||||
body: [
|
||||
refer('print').call([literalString(r'Status Code: $statusCode')]),
|
||||
refer('print')
|
||||
.call([literalString(r'Response Body: ${response.body}')]),
|
||||
refer('print').call([
|
||||
literalString(
|
||||
'Response Body: ${contentType == ContentType.formdata ? ':\$responseBody' : '\${response.body}'}')
|
||||
]),
|
||||
],
|
||||
elseBody: [
|
||||
refer('print')
|
||||
.call([literalString(r'Error Status Code: $statusCode')]),
|
||||
refer('print').call(
|
||||
[literalString(r'Error Response Body: ${response.body}')]),
|
||||
refer('print').call([
|
||||
literalString(
|
||||
'Error Response Body: ${contentType == ContentType.formdata ? ':\$responseBody' : '\${response.body}'}')
|
||||
]),
|
||||
],
|
||||
));
|
||||
});
|
||||
@ -158,6 +217,8 @@ class DartHttpCodeGen {
|
||||
|
||||
sbf.writeln(mainFunction.accept(emitter));
|
||||
|
||||
return DartFormatter(pageWidth: 160).format(sbf.toString());
|
||||
return DartFormatter(
|
||||
pageWidth: contentType == ContentType.formdata ? 70 : 160)
|
||||
.format(sbf.toString());
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user