From b8bd45a10ad1d3ec83c52951ac8016b5e7bf58f8 Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Sat, 23 Mar 2024 21:32:48 +0530 Subject: [PATCH 1/4] Fixed the java http client codegen --- lib/codegen/codegen.dart | 2 +- lib/codegen/java/httpclient.dart | 295 ++++++++++++++++--------------- 2 files changed, 157 insertions(+), 140 deletions(-) diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index f3f606ae..19b2a29a 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -60,7 +60,7 @@ class Codegen { case CodegenLanguage.javaAsyncHttpClient: return JavaAsyncHttpClientGen().getCode(rM); case CodegenLanguage.javaHttpClient: - return JavaHttpClientCodeGen().getCode(rM); + return JavaHttpClientCodeGen().getCode(rM, boundary: boundary); case CodegenLanguage.javaOkHttp: return JavaOkHttpCodeGen().getCode(rM); case CodegenLanguage.juliaHttp: diff --git a/lib/codegen/java/httpclient.dart b/lib/codegen/java/httpclient.dart index 037a9a87..e113fa10 100644 --- a/lib/codegen/java/httpclient.dart +++ b/lib/codegen/java/httpclient.dart @@ -1,183 +1,200 @@ -import 'dart:convert'; import 'package:jinja/jinja.dart' as jj; import 'package:apidash/utils/utils.dart' - show getValidRequestUri, requestModelToHARJsonRequest, stripUriParams; -import '../../models/request_model.dart'; + show getValidRequestUri, requestModelToHARJsonRequest; +import 'package:apidash/models/models.dart' show RequestModel; import 'package:apidash/consts.dart'; class JavaHttpClientCodeGen { - final String kTemplateStart = """ -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; + final String kTemplateStart = """import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.net.http.HttpHeaders; -import java.net.http.HttpRequest.BodyPublishers; -import java.net.http.HttpResponse.BodyHandlers; +import java.io.IOException; +{% if hasFormData %}import java.util.HashMap; +import java.util.Map; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList;{% endif %} +{% if hasJsonBody %}import com.google.gson.Gson; +import java.nio.charset.StandardCharsets;{% endif %} -public class JavaHttpClientExample { +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); - public static void main(String[] args) throws IOException, InterruptedException { - HttpClient client = HttpClient.newHttpClient(); -"""; - final String kTemplateUrl = ''' - - String url = "{{url}}"; - -'''; - - final String kTemplateUrlQuery = ''' - - String url = "{{url}}"; - try { - URI uri = new URI(url); - url = uri.resolve("{{params}}").toString(); - } catch (URISyntaxException e) { - e.printStackTrace(); - } - -'''; - - String kTemplateRequestBody = ''' - - String body = "{{body}}"; - -'''; - - final String kStringRequestStart = """ - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) """; - final String kTemplateRequestEnd = """ - .{{method}}({{body}}) - .build(); + String kTemplateUrl = """ + URI uri = URI.create("{{url}}"); - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); +"""; + + String kTemplateFormHeaderContentType = ''' +multipart/form-data; boundary={{boundary}}'''; + + String kTemplateMethod = """ +{% if method == 'get' %} + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); +{% elif method == 'post' %} + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).POST({% if hasBody %}bodyPublisher{% else %}HttpRequest.BodyPublishers.noBody(){% endif %}); +{% elif method == 'put' %} + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).PUT({% if hasBody %}bodyPublisher{% else %}HttpRequest.BodyPublishers.noBody(){% endif %}); +{% elif method == 'delete' %} + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).method("DELETE", {% if hasBody %}bodyPublisher{% else %}HttpRequest.BodyPublishers.noBody(){% endif %}); +{% elif method == 'patch' %} + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).method("PATCH", {% if hasBody %}bodyPublisher{% else %}HttpRequest.BodyPublishers.noBody(){% endif %}); +{% elif method == 'head' %} + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).method("HEAD", HttpRequest.BodyPublishers.noBody()); +{% endif %} +"""; + + String kTemplateRawBody = """ + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(\"\"\" + {{body}}\"\"\"); +"""; + + String kTemplateJsonBody = """ + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(new Gson().toJson(\"\"\" +{{body}}\"\"\"), StandardCharsets.UTF_8); +"""; + + String kTemplateFormData = """ + String boundary = "{{boundary}}"; + Map data = new HashMap<>(); + {% for field in fields %} + {% if field.type == "file" %}data.put("{{field.name}}", Paths.get("{{field.value}}"));{% else %}data.put("{{field.name}}", "{{field.value}}");{% endif %}{% endfor %} + HttpRequest.BodyPublisher bodyPublisher = buildMultipartFormData(data, boundary); +"""; + + String kTemplateHeader = """ + requestBuilder = requestBuilder.headers({% for header, value in headers %} + "{{header}}", "{{value}}"{% if not loop.last %},{% endif %}{% endfor %} + ); + +"""; + + final String kTemplateEnd = """ + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); } + } + {% if hasFormData %} + private static HttpRequest.BodyPublisher buildMultipartFormData(Map data, String boundary) throws IOException { + var byteArrays = new ArrayList(); + var CRLF = "\\r\\n".getBytes(StandardCharsets.UTF_8); + + for (Map.Entry entry : data.entrySet()) { + byteArrays.add(("--" + boundary + "\\r\\n").getBytes(StandardCharsets.UTF_8)); + if (entry.getValue() instanceof Path) { + var file = (Path) entry.getValue(); + var fileName = file.getFileName().toString(); + byteArrays.add(("Content-Disposition: form-data; name=\\"" + entry.getKey() + "\\"; filename=\\"" + fileName + "\\"\\r\\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(("Content-Type: " + Files.probeContentType(file) + "\\r\\n\\r\\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(Files.readAllBytes(file)); + byteArrays.add(CRLF); + } else { + byteArrays.add(("Content-Disposition: form-data; name=\\"" + entry.getKey() + "\\"\\r\\n\\r\\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(entry.getValue().toString().getBytes(StandardCharsets.UTF_8)); + byteArrays.add(CRLF); + } + } + byteArrays.add(("--" + boundary + "--\\r\\n").getBytes(StandardCharsets.UTF_8)); + + return HttpRequest.BodyPublishers.ofByteArrays(byteArrays); + }{% endif %} } -\n """; String? getCode( - RequestModel requestModel, - ) { + RequestModel requestModel, { + String? boundary, + }) { try { String result = ""; - bool hasQuery = false; - bool hasBody = false; - bool hasJsonBody = false; + var requestBody = requestModel.requestBody; + String url = requestModel.url; + + result += jj.Template(kTemplateStart).render({ + "hasJsonBody": requestModel.hasJsonData, + "hasFormData": requestModel.hasFormData, + }); var rec = getValidRequestUri( - requestModel.url, + url, requestModel.enabledRequestParams, ); + Uri? uri = rec.$1; + var harJson = + requestModelToHARJsonRequest(requestModel, useEnabled: true); + if (uri != null) { - String url = stripUriParams(uri); + var templateUrl = jj.Template(kTemplateUrl); + result += templateUrl.render({"url": harJson["url"]}); - if (uri.hasQuery) { - var params = uri.queryParameters; - if (params.isNotEmpty) { - hasQuery = true; - var templateParams = jj.Template(kTemplateUrlQuery); - result += templateParams.render({"url": url, "params": uri.query}); - } + String? bodyPublisher = ""; + if (requestModel.hasTextData) { + var templateBody = jj.Template(kTemplateRawBody); + bodyPublisher = templateBody.render({"body": requestBody}); + } else if (requestModel.hasJsonData) { + var templateBody = jj.Template(kTemplateJsonBody); + bodyPublisher = templateBody.render({"body": requestBody}); + } else if (requestModel.hasFormData) { + var templateFormData = jj.Template(kTemplateFormData); + bodyPublisher = templateFormData.render({ + "fields": requestModel.formDataMapList, + "boundary": boundary, + }); } - if (!hasQuery) { - var templateUrl = jj.Template(kTemplateUrl); - result += templateUrl.render({"url": url}); - } - var rM = requestModel.copyWith(url: url); + result += bodyPublisher; - var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); - - var method = requestModel.method; - var requestBody = requestModel.requestBody; - if (requestModel.hasFormData && - requestModel.formDataMapList.isNotEmpty && - kMethodsWithBody.contains(method)) { - var formDataList = requestModel.formDataMapList; - result += """ - StringBuilder formData = new StringBuilder(); - formData.append("""; - - for (var formDataMap in formDataList) { - result += '"""${formDataMap['name']}=${formDataMap['value']}&""",'; - } - - result = result.substring(0, result.length - 1); - result += ");\n"; - hasBody = true; - } else if (kMethodsWithBody.contains(method) && requestBody != null) { - var contentLength = utf8.encode(requestBody).length; - if (contentLength > 0) { - var templateBody = jj.Template(kTemplateRequestBody); - hasBody = true; - hasJsonBody = - requestBody.startsWith("{") && requestBody.endsWith("}"); - if (harJson["postData"]?["text"] != null) { - result += templateBody.render({ - "body": kEncoder.convert(harJson["postData"]["text"]).substring( - 1, kEncoder.convert(harJson["postData"]["text"]).length - 1) - }); - } - } - } - - result = kTemplateStart + result; - result += kStringRequestStart; + var methodTemplate = jj.Template(kTemplateMethod); + result += methodTemplate.render({ + "method": requestModel.method.name, + "hasBody": requestModel.hasBody, + }); var headersList = requestModel.enabledRequestHeaders; - var contentType = requestModel.requestBodyContentType.header; - if (hasBody && - !requestModel.enabledHeadersMap.containsKey('Content-Type')) { - result = - """$result .header("Content-Type", "$contentType")\n"""; - } - if (headersList != null) { + if (headersList != null || requestModel.hasBody) { var headers = requestModel.enabledHeadersMap; + if (requestModel.hasJsonData || requestModel.hasTextData) { + headers.putIfAbsent(kHeaderContentType, + () => requestModel.requestBodyContentType.header); + } + if (requestModel.hasFormData) { + var formDataHeader = jj.Template(kTemplateFormHeaderContentType); + headers.putIfAbsent( + kHeaderContentType, + () => formDataHeader.render({ + "boundary": boundary, + })); + } if (headers.isNotEmpty) { - result += getHeaders(headers, hasJsonBody); + var templateHeader = jj.Template(kTemplateHeader); + result += templateHeader.render({ + "headers": headers, + }); } } - var templateRequestEnd = jj.Template(kTemplateRequestEnd); - - if (kMethodsWithBody.contains(method)) { - result += templateRequestEnd.render({ - "method": method.name.toUpperCase(), - "body": hasBody - ? "BodyPublishers.ofString(body)" - : "BodyPublishers.noBody()" - }); - } else { - result += templateRequestEnd - .render({"method": method.name.toUpperCase(), "body": ""}); - } + var templateEnd = jj.Template(kTemplateEnd); + result += templateEnd.render({ + "hasFormData": requestModel.hasFormData, + "boundary": boundary, + }); } - return result; + + return result.replaceAll(RegExp('\\n\\n+'), '\n\n'); } catch (e) { return null; } } - - String getHeaders(Map headers, hasJsonBody) { - String result = ""; - for (final k in headers.keys) { - if (k.toLowerCase() == 'authorization') { - result = """$result .header("$k", "${headers[k]}")\n"""; - } else { - result = """$result .header("$k", "${headers[k]}")\n"""; - } - } - return result; - } } From d91b5c059bfd8b45d7475629e205c043ef3b63f6 Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Sat, 23 Mar 2024 21:33:02 +0530 Subject: [PATCH 2/4] added tests for java http client codegen --- .../codegen/java_httpclient_codegen_test.dart | 1119 +++++++++++++++++ 1 file changed, 1119 insertions(+) create mode 100644 test/codegen/java_httpclient_codegen_test.dart diff --git a/test/codegen/java_httpclient_codegen_test.dart b/test/codegen/java_httpclient_codegen_test.dart new file mode 100644 index 00000000..7ae82b89 --- /dev/null +++ b/test/codegen/java_httpclient_codegen_test.dart @@ -0,0 +1,1119 @@ +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; +import 'package:test/test.dart'; +import '../request_models.dart'; + +void main() { + final codeGen = Codegen(); + + group('GET Request', () { + test('GET1', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelGet1, "https"), + expectedCode); + }); + test('GET2', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/country/data?code=US"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelGet2, "https"), + expectedCode); + }); + test('GET3', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/country/data?code=IND"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelGet3, "https"), + expectedCode); + }); + test('GET4', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelGet4, "https"), + expectedCode); + }); + test('GET5', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.github.com/repos/foss42/apidash"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); + requestBuilder = requestBuilder.headers( + "User-Agent", "Test Agent" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelGet5, "https"), + expectedCode); + }); + test('GET6', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.github.com/repos/foss42/apidash?raw=true"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); + requestBuilder = requestBuilder.headers( + "User-Agent", "Test Agent" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelGet6, "https"), + expectedCode); + }); + test('GET7', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelGet7, "https"), + expectedCode); + }); + test('GET8', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.github.com/repos/foss42/apidash?raw=true"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); + requestBuilder = requestBuilder.headers( + "User-Agent", "Test Agent" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelGet8, "https"), + expectedCode); + }); + test('GET9', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/humanize/social?num=8700000&add_space=true"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelGet9, "https"), + expectedCode); + }); + test('GET10', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/humanize/social"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); + requestBuilder = requestBuilder.headers( + "User-Agent", "Test Agent" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelGet10, "https"), + expectedCode); + }); + test('GET11', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/humanize/social?num=8700000&digits=3"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); + requestBuilder = requestBuilder.headers( + "User-Agent", "Test Agent" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelGet11, "https"), + expectedCode); + }); + test('GET12', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/humanize/social"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).GET(); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelGet12, "https"), + expectedCode); + }); + }); + + group('HEAD Request', () { + test('HEAD1', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).method("HEAD", HttpRequest.BodyPublishers.noBody()); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelHead1, "https"), + expectedCode); + }); + test('HEAD2', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).method("HEAD", HttpRequest.BodyPublishers.noBody()); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelHead2, "https"), + expectedCode); + }); + }); + + group('POST Request', () { + test('POST1', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/case/lower"); + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(""" + { +"text": "I LOVE Flutter" +}"""); + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).POST(bodyPublisher); + requestBuilder = requestBuilder.headers( + "Content-Type", "text/plain" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelPost1, "https"), + expectedCode); + }); + test('POST2', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +import com.google.gson.Gson; +import java.nio.charset.StandardCharsets; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/case/lower"); + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(new Gson().toJson(""" +{ +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] +}"""), StandardCharsets.UTF_8); + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).POST(bodyPublisher); + requestBuilder = requestBuilder.headers( + "Content-Type", "application/json" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelPost2, "https"), + expectedCode); + }); + test('POST3', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +import com.google.gson.Gson; +import java.nio.charset.StandardCharsets; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/case/lower"); + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(new Gson().toJson(""" +{ +"text": "I LOVE Flutter" +}"""), StandardCharsets.UTF_8); + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).POST(bodyPublisher); + requestBuilder = requestBuilder.headers( + "User-Agent", "Test Agent", + "Content-Type", "application/json" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelPost3, "https"), + expectedCode); + }); + test('POST4', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/io/form"); + String boundary = "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"; + Map data = new HashMap<>(); + + data.put("text", "API"); + data.put("sep", "|"); + data.put("times", "3"); + HttpRequest.BodyPublisher bodyPublisher = buildMultipartFormData(data, boundary); + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).POST(bodyPublisher); + requestBuilder = requestBuilder.headers( + "Content-Type", "multipart/form-data; boundary=b9826c20-773c-1f0c-814d-a1b3d90cd6b3" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + + private static HttpRequest.BodyPublisher buildMultipartFormData(Map data, String boundary) throws IOException { + var byteArrays = new ArrayList(); + var CRLF = "\r\n".getBytes(StandardCharsets.UTF_8); + + for (Map.Entry entry : data.entrySet()) { + byteArrays.add(("--" + boundary + "\r\n").getBytes(StandardCharsets.UTF_8)); + if (entry.getValue() instanceof Path) { + var file = (Path) entry.getValue(); + var fileName = file.getFileName().toString(); + byteArrays.add(("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"; filename=\"" + fileName + "\"\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(("Content-Type: " + Files.probeContentType(file) + "\r\n\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(Files.readAllBytes(file)); + byteArrays.add(CRLF); + } else { + byteArrays.add(("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"\r\n\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(entry.getValue().toString().getBytes(StandardCharsets.UTF_8)); + byteArrays.add(CRLF); + } + } + byteArrays.add(("--" + boundary + "--\r\n").getBytes(StandardCharsets.UTF_8)); + + return HttpRequest.BodyPublishers.ofByteArrays(byteArrays); + } +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelPost4, "https", boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + expectedCode); + }); + test('POST5', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/io/form"); + String boundary = "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"; + Map data = new HashMap<>(); + + data.put("text", "API"); + data.put("sep", "|"); + data.put("times", "3"); + HttpRequest.BodyPublisher bodyPublisher = buildMultipartFormData(data, boundary); + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).POST(bodyPublisher); + requestBuilder = requestBuilder.headers( + "User-Agent", "Test Agent", + "Content-Type", "multipart/form-data; boundary=b9826c20-773c-1f0c-814d-a1b3d90cd6b3" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + + private static HttpRequest.BodyPublisher buildMultipartFormData(Map data, String boundary) throws IOException { + var byteArrays = new ArrayList(); + var CRLF = "\r\n".getBytes(StandardCharsets.UTF_8); + + for (Map.Entry entry : data.entrySet()) { + byteArrays.add(("--" + boundary + "\r\n").getBytes(StandardCharsets.UTF_8)); + if (entry.getValue() instanceof Path) { + var file = (Path) entry.getValue(); + var fileName = file.getFileName().toString(); + byteArrays.add(("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"; filename=\"" + fileName + "\"\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(("Content-Type: " + Files.probeContentType(file) + "\r\n\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(Files.readAllBytes(file)); + byteArrays.add(CRLF); + } else { + byteArrays.add(("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"\r\n\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(entry.getValue().toString().getBytes(StandardCharsets.UTF_8)); + byteArrays.add(CRLF); + } + } + byteArrays.add(("--" + boundary + "--\r\n").getBytes(StandardCharsets.UTF_8)); + + return HttpRequest.BodyPublishers.ofByteArrays(byteArrays); + } +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelPost5, "https", boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + expectedCode); + }); + test('POST6', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/io/img"); + String boundary = "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"; + Map data = new HashMap<>(); + + data.put("token", "xyz"); + data.put("imfile", Paths.get("/Documents/up/1.png")); + HttpRequest.BodyPublisher bodyPublisher = buildMultipartFormData(data, boundary); + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).POST(bodyPublisher); + requestBuilder = requestBuilder.headers( + "Content-Type", "multipart/form-data; boundary=b9826c20-773c-1f0c-814d-a1b3d90cd6b3" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + + private static HttpRequest.BodyPublisher buildMultipartFormData(Map data, String boundary) throws IOException { + var byteArrays = new ArrayList(); + var CRLF = "\r\n".getBytes(StandardCharsets.UTF_8); + + for (Map.Entry entry : data.entrySet()) { + byteArrays.add(("--" + boundary + "\r\n").getBytes(StandardCharsets.UTF_8)); + if (entry.getValue() instanceof Path) { + var file = (Path) entry.getValue(); + var fileName = file.getFileName().toString(); + byteArrays.add(("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"; filename=\"" + fileName + "\"\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(("Content-Type: " + Files.probeContentType(file) + "\r\n\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(Files.readAllBytes(file)); + byteArrays.add(CRLF); + } else { + byteArrays.add(("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"\r\n\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(entry.getValue().toString().getBytes(StandardCharsets.UTF_8)); + byteArrays.add(CRLF); + } + } + byteArrays.add(("--" + boundary + "--\r\n").getBytes(StandardCharsets.UTF_8)); + + return HttpRequest.BodyPublishers.ofByteArrays(byteArrays); + } +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelPost6, "https", boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + expectedCode); + }); + test('POST7', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/io/img"); + String boundary = "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"; + Map data = new HashMap<>(); + + data.put("token", "xyz"); + data.put("imfile", Paths.get("/Documents/up/1.png")); + HttpRequest.BodyPublisher bodyPublisher = buildMultipartFormData(data, boundary); + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).POST(bodyPublisher); + requestBuilder = requestBuilder.headers( + "Content-Type", "multipart/form-data; boundary=b9826c20-773c-1f0c-814d-a1b3d90cd6b3" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + + private static HttpRequest.BodyPublisher buildMultipartFormData(Map data, String boundary) throws IOException { + var byteArrays = new ArrayList(); + var CRLF = "\r\n".getBytes(StandardCharsets.UTF_8); + + for (Map.Entry entry : data.entrySet()) { + byteArrays.add(("--" + boundary + "\r\n").getBytes(StandardCharsets.UTF_8)); + if (entry.getValue() instanceof Path) { + var file = (Path) entry.getValue(); + var fileName = file.getFileName().toString(); + byteArrays.add(("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"; filename=\"" + fileName + "\"\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(("Content-Type: " + Files.probeContentType(file) + "\r\n\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(Files.readAllBytes(file)); + byteArrays.add(CRLF); + } else { + byteArrays.add(("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"\r\n\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(entry.getValue().toString().getBytes(StandardCharsets.UTF_8)); + byteArrays.add(CRLF); + } + } + byteArrays.add(("--" + boundary + "--\r\n").getBytes(StandardCharsets.UTF_8)); + + return HttpRequest.BodyPublishers.ofByteArrays(byteArrays); + } +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelPost7, "https", boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + expectedCode); + }); + test('POST8', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/io/form?size=2&len=3"); + String boundary = "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"; + Map data = new HashMap<>(); + + data.put("text", "API"); + data.put("sep", "|"); + data.put("times", "3"); + HttpRequest.BodyPublisher bodyPublisher = buildMultipartFormData(data, boundary); + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).POST(bodyPublisher); + requestBuilder = requestBuilder.headers( + "Content-Type", "multipart/form-data; boundary=b9826c20-773c-1f0c-814d-a1b3d90cd6b3" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + + private static HttpRequest.BodyPublisher buildMultipartFormData(Map data, String boundary) throws IOException { + var byteArrays = new ArrayList(); + var CRLF = "\r\n".getBytes(StandardCharsets.UTF_8); + + for (Map.Entry entry : data.entrySet()) { + byteArrays.add(("--" + boundary + "\r\n").getBytes(StandardCharsets.UTF_8)); + if (entry.getValue() instanceof Path) { + var file = (Path) entry.getValue(); + var fileName = file.getFileName().toString(); + byteArrays.add(("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"; filename=\"" + fileName + "\"\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(("Content-Type: " + Files.probeContentType(file) + "\r\n\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(Files.readAllBytes(file)); + byteArrays.add(CRLF); + } else { + byteArrays.add(("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"\r\n\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(entry.getValue().toString().getBytes(StandardCharsets.UTF_8)); + byteArrays.add(CRLF); + } + } + byteArrays.add(("--" + boundary + "--\r\n").getBytes(StandardCharsets.UTF_8)); + + return HttpRequest.BodyPublishers.ofByteArrays(byteArrays); + } +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelPost8, "https", boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + expectedCode); + }); + test('POST9', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://api.apidash.dev/io/img?size=2&len=3"); + String boundary = "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"; + Map data = new HashMap<>(); + + data.put("token", "xyz"); + data.put("imfile", Paths.get("/Documents/up/1.png")); + HttpRequest.BodyPublisher bodyPublisher = buildMultipartFormData(data, boundary); + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).POST(bodyPublisher); + requestBuilder = requestBuilder.headers( + "User-Agent", "Test Agent", + "Keep-Alive", "true", + "Content-Type", "multipart/form-data; boundary=b9826c20-773c-1f0c-814d-a1b3d90cd6b3" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + + private static HttpRequest.BodyPublisher buildMultipartFormData(Map data, String boundary) throws IOException { + var byteArrays = new ArrayList(); + var CRLF = "\r\n".getBytes(StandardCharsets.UTF_8); + + for (Map.Entry entry : data.entrySet()) { + byteArrays.add(("--" + boundary + "\r\n").getBytes(StandardCharsets.UTF_8)); + if (entry.getValue() instanceof Path) { + var file = (Path) entry.getValue(); + var fileName = file.getFileName().toString(); + byteArrays.add(("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"; filename=\"" + fileName + "\"\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(("Content-Type: " + Files.probeContentType(file) + "\r\n\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(Files.readAllBytes(file)); + byteArrays.add(CRLF); + } else { + byteArrays.add(("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"\r\n\r\n").getBytes(StandardCharsets.UTF_8)); + byteArrays.add(entry.getValue().toString().getBytes(StandardCharsets.UTF_8)); + byteArrays.add(CRLF); + } + } + byteArrays.add(("--" + boundary + "--\r\n").getBytes(StandardCharsets.UTF_8)); + + return HttpRequest.BodyPublishers.ofByteArrays(byteArrays); + } +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelPost9, "https", boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + expectedCode); + }); + }); + + group('PUT Request', () { + test('PUT1', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +import com.google.gson.Gson; +import java.nio.charset.StandardCharsets; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://reqres.in/api/users/2"); + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(new Gson().toJson(""" +{ +"name": "morpheus", +"job": "zion resident" +}"""), StandardCharsets.UTF_8); + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).PUT(bodyPublisher); + requestBuilder = requestBuilder.headers( + "Content-Type", "application/json" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelPut1, "https"), + expectedCode); + }); + }); + + group('PATCH Request', () { + test('PATCH1', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +import com.google.gson.Gson; +import java.nio.charset.StandardCharsets; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://reqres.in/api/users/2"); + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(new Gson().toJson(""" +{ +"name": "marfeus", +"job": "accountant" +}"""), StandardCharsets.UTF_8); + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).method("PATCH", bodyPublisher); + requestBuilder = requestBuilder.headers( + "Content-Type", "application/json" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelPatch1, "https"), + expectedCode); + }); + }); + + group('DELETE Request', () { + test('DELETE1', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://reqres.in/api/users/2"); + + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).method("DELETE", HttpRequest.BodyPublishers.noBody()); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelDelete1, "https"), + expectedCode); + }); + test('DELETE2', () { + const expectedCode = r''' +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.io.IOException; + +import com.google.gson.Gson; +import java.nio.charset.StandardCharsets; + +public class Main { + public static void main(String[] args) { + try { + HttpClient client = HttpClient.newHttpClient(); + URI uri = URI.create("https://reqres.in/api/users/2"); + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(new Gson().toJson(""" +{ +"name": "marfeus", +"job": "accountant" +}"""), StandardCharsets.UTF_8); + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).method("DELETE", bodyPublisher); + requestBuilder = requestBuilder.headers( + "Content-Type", "application/json" + ); + HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); + System.out.println("Response body: " + response.body()); + System.out.println("Response code: " + response.statusCode()); + } catch (IOException | InterruptedException e) { + System.out.println("An error occurred: " + e.getMessage()); + } + } + +}'''; + expect( + codeGen.getCode( + CodegenLanguage.javaHttpClient, requestModelDelete2, "https"), + expectedCode); + }); + }); + +} From 3886755ae92489b710520799a4c456406e48e442 Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Sun, 24 Mar 2024 01:54:33 +0530 Subject: [PATCH 3/4] fixed json body and head2 --- lib/codegen/java/httpclient.dart | 7 +--- .../codegen/java_httpclient_codegen_test.dart | 37 ++++++------------- 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/lib/codegen/java/httpclient.dart b/lib/codegen/java/httpclient.dart index e113fa10..01d45b05 100644 --- a/lib/codegen/java/httpclient.dart +++ b/lib/codegen/java/httpclient.dart @@ -17,8 +17,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.charset.StandardCharsets; import java.util.ArrayList;{% endif %} -{% if hasJsonBody %}import com.google.gson.Gson; -import java.nio.charset.StandardCharsets;{% endif %} public class Main { public static void main(String[] args) { @@ -57,8 +55,8 @@ multipart/form-data; boundary={{boundary}}'''; """; String kTemplateJsonBody = """ - HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(new Gson().toJson(\"\"\" -{{body}}\"\"\"), StandardCharsets.UTF_8); + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(\"\"\" +{{body}}\"\"\"); """; String kTemplateFormData = """ @@ -121,7 +119,6 @@ multipart/form-data; boundary={{boundary}}'''; String url = requestModel.url; result += jj.Template(kTemplateStart).render({ - "hasJsonBody": requestModel.hasJsonData, "hasFormData": requestModel.hasFormData, }); diff --git a/test/codegen/java_httpclient_codegen_test.dart b/test/codegen/java_httpclient_codegen_test.dart index 7ae82b89..0fc25e2a 100644 --- a/test/codegen/java_httpclient_codegen_test.dart +++ b/test/codegen/java_httpclient_codegen_test.dart @@ -428,7 +428,7 @@ public class Main { }'''; expect( codeGen.getCode( - CodegenLanguage.javaHttpClient, requestModelHead2, "https"), + CodegenLanguage.javaHttpClient, requestModelHead2, "http"), expectedCode); }); }); @@ -477,15 +477,12 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.io.IOException; -import com.google.gson.Gson; -import java.nio.charset.StandardCharsets; - public class Main { public static void main(String[] args) { try { HttpClient client = HttpClient.newHttpClient(); URI uri = URI.create("https://api.apidash.dev/case/lower"); - HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(new Gson().toJson(""" + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(""" { "text": "I LOVE Flutter", "flag": null, @@ -493,7 +490,7 @@ public class Main { "female": false, "no": 1.2, "arr": ["null", "true", "false", null] -}"""), StandardCharsets.UTF_8); +}"""); HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).POST(bodyPublisher); requestBuilder = requestBuilder.headers( "Content-Type", "application/json" @@ -520,18 +517,15 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.io.IOException; -import com.google.gson.Gson; -import java.nio.charset.StandardCharsets; - public class Main { public static void main(String[] args) { try { HttpClient client = HttpClient.newHttpClient(); URI uri = URI.create("https://api.apidash.dev/case/lower"); - HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(new Gson().toJson(""" + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(""" { "text": "I LOVE Flutter" -}"""), StandardCharsets.UTF_8); +}"""); HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).POST(bodyPublisher); requestBuilder = requestBuilder.headers( "User-Agent", "Test Agent", @@ -970,19 +964,16 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.io.IOException; -import com.google.gson.Gson; -import java.nio.charset.StandardCharsets; - public class Main { public static void main(String[] args) { try { HttpClient client = HttpClient.newHttpClient(); URI uri = URI.create("https://reqres.in/api/users/2"); - HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(new Gson().toJson(""" + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(""" { "name": "morpheus", "job": "zion resident" -}"""), StandardCharsets.UTF_8); +}"""); HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).PUT(bodyPublisher); requestBuilder = requestBuilder.headers( "Content-Type", "application/json" @@ -1012,19 +1003,16 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.io.IOException; -import com.google.gson.Gson; -import java.nio.charset.StandardCharsets; - public class Main { public static void main(String[] args) { try { HttpClient client = HttpClient.newHttpClient(); URI uri = URI.create("https://reqres.in/api/users/2"); - HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(new Gson().toJson(""" + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(""" { "name": "marfeus", "job": "accountant" -}"""), StandardCharsets.UTF_8); +}"""); HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).method("PATCH", bodyPublisher); requestBuilder = requestBuilder.headers( "Content-Type", "application/json" @@ -1083,19 +1071,16 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.io.IOException; -import com.google.gson.Gson; -import java.nio.charset.StandardCharsets; - public class Main { public static void main(String[] args) { try { HttpClient client = HttpClient.newHttpClient(); URI uri = URI.create("https://reqres.in/api/users/2"); - HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(new Gson().toJson(""" + HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofString(""" { "name": "marfeus", "job": "accountant" -}"""), StandardCharsets.UTF_8); +}"""); HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).method("DELETE", bodyPublisher); requestBuilder = requestBuilder.headers( "Content-Type", "application/json" From 4b1d8bdd03277d55b380df99262fb10dfc82e9d9 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 31 Mar 2024 20:06:36 +0530 Subject: [PATCH 4/4] Update java_httpclient_codegen_test.dart --- .../codegen/java_httpclient_codegen_test.dart | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/test/codegen/java_httpclient_codegen_test.dart b/test/codegen/java_httpclient_codegen_test.dart index 0fc25e2a..d279f5ab 100644 --- a/test/codegen/java_httpclient_codegen_test.dart +++ b/test/codegen/java_httpclient_codegen_test.dart @@ -414,7 +414,7 @@ public class Main { public static void main(String[] args) { try { HttpClient client = HttpClient.newHttpClient(); - URI uri = URI.create("https://api.apidash.dev"); + URI uri = URI.create("http://api.apidash.dev"); HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).method("HEAD", HttpRequest.BodyPublishers.noBody()); HttpResponse response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString()); @@ -610,7 +610,8 @@ public class Main { }'''; expect( codeGen.getCode( - CodegenLanguage.javaHttpClient, requestModelPost4, "https", boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + CodegenLanguage.javaHttpClient, requestModelPost4, "https", + boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), expectedCode); }); test('POST5', () { @@ -679,7 +680,8 @@ public class Main { }'''; expect( codeGen.getCode( - CodegenLanguage.javaHttpClient, requestModelPost5, "https", boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + CodegenLanguage.javaHttpClient, requestModelPost5, "https", + boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), expectedCode); }); test('POST6', () { @@ -746,7 +748,8 @@ public class Main { }'''; expect( codeGen.getCode( - CodegenLanguage.javaHttpClient, requestModelPost6, "https", boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + CodegenLanguage.javaHttpClient, requestModelPost6, "https", + boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), expectedCode); }); test('POST7', () { @@ -813,7 +816,8 @@ public class Main { }'''; expect( codeGen.getCode( - CodegenLanguage.javaHttpClient, requestModelPost7, "https", boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + CodegenLanguage.javaHttpClient, requestModelPost7, "https", + boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), expectedCode); }); test('POST8', () { @@ -881,7 +885,8 @@ public class Main { }'''; expect( codeGen.getCode( - CodegenLanguage.javaHttpClient, requestModelPost8, "https", boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + CodegenLanguage.javaHttpClient, requestModelPost8, "https", + boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), expectedCode); }); test('POST9', () { @@ -950,7 +955,8 @@ public class Main { }'''; expect( codeGen.getCode( - CodegenLanguage.javaHttpClient, requestModelPost9, "https", boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + CodegenLanguage.javaHttpClient, requestModelPost9, "https", + boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), expectedCode); }); }); @@ -1100,5 +1106,4 @@ public class Main { expectedCode); }); }); - }