mirror of
https://github.com/foss42/apidash.git
synced 2025-05-23 17:26:45 +08:00
153 lines
4.5 KiB
Dart
153 lines
4.5 KiB
Dart
import 'package:apidash/consts.dart';
|
|
import 'package:apidash/models/models.dart';
|
|
import 'package:apidash/utils/utils.dart' show getValidRequestUri;
|
|
import 'package:jinja/jinja.dart' as jj;
|
|
|
|
class SwiftURLSessionCodeGen {
|
|
final String kTemplateStart = """
|
|
import Foundation
|
|
|
|
""";
|
|
|
|
final String kTemplateFormData = '''
|
|
let parameters = [
|
|
{% for param in formData %}
|
|
[
|
|
"key": "{{param.name}}",
|
|
"value": "{{param.value}}",
|
|
"type": "{{param.type}}"{% if param.contentType %},
|
|
"contentType": "{{param.contentType}}"{% endif %}
|
|
],
|
|
{% endfor %}
|
|
] as [[String: Any]]
|
|
let boundary = "Boundary-\\(UUID().uuidString)"
|
|
var body = Data()
|
|
var error: Error? = nil
|
|
for param in parameters {
|
|
if param["disabled"] as? Bool == true { continue }
|
|
let paramName = param["key"] as! String
|
|
body.append("--\\(boundary)\\r\\n".data(using: .utf8)!)
|
|
body.append("Content-Disposition:form-data; name=\\"\\(paramName)\\"".data(using: .utf8)!)
|
|
if let contentType = param["contentType"] as? String {
|
|
body.append("\\r\\nContent-Type: \\(contentType)".data(using: .utf8)!)
|
|
}
|
|
let paramType = param["type"] as! String
|
|
if paramType == "text" {
|
|
let paramValue = param["value"] as! String
|
|
body.append("\\r\\n\\r\\n\\(paramValue)\\r\\n".data(using: .utf8)!)
|
|
} else if paramType == "file" {
|
|
let paramSrc = param["value"] as! String
|
|
let fileURL = URL(fileURLWithPath: paramSrc)
|
|
if let fileContent = try? Data(contentsOf: fileURL) {
|
|
body.append("; filename=\\"\\(paramSrc)\\"\\r\\n".data(using: .utf8)!)
|
|
body.append("Content-Type: \\"content-type header\\"\\r\\n\\r\\n".data(using: .utf8)!)
|
|
body.append(fileContent)
|
|
body.append("\\r\\n".data(using: .utf8)!)
|
|
}
|
|
}
|
|
}
|
|
body.append("--\\(boundary)--\\r\\n".data(using: .utf8)!)
|
|
let postData = body
|
|
|
|
''';
|
|
|
|
final String kTemplateJsonData = '''
|
|
let parameters = "{{jsonData}}"
|
|
let postData = parameters.data(using: .utf8)
|
|
|
|
''';
|
|
|
|
final String kTemplateTextData = '''
|
|
let parameters = "{{textData}}"
|
|
let postData = parameters.data(using: .utf8)
|
|
|
|
''';
|
|
|
|
final String kTemplateRequest = """
|
|
var request = URLRequest(url: URL(string: "{{url}}")!,timeoutInterval: Double.infinity)
|
|
request.httpMethod = "{{method}}"
|
|
|
|
""";
|
|
|
|
final String kTemplateHeaders = """
|
|
{% for header, value in headers %}
|
|
request.addValue("{{value}}", forHTTPHeaderField: "{{header}}")
|
|
{% endfor %}
|
|
|
|
""";
|
|
|
|
final String kTemplateBody = """
|
|
request.httpBody = postData
|
|
|
|
""";
|
|
|
|
final String kTemplateEnd = """
|
|
let task = URLSession.shared.dataTask(with: request) { data, response, error in
|
|
guard let data = data else {
|
|
print(String(describing: error))
|
|
return
|
|
}
|
|
print(String(data: data, encoding: .utf8)!)
|
|
}
|
|
task.resume()
|
|
""";
|
|
|
|
String? getCode(HttpRequestModel requestModel) {
|
|
try {
|
|
String result = kTemplateStart;
|
|
|
|
var rec =
|
|
getValidRequestUri(requestModel.url, requestModel.enabledParams);
|
|
Uri? uri = rec.$1;
|
|
|
|
if (requestModel.hasFormData) {
|
|
var templateFormData = jj.Template(kTemplateFormData);
|
|
result += templateFormData.render({
|
|
"formData": requestModel.formDataMapList,
|
|
});
|
|
} else if (requestModel.hasJsonData) {
|
|
var templateJsonData = jj.Template(kTemplateJsonData);
|
|
result += templateJsonData.render({
|
|
"jsonData":
|
|
requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'),
|
|
});
|
|
} else if (requestModel.hasTextData) {
|
|
var templateTextData = jj.Template(kTemplateTextData);
|
|
result += templateTextData.render({
|
|
"textData":
|
|
requestModel.body!.replaceAll('"', '\\"').replaceAll('\n', '\\n'),
|
|
});
|
|
}
|
|
|
|
var templateRequest = jj.Template(kTemplateRequest);
|
|
result += templateRequest.render({
|
|
"url": uri.toString(),
|
|
"method": requestModel.method.name.toUpperCase()
|
|
});
|
|
|
|
var headers = requestModel.enabledHeadersMap;
|
|
if (requestModel.hasFormData) {
|
|
headers.putIfAbsent(kHeaderContentType,
|
|
() => "multipart/form-data; boundary=\\(boundary)");
|
|
} else if (requestModel.hasJsonData || requestModel.hasTextData) {
|
|
headers.putIfAbsent(
|
|
kHeaderContentType, () => requestModel.bodyContentType.header);
|
|
}
|
|
if (headers.isNotEmpty) {
|
|
var templateHeader = jj.Template(kTemplateHeaders);
|
|
result += templateHeader.render({"headers": headers});
|
|
}
|
|
|
|
if (requestModel.hasBody) {
|
|
result += kTemplateBody;
|
|
}
|
|
|
|
result += kTemplateEnd;
|
|
|
|
return result;
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
}
|