Skip to content

support for params having multiple values #681

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 33 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
36ad610
changes made
badnikhil Mar 19, 2025
5d291f1
Codegen updated for dart(http/dio)
badnikhil Mar 19, 2025
9524393
Updated GO
badnikhil Mar 20, 2025
bc4b5fb
Updated C#
badnikhil Mar 21, 2025
10f3ac3
updated js
badnikhil Mar 21, 2025
34485a2
Updated Swift
badnikhil Mar 23, 2025
d33bcd6
fix swift
badnikhil Mar 23, 2025
d892595
Merge branch 'foss42:main' into resolve-issue-166
badnikhil Mar 23, 2025
a67f33b
Updated Java
badnikhil Mar 24, 2025
654a672
julia
badnikhil Mar 24, 2025
60f7b38
kotlin
badnikhil Mar 24, 2025
edc05e8
Merge branch 'main' into resolve-issue-166
badnikhil Apr 2, 2025
883e71e
php
badnikhil Apr 3, 2025
c6f60b4
pythom
badnikhil Apr 3, 2025
5e77e6c
python - httpclient
badnikhil Apr 3, 2025
4e9d709
rust-actix-hyper
badnikhil Apr 3, 2025
d5d7d57
rust all
badnikhil Apr 3, 2025
c7b3b30
ruby
badnikhil Apr 4, 2025
17ea029
datatype changes
badnikhil Apr 6, 2025
97caa07
Merge branch 'main' into resolve-issue-166
badnikhil Apr 10, 2025
8a71c90
updated datatypes
badnikhil Apr 10, 2025
9a149cb
Merge branch 'resolve-issue-166'
badnikhil Apr 10, 2025
474fb10
Merge branch 'foss42:main' into resolve-issue-166
badnikhil Apr 12, 2025
6114b27
Merge branch 'foss42:main' into resolve-issue-166
badnikhil Apr 21, 2025
4ed8b48
Merge branch 'main' into resolve-issue-166
badnikhil Apr 25, 2025
d212e86
Merge branch 'foss42:main' into resolve-issue-166
badnikhil Apr 27, 2025
419d249
Merge branch 'foss42:main' into resolve-issue-166
badnikhil May 10, 2025
a14bc69
updated test
badnikhil May 10, 2025
5fae77d
Update codegen.dart
badnikhil May 11, 2025
31a236d
Update main.dart
badnikhil May 11, 2025
eecf617
Update main.dart
badnikhil May 11, 2025
b79392a
Merge pull request #2 from badnikhil/badnikhil-patch-2
badnikhil May 11, 2025
f19e84b
minor optimisation/fixes in codegen
badnikhil May 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 39 additions & 20 deletions lib/codegen/csharp/http_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,32 @@ class CSharpHttpClientCodeGen {
final String kTemplateNamespaces = r'''
using System;
using System.Net.Http;
using System.Collections.Generic;
using System.Linq;
{%- if formdata == 'multipart' %}
using System.IO;
{%- elif formdata == 'urlencoded' %}
using System.Collections.Generic;
{%- endif %}

''';

final String kTemplateUri = '''
string uri = "{{ uri }}";

final String kTemplateQueryParams = '''
string baseUri = "{{ baseUri }}";

var query = new Dictionary<string, List<string>>();
{%- for key, values in queryParams %}
query["{{ key }}"] = new List<string>();
{%- for value in values %}
query["{{ key }}"].Add("{{ value }}");
{%- endfor %}
{%- endfor %}

var queryString = string.Join("&", query.SelectMany(kv => kv.Value.Select(v => string.Format("{0}={1}", kv.Key, v))));
string uri = string.Format("{0}?{1}", baseUri, queryString);
''';



final String kTemplateHttpClientAndRequest = '''
using (var client = new HttpClient())
using (var request = new HttpRequestMessage(HttpMethod.{{ method | capitalize }}, uri))
Expand Down Expand Up @@ -81,17 +94,23 @@ using (var request = new HttpRequestMessage(HttpMethod.{{ method | capitalize }}
StringBuffer result = StringBuffer();

// Include necessary C# namespace
String formdataImport = requestModel.hasFormData
? "multipart" //(requestModel.hasFileInFormData ? "multipart" : "urlencoded")
: "nodata";
String formdataImport = requestModel.hasFormData
? "multipart" //(requestModel.hasFileInFormData ? "multipart" : "urlencoded")
: "nodata";
result.writeln(jj.Template(kTemplateNamespaces)
.render({"formdata": formdataImport}));

// Set request URL
var (uri, _) =
getValidRequestUri(requestModel.url, requestModel.enabledParams);
if (uri != null) {
result.writeln(jj.Template(kTemplateUri).render({"uri": uri}));
.render({"formdata": formdataImport}));

// Extract query parameters and URL
String baseUri = requestModel.url.split('?')[0];
var queryParams = requestModel.enabledParamsMap;

if (queryParams.isNotEmpty) {
result.writeln(jj.Template(kTemplateQueryParams).render({
"baseUri": baseUri,
"queryParams": queryParams,
}));
} else {
result.writeln('string uri = "$baseUri";\n');
}

// Initialize HttpClient and create HttpRequestMessage
Expand All @@ -103,18 +122,18 @@ using (var request = new HttpRequestMessage(HttpMethod.{{ method | capitalize }}
var headers = requestModel.enabledHeadersMap;
if (headers.isNotEmpty) {
result.writeln(
jj.Template(kTemplateHeaders).render({"headers": headers}));
jj.Template(kTemplateHeaders).render({"headers": headers}));
}

// Set request body if exists
if (kMethodsWithBody.contains(requestModel.method) &&
requestModel.hasBody) {
requestModel.hasBody) {
var requestBody = requestModel.body;

if (!requestModel.hasFormData &&
requestBody != null &&
requestBody.isNotEmpty) {
// if the request body is not formdata then render raw text body
requestBody != null &&
requestBody.isNotEmpty) {
// if the request body is not formdata then render raw text body
result.writeln(jj.Template(kTemplateRawBody).render({
"body": requestBody,
"mediaType": requestModel.bodyContentType.header,
Expand All @@ -133,7 +152,7 @@ using (var request = new HttpRequestMessage(HttpMethod.{{ method | capitalize }}
result.writeln(kStringContentSetup);
}

// Send request and get response
// Send request and get response
result.write(kStringEnd);
return result.toString();
} catch (e) {
Expand Down
21 changes: 11 additions & 10 deletions lib/codegen/csharp/rest_sharp.dart
Original file line number Diff line number Diff line change
Expand Up @@ -113,19 +113,20 @@ class Program
});
result += methodType;

if (uri.hasQuery) {
var params = uri.queryParameters;
if (params.isNotEmpty) {
jj.Template templateParams = jj.Template(kTemplateParams);
String paramsResult = "";
for (var item in params.entries) {
paramsResult += templateParams
.render({"param": item.key, "value": item.value});
if (requestModel.enabledParamsMap.isNotEmpty) {
jj.Template templateParams = jj.Template(kTemplateParams);
String paramsResult = "";

requestModel.enabledParamsMap.forEach((key, values) {
for (var value in values) {
paramsResult += templateParams.render({"param": key, "value": value});
}
result += "$paramsResult\n";
}
});

result += "$paramsResult\n";
}


var headersList = requestModel.enabledHeaders;
if (headersList != null ||
requestModel.hasJsonData ||
Expand Down
7 changes: 4 additions & 3 deletions lib/codegen/dart/dio.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class DartDioCodeGen {
String generatedDartCode({
required String url,
required HTTPVerb method,
required Map<String, String> queryParams,
required Map<String, dynamic> queryParams,
required Map<String, String> headers,
required String? body,
required ContentType contentType,
Expand Down Expand Up @@ -87,11 +87,12 @@ class DartDioCodeGen {
dataExp = declareFinal('data').assign(refer('dio.FormData()'));
}
}
final parsedUrl = url.split('?').first;
final responseExp = declareFinal('response').assign(InvokeExpression.newOf(
refer('dio.Dio()'),
[literalString(url)],
[literalString(parsedUrl)],
{
if (queryParamExp != null) 'queryParameters': refer('queryParams'),
if (queryParamExp != null) 'queryParameters': refer('queryParams'),
if (headerExp != null)
'options': refer('dio.Options').newInstance(
[],
Expand Down
10 changes: 5 additions & 5 deletions lib/codegen/dart/http.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class DartHttpCodeGen {
String generatedDartCode({
required String url,
required HTTPVerb method,
required Map<String, String> queryParams,
required Map<String, dynamic> queryParams,
required Map<String, String> headers,
required ContentType contentType,
required String? body,
Expand All @@ -43,9 +43,9 @@ class DartHttpCodeGen {
final emitter = DartEmitter();
final dioImport = Directive.import('package:http/http.dart', as: 'http');
sbf.writeln(dioImport.accept(emitter));

final parsedUrl = url.split('?').first;
final uriExp =
declareVar('uri').assign(refer('Uri.parse').call([literalString(url)]));
declareVar('uri').assign(refer('Uri.parse').call([literalString(parsedUrl)]));

Expression? dataExp;
if (kMethodsWithBody.contains(method) &&
Expand All @@ -61,7 +61,7 @@ class DartHttpCodeGen {

Expression? queryParamExp;
List<Expression>? uriReassignExps;
// var urlQueryParams = Map<String,String>.from(uri.queryParameters);
// var urlQueryParams = Map<String,dynamic>.from(uri.queryParameters);
// urlQueryParams.addAll(queryParams);
// uri = uri.replace(queryParameters: urlQueryParams);

Expand All @@ -74,7 +74,7 @@ class DartHttpCodeGen {
if (uri.hasQuery)
declareVar('urlQueryParams').assign(
InvokeExpression.newOf(
refer('Map<String,String>'),
refer('Map<String,dynamic>'),
[refer('uri.queryParameters')],
{},
[],
Expand Down
27 changes: 15 additions & 12 deletions lib/codegen/go/http.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,15 @@ func main() {
""";

String kTemplateQueryParam = """
query := url.Query()
{% for key, value in params %}
query.Set("{{key}}", "{{value}}"){% endfor %}
query := url.Query()
{% for param in params %}
query.Add("{{param.key}}", "{{param.value}}"){% endfor %}

url.RawQuery = query.Encode()
url.RawQuery = query.Encode()

""";


String kTemplateRequest = """
req, _ := http.NewRequest("{{method}}", url.String(), {% if hasBody %}payload{% else %}nil{% endif %})

Expand Down Expand Up @@ -102,7 +103,7 @@ func main() {
});

var templateUrl = jj.Template(kTemplateUrl);
result += templateUrl.render({"url": url});
result += templateUrl.render({"url": url.split('?').first});

var rec = getValidRequestUri(
url,
Expand All @@ -124,15 +125,17 @@ func main() {
"fields": requestModel.formDataMapList,
});
}

if (uri.hasQuery) {
var params = uri.queryParameters;
if (params.isNotEmpty) {
var templateQueryParam = jj.Template(kTemplateQueryParam);
result += templateQueryParam.render({"params": params});
}
if (requestModel.enabledParamsMap.isNotEmpty) {
var queryParams = [];
requestModel.enabledParamsMap.forEach((key, value) {
for (var v in value) {
queryParams.add({'key': key, 'value': v});
}
});

var templateQueryParam = jj.Template(kTemplateQueryParam);
result += templateQueryParam.render({"params": queryParams});
}
var method = requestModel.method.name.toUpperCase();
var templateRequest = jj.Template(kTemplateRequest);
result += templateRequest.render({
Expand Down
11 changes: 5 additions & 6 deletions lib/codegen/java/async_http_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,13 @@ public class Main {
''';

final String kTemplateRequestCreation = '''
BoundRequestBuilder requestBuilder = asyncHttpClient.prepare("{{ method|upper }}", url);\n
BoundRequestBuilder requestBuilder = asyncHttpClient.prepare("{{ method|upper }}", url);
''';

final String kTemplateUrlQueryParam = '''
requestBuilder{% for name, value in queryParams %}
.addQueryParam("{{ name }}", "{{ value }}"){% endfor %};\n
final String kTemplateUrlQueryParam = '''
{% for name, value in queryParams %} {% for v in value %}
requestBuilder.addQueryParam("{{ name }}", "{{ v }}"); {% endfor %}{% endfor %}\n
''';

final String kTemplateRequestHeader = '''
requestBuilder{% for name, value in headers %}
.addHeader("{{ name }}", "{{ value }}"){% endfor %};\n
Expand Down Expand Up @@ -158,7 +157,7 @@ public class Main {
result += templateRequestCreation.render({"method": method.name});

// setting up query parameters
var params = uri.queryParameters;
var params = requestModel.enabledParamsMap;
if (params.isNotEmpty) {
var templateUrlQueryParam = jj.Template(kTemplateUrlQueryParam);
result += templateUrlQueryParam.render({"queryParams": params});
Expand Down
24 changes: 9 additions & 15 deletions lib/codegen/java/okhttp.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,16 @@ import okhttp3.MultipartBody;""";

''';

final String kTemplateUrlQuery = '''
final String kTemplateUrlQuery = '''
HttpUrl.Builder urlBuilder = HttpUrl.parse("{{url}}").newBuilder();
{% for name, value in queryParams %}{% for v in value %}
urlBuilder.addQueryParameter("{{ name }}", "{{ v }}");{% endfor %}{% endfor %}
HttpUrl url = urlBuilder.build();
''';

HttpUrl url = HttpUrl.parse("{{url}}").newBuilder()
{{params}}
.build();

''';

String kTemplateRequestBody = '''

MediaType mediaType = MediaType.parse("{{contentType}}");

RequestBody body = RequestBody.create({{body}}, mediaType);
Expand Down Expand Up @@ -107,12 +107,12 @@ import okhttp3.MultipartBody;""";
String url = stripUriParams(uri);

if (uri.hasQuery) {
var params = uri.queryParameters;
var params = requestModel.enabledParamsMap;
if (params.isNotEmpty) {
hasQuery = true;
var templateParams = jj.Template(kTemplateUrlQuery);
result += templateParams
.render({"url": url, "params": getQueryParams(params)});
.render({"url": url, "queryParams": params});
}
}
if (!hasQuery) {
Expand Down Expand Up @@ -172,12 +172,6 @@ import okhttp3.MultipartBody;""";
}
}

String getQueryParams(Map<String, String> params) {
final paramStrings = params.entries
.map((entry) => '.addQueryParameter("${entry.key}", "${entry.value}")')
.toList();
return paramStrings.join('\n ');
}

String getHeaders(Map<String, String> headers) {
String result = "";
Expand Down
28 changes: 14 additions & 14 deletions lib/codegen/java/unirest.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:jinja/jinja.dart' as jj;

class JavaUnirestGen {
final String kStringUnirestImports = '''
import kong.unirest.core.*;
import kong.unirest.*;

''';

Expand All @@ -27,18 +27,21 @@ public class Main {
''';

final String kTemplateRequestCreation = '''
HttpResponse<JsonNode> response = Unirest
.{{method}}(requestURL)\n
HttpResponse<JsonNode> response = Unirest.{{method}}(requestURL)\n
''';

final String kTemplateRequestHeader = '''
.header("{{name}}", "{{value}}")\n
''';

final String kTemplateUrlQueryParam = '''
.queryString("{{name}}", "{{value}}")\n
final String kTemplateUrlQueryParam = '''
{% for name, value in queryParams %}{% for v in value -%}
.queryString("{{name}}", "{{v}}")
{% endfor %}{% endfor %}
''';



final String kTemplateRequestTextFormData = '''
.field("{{name}}", "{{value}}")\n
''';
Expand All @@ -52,7 +55,7 @@ public class Main {
''';

final String kStringRequestEnd = """
.asJson();
.asJson();
System.out.println(response.getStatus());
System.out.println(response.getBody());
}
Expand Down Expand Up @@ -125,14 +128,11 @@ public class Main {

// ~~~~~~~~~~~~~~~~~~ query parameters start ~~~~~~~~~~~~~~~~~~

if (uri.hasQuery) {
var params = uri.queryParameters;
var templateUrlQueryParam = jj.Template(kTemplateUrlQueryParam);
params.forEach((name, value) {
result +=
templateUrlQueryParam.render({"name": name, "value": value});
});
}

var params = requestModel.enabledParamsMap;
var templateUrlQueryParam = jj.Template(kTemplateUrlQueryParam);
result += templateUrlQueryParam.render({"queryParams": params});


// ~~~~~~~~~~~~~~~~~~ query parameters end ~~~~~~~~~~~~~~~~~~

Expand Down
Loading