From 3c35352b4e7ee6aef44ae22351bc5646cec50475 Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Sun, 10 Mar 2024 00:43:59 +0530 Subject: [PATCH 1/5] Added go http codegen --- lib/codegen/codegen.dart | 3 + lib/codegen/go/http.dart | 197 +++++++++++++++++++++++++++++++++++++++ lib/consts.dart | 3 +- 3 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 lib/codegen/go/http.dart diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index 1aec7144..ef40de30 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -1,3 +1,4 @@ +import 'package:apidash/codegen/go/http.dart'; import 'package:apidash/models/models.dart' show RequestModel; import 'package:apidash/consts.dart'; import 'dart/http.dart'; @@ -42,6 +43,8 @@ class Codegen { .getCode(requestModel, defaultUriScheme); case CodegenLanguage.pythonRequests: return PythonRequestsCodeGen().getCode(requestModel, defaultUriScheme); + case CodegenLanguage.goHttp: + return GoHttpCodeGen().getCode(requestModel, defaultUriScheme); } } } diff --git a/lib/codegen/go/http.dart b/lib/codegen/go/http.dart new file mode 100644 index 00000000..d9cf080e --- /dev/null +++ b/lib/codegen/go/http.dart @@ -0,0 +1,197 @@ +import 'dart:convert'; + +import 'package:jinja/jinja.dart' as jj; +import 'package:apidash/utils/utils.dart' show getValidRequestUri; +import 'package:apidash/models/models.dart' show RequestModel; +import 'package:apidash/consts.dart'; + +class GoHttpCodeGen { + final String kTemplateStart = """package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + {% if isBody %}"bytes" + {% if isFormDataRequest %}"mime/multipart" + "os"{% endif %}{% endif %} +) + +func main() { + client := &http.Client{} + +"""; + + String kTemplateUrl = """ + url, err := url.Parse("{{url}}") + if err != nil { + fmt.Println(err) + return + } + +"""; + + String kTemplateRawBody = """ + {% if body %}body := strings.NewReader(`{{body}}`){% endif %} + +"""; + + String kTemplateJsonBody = """ + {% if body %}body := bytes.NewBuffer([]byte(`{{body}}`)){% endif %} + +"""; + + String kTemplateFormData = """ + body := &bytes.Buffer{} + writer := multipart.NewWriter(body) + var ( + file *os.File + part io.Writer + ) + {% for field in fields %} + {% if field.type == "file" %}file, err = os.Open("{{field.value}}") + if err != nil { + fmt.Println(err) + return + } + defer file.Close() + + part, err = writer.CreateFormFile("{{field.name}}", "{{field.value}}") + if err != nil { + fmt.Println(err) + return + } + io.Copy(part, file) + {% else %}writer.WriteField("{{field.name}}", "{{field.value}}"){% endif %}{% endfor %} + writer.Close() + + +"""; + + String kTemplateHeader = """ +{% if headers %}{% for header, value in headers %} + req.Header.Set("{{header}}", "{{value}}") +{% endfor %} +{% endif %} +"""; + + String kTemplateQueryParam = """ + query := url.Query() + {% for key, value in params %} + query.Set("{{key}}", "{{value}}") + {% endfor %} + url.RawQuery = query.Encode() + +"""; + + String kTemplateRequest = """ + req, err := http.NewRequest("{{method}}", url.String(), {% if hasBody %}body{% else %}nil{% endif %}) + if err != nil { + fmt.Println(err) + return + } + +"""; + + final String kTemplateEnd = """ + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +} +"""; + + String? getCode( + RequestModel requestModel, + String defaultUriScheme, + ) { + try { + String result = ""; + var hasBody = false; + var requestBody = requestModel.requestBody; + + String url = requestModel.url; + if (!url.contains("://") && url.isNotEmpty) { + url = "$defaultUriScheme://$url"; + } + + var templateStart = jj.Template(kTemplateStart); + result += templateStart.render({ + "isBody": kMethodsWithBody.contains(requestModel.method) && + requestBody != null, + "isFormDataRequest": requestModel.isFormDataRequest + }); + + var templateUrl = jj.Template(kTemplateUrl); + result += templateUrl.render({"url": url}); + + var rec = getValidRequestUri( + url, + requestModel.enabledRequestParams, + ); + + Uri? uri = rec.$1; + + if (uri != null) { + var method = requestModel.method.name.toUpperCase(); + if (kMethodsWithBody.contains(requestModel.method) && + requestBody != null) { + var contentLength = utf8.encode(requestBody).length; + if (contentLength > 0) { + hasBody = true; + } + if (requestModel.requestBodyContentType == ContentType.text) { + var templateRawBody = jj.Template(kTemplateRawBody); + result += templateRawBody.render({"body": requestBody}); + } else if (requestModel.requestBodyContentType == ContentType.json) { + var templateJsonBody = jj.Template(kTemplateJsonBody); + result += templateJsonBody.render({"body": requestBody}); + } else if (requestModel.isFormDataRequest) { + hasBody = true; + var templateFormData = jj.Template(kTemplateFormData); + result += templateFormData.render({ + "fields": requestModel.formDataMapList, + }); + } + } + + if (uri.hasQuery) { + var params = uri.queryParameters; + if (params.isNotEmpty) { + var templateQueryParam = jj.Template(kTemplateQueryParam); + result += templateQueryParam.render({"params": params}); + } + } + + var templateRequest = jj.Template(kTemplateRequest); + result += + templateRequest.render({"method": method, "hasBody": hasBody}); + + var headersList = requestModel.enabledRequestHeaders; + if (headersList != null) { + var headers = requestModel.enabledHeadersMap; + if (headers.isNotEmpty) { + var templateHeader = jj.Template(kTemplateHeader); + result += templateHeader.render({"headers": headers}); + } + } + + result += kTemplateEnd; + } + + return result; + } catch (e) { + return null; + } + } +} diff --git a/lib/consts.dart b/lib/consts.dart index d157b7fa..c5e6b447 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -271,7 +271,8 @@ enum CodegenLanguage { nodejsFetch("node.js (fetch)", "javascript", "js"), kotlinOkHttp("Kotlin (okhttp3)", "java", "kt"), pythonHttpClient("Python (http.client)", "python", "py"), - pythonRequests("Python (requests)", "python", "py"); + pythonRequests("Python (requests)", "python", "py"), + goHttp("Golang (http)", "go", "go"); const CodegenLanguage(this.label, this.codeHighlightLang, this.ext); final String label; From be33809173feb7fb193d5f9ded3803d8b127a837 Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Sun, 10 Mar 2024 02:03:14 +0530 Subject: [PATCH 2/5] Added tests for go_http_codegen --- lib/codegen/go/http.dart | 5 +- test/codegen/go_http_codegen_test.dart | 1267 ++++++++++++++++++++++++ 2 files changed, 1269 insertions(+), 3 deletions(-) create mode 100644 test/codegen/go_http_codegen_test.dart diff --git a/lib/codegen/go/http.dart b/lib/codegen/go/http.dart index d9cf080e..48882710 100644 --- a/lib/codegen/go/http.dart +++ b/lib/codegen/go/http.dart @@ -33,7 +33,7 @@ func main() { """; String kTemplateRawBody = """ - {% if body %}body := strings.NewReader(`{{body}}`){% endif %} + {% if body %}body := bytes.NewBuffer([]byte(`{{body}}`)){% endif %} """; @@ -108,8 +108,7 @@ func main() { return } fmt.Println(string(res)) -} -"""; +}"""; String? getCode( RequestModel requestModel, diff --git a/test/codegen/go_http_codegen_test.dart b/test/codegen/go_http_codegen_test.dart new file mode 100644 index 00000000..f056cb38 --- /dev/null +++ b/test/codegen/go_http_codegen_test.dart @@ -0,0 +1,1267 @@ +import 'package:apidash/codegen/go/http.dart'; +import 'package:test/test.dart'; +import '../request_models.dart'; + +void main() { + final goHttpCodeGen = GoHttpCodeGen(); + + group('GET Request', () { + test('GET 1', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev") + if err != nil { + fmt.Println(err) + return + } + req, err := http.NewRequest("GET", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelGet1, "https"), expectedCode); + }); + + test('GET 2', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/country/data") + if err != nil { + fmt.Println(err) + return + } + query := url.Query() + + query.Set("code", "US") + + url.RawQuery = query.Encode() + req, err := http.NewRequest("GET", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelGet2, "https"), expectedCode); + }); + + test('GET 3', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/country/data?code=US") + if err != nil { + fmt.Println(err) + return + } + query := url.Query() + + query.Set("code", "IND") + + url.RawQuery = query.Encode() + req, err := http.NewRequest("GET", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelGet3, "https"), expectedCode); + }); + + test('GET 4', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/humanize/social") + if err != nil { + fmt.Println(err) + return + } + query := url.Query() + + query.Set("num", "8700000") + + query.Set("digits", "3") + + query.Set("system", "SS") + + query.Set("add_space", "true") + + query.Set("trailing_zeros", "true") + + url.RawQuery = query.Encode() + req, err := http.NewRequest("GET", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelGet4, "https"), expectedCode); + }); + + test('GET 5', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.github.com/repos/foss42/apidash") + if err != nil { + fmt.Println(err) + return + } + req, err := http.NewRequest("GET", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + + req.Header.Set("User-Agent", "Test Agent") + + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelGet5, "https"), expectedCode); + }); + + test('GET 6', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.github.com/repos/foss42/apidash") + if err != nil { + fmt.Println(err) + return + } + query := url.Query() + + query.Set("raw", "true") + + url.RawQuery = query.Encode() + req, err := http.NewRequest("GET", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + + req.Header.Set("User-Agent", "Test Agent") + + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelGet6, "https"), expectedCode); + }); + + test('GET 7', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev") + if err != nil { + fmt.Println(err) + return + } + req, err := http.NewRequest("GET", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelGet7, "https"), expectedCode); + }); + + test('GET 8', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.github.com/repos/foss42/apidash") + if err != nil { + fmt.Println(err) + return + } + query := url.Query() + + query.Set("raw", "true") + + url.RawQuery = query.Encode() + req, err := http.NewRequest("GET", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + + req.Header.Set("User-Agent", "Test Agent") + + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelGet8, "https"), expectedCode); + }); + + test('GET 9', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/humanize/social") + if err != nil { + fmt.Println(err) + return + } + query := url.Query() + + query.Set("num", "8700000") + + query.Set("add_space", "true") + + url.RawQuery = query.Encode() + req, err := http.NewRequest("GET", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelGet9, "https"), expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/humanize/social") + if err != nil { + fmt.Println(err) + return + } + req, err := http.NewRequest("GET", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + + req.Header.Set("User-Agent", "Test Agent") + + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect( + goHttpCodeGen.getCode( + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/humanize/social") + if err != nil { + fmt.Println(err) + return + } + query := url.Query() + + query.Set("num", "8700000") + + query.Set("digits", "3") + + url.RawQuery = query.Encode() + req, err := http.NewRequest("GET", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + + req.Header.Set("User-Agent", "Test Agent") + + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelGet11, "https"), expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/humanize/social") + if err != nil { + fmt.Println(err) + return + } + req, err := http.NewRequest("GET", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelGet12, "https"), expectedCode); + }); + }); + + group('HEAD Request', () { + test('HEAD 1', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev") + if err != nil { + fmt.Println(err) + return + } + req, err := http.NewRequest("HEAD", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelHead1, "https"), expectedCode); + }); + + test('HEAD 2', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("http://api.apidash.dev") + if err != nil { + fmt.Println(err) + return + } + req, err := http.NewRequest("HEAD", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelHead2, "http"), expectedCode); + }); + }); + + group('POST Request', () { + test('POST 1', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/case/lower") + if err != nil { + fmt.Println(err) + return + } + body := bytes.NewBuffer([]byte(`{ +"text": "I LOVE Flutter" +}`)) + req, err := http.NewRequest("POST", url.String(), body) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}'''; + expect(goHttpCodeGen.getCode(requestModelPost1, "https"), expectedCode); + }); + + test('POST 2', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/case/lower") + if err != nil { + fmt.Println(err) + return + } + body := bytes.NewBuffer([]byte(`{ +"text": "I LOVE Flutter" +}`)) + req, err := http.NewRequest("POST", url.String(), body) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}'''; + expect(goHttpCodeGen.getCode(requestModelPost2, "https"), expectedCode); + }); + + test('POST 3', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/case/lower") + if err != nil { + fmt.Println(err) + return + } + body := bytes.NewBuffer([]byte(`{ +"text": "I LOVE Flutter" +}`)) + req, err := http.NewRequest("POST", url.String(), body) + if err != nil { + fmt.Println(err) + return + } + + req.Header.Set("User-Agent", "Test Agent") + + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}'''; + expect(goHttpCodeGen.getCode(requestModelPost3, "https"), expectedCode); + }); + + test('POST 4', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/io/form") + if err != nil { + fmt.Println(err) + return + } + req, err := http.NewRequest("POST", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}'''; + expect(goHttpCodeGen.getCode(requestModelPost4, "https"), expectedCode); + }); + + test('POST 5', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/io/form") + if err != nil { + fmt.Println(err) + return + } + req, err := http.NewRequest("POST", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + + req.Header.Set("User-Agent", "Test Agent") + + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}'''; + expect(goHttpCodeGen.getCode(requestModelPost5, "https"), expectedCode); + }); + }); + + test("POST 6", () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/io/img") + if err != nil { + fmt.Println(err) + return + } + req, err := http.NewRequest("POST", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}'''; + expect(goHttpCodeGen.getCode(requestModelPost6, "https"), expectedCode); + }); + test("POST 7", () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + "mime/multipart" + "os" +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/io/img") + if err != nil { + fmt.Println(err) + return + } + body := &bytes.Buffer{} + writer := multipart.NewWriter(body) + var ( + file *os.File + part io.Writer + ) + + writer.WriteField("token", "xyz") + file, err = os.Open("/Documents/up/1.png") + if err != nil { + fmt.Println(err) + return + } + defer file.Close() + + part, err = writer.CreateFormFile("imfile", "/Documents/up/1.png") + if err != nil { + fmt.Println(err) + return + } + io.Copy(part, file) + + writer.Close() + + req, err := http.NewRequest("POST", url.String(), body) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}'''; + expect(goHttpCodeGen.getCode(requestModelPost7, "https"), expectedCode); + }); + test("POST 8", () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/io/form") + if err != nil { + fmt.Println(err) + return + } + query := url.Query() + + query.Set("size", "2") + + query.Set("len", "3") + + url.RawQuery = query.Encode() + req, err := http.NewRequest("POST", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}'''; + expect(goHttpCodeGen.getCode(requestModelPost8, "https"), expectedCode); + }); + test("POST 9", () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + "mime/multipart" + "os" +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://api.apidash.dev/io/img") + if err != nil { + fmt.Println(err) + return + } + body := &bytes.Buffer{} + writer := multipart.NewWriter(body) + var ( + file *os.File + part io.Writer + ) + + writer.WriteField("token", "xyz") + file, err = os.Open("/Documents/up/1.png") + if err != nil { + fmt.Println(err) + return + } + defer file.Close() + + part, err = writer.CreateFormFile("imfile", "/Documents/up/1.png") + if err != nil { + fmt.Println(err) + return + } + io.Copy(part, file) + + writer.Close() + + query := url.Query() + + query.Set("size", "2") + + query.Set("len", "3") + + url.RawQuery = query.Encode() + req, err := http.NewRequest("POST", url.String(), body) + if err != nil { + fmt.Println(err) + return + } + + req.Header.Set("User-Agent", "Test Agent") + + req.Header.Set("Keep-Alive", "true") + + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}'''; + expect(goHttpCodeGen.getCode(requestModelPost9, "https"), expectedCode); + }); + + group('PUT Request', () { + test('PUT 1', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://reqres.in/api/users/2") + if err != nil { + fmt.Println(err) + return + } + body := bytes.NewBuffer([]byte(`{ +"name": "morpheus", +"job": "zion resident" +}`)) + req, err := http.NewRequest("PUT", url.String(), body) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}'''; + expect(goHttpCodeGen.getCode(requestModelPut1, "https"), expectedCode); + }); + }); + + group('PATCH Request', () { + test('PATCH 1', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://reqres.in/api/users/2") + if err != nil { + fmt.Println(err) + return + } + body := bytes.NewBuffer([]byte(`{ +"name": "marfeus", +"job": "accountant" +}`)) + req, err := http.NewRequest("PATCH", url.String(), body) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}'''; + expect(goHttpCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + }); + }); + + group('DELETE Request', () { + test('DELETE 1', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://reqres.in/api/users/2") + if err != nil { + fmt.Println(err) + return + } + req, err := http.NewRequest("DELETE", url.String(), nil) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}"""; + expect(goHttpCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + }); + + test('DELETE 2', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + +) + +func main() { + client := &http.Client{} + url, err := url.Parse("https://reqres.in/api/users/2") + if err != nil { + fmt.Println(err) + return + } + body := bytes.NewBuffer([]byte(`{ +"name": "marfeus", +"job": "accountant" +}`)) + req, err := http.NewRequest("DELETE", url.String(), body) + if err != nil { + fmt.Println(err) + return + } + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + res, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(res)) +}'''; + expect(goHttpCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + }); + }); +} From 6c2dc7540b65d678b72221d7ccf18a9d437f4f52 Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Tue, 12 Mar 2024 12:33:36 +0530 Subject: [PATCH 3/5] Refactored go http codegen and test file --- lib/codegen/go/http.dart | 8 +- test/codegen/go_http_codegen_test.dart | 105 ++++++++++++++++++------- 2 files changed, 77 insertions(+), 36 deletions(-) diff --git a/lib/codegen/go/http.dart b/lib/codegen/go/http.dart index 48882710..0b7b2a6c 100644 --- a/lib/codegen/go/http.dart +++ b/lib/codegen/go/http.dart @@ -112,7 +112,6 @@ func main() { String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { String result = ""; @@ -120,15 +119,12 @@ func main() { var requestBody = requestModel.requestBody; String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } var templateStart = jj.Template(kTemplateStart); result += templateStart.render({ "isBody": kMethodsWithBody.contains(requestModel.method) && requestBody != null, - "isFormDataRequest": requestModel.isFormDataRequest + "isFormDataRequest": requestModel.hasFormData, }); var templateUrl = jj.Template(kTemplateUrl); @@ -155,7 +151,7 @@ func main() { } else if (requestModel.requestBodyContentType == ContentType.json) { var templateJsonBody = jj.Template(kTemplateJsonBody); result += templateJsonBody.render({"body": requestBody}); - } else if (requestModel.isFormDataRequest) { + } else if (requestModel.hasFormData) { hasBody = true; var templateFormData = jj.Template(kTemplateFormData); result += templateFormData.render({ diff --git a/test/codegen/go_http_codegen_test.dart b/test/codegen/go_http_codegen_test.dart index f056cb38..7e59dd70 100644 --- a/test/codegen/go_http_codegen_test.dart +++ b/test/codegen/go_http_codegen_test.dart @@ -1,9 +1,11 @@ -import 'package:apidash/codegen/go/http.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; +import 'package:apidash/screens/home_page/editor_pane/details_card/code_pane.dart'; import 'package:test/test.dart'; import '../request_models.dart'; void main() { - final goHttpCodeGen = GoHttpCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -43,7 +45,8 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -88,7 +91,8 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -133,7 +137,8 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -186,7 +191,8 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -229,7 +235,8 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -277,7 +284,8 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { @@ -317,7 +325,8 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -365,7 +374,8 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -412,7 +422,8 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -456,7 +467,8 @@ func main() { fmt.Println(string(res)) }"""; expect( - goHttpCodeGen.getCode( + codegen.getCode( + CodegenLanguage.goHttp, requestModelGet10, "https", ), @@ -510,7 +522,9 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { @@ -550,7 +564,9 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelGet12, "https"), + expectedCode); }); }); @@ -592,7 +608,9 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { @@ -632,7 +650,8 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelHead2, "http"), + expectedCode); }); }); @@ -678,7 +697,9 @@ func main() { } fmt.Println(string(res)) }'''; - expect(goHttpCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { @@ -701,7 +722,12 @@ func main() { return } body := bytes.NewBuffer([]byte(`{ -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }`)) req, err := http.NewRequest("POST", url.String(), body) if err != nil { @@ -722,7 +748,9 @@ func main() { } fmt.Println(string(res)) }'''; - expect(goHttpCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -769,7 +797,9 @@ func main() { } fmt.Println(string(res)) }'''; - expect(goHttpCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelPost3, "https"), + expectedCode); }); test('POST 4', () { @@ -809,7 +839,9 @@ func main() { } fmt.Println(string(res)) }'''; - expect(goHttpCodeGen.getCode(requestModelPost4, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelPost4, "https"), + expectedCode); }); test('POST 5', () { @@ -852,7 +884,9 @@ func main() { } fmt.Println(string(res)) }'''; - expect(goHttpCodeGen.getCode(requestModelPost5, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelPost5, "https"), + expectedCode); }); }); @@ -893,7 +927,8 @@ func main() { } fmt.Println(string(res)) }'''; - expect(goHttpCodeGen.getCode(requestModelPost6, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPost6, "https"), + expectedCode); }); test("POST 7", () { const expectedCode = r'''package main @@ -958,7 +993,8 @@ func main() { } fmt.Println(string(res)) }'''; - expect(goHttpCodeGen.getCode(requestModelPost7, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPost7, "https"), + expectedCode); }); test("POST 8", () { const expectedCode = r'''package main @@ -1004,7 +1040,8 @@ func main() { } fmt.Println(string(res)) }'''; - expect(goHttpCodeGen.getCode(requestModelPost8, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPost8, "https"), + expectedCode); }); test("POST 9", () { const expectedCode = r'''package main @@ -1081,7 +1118,8 @@ func main() { } fmt.Println(string(res)) }'''; - expect(goHttpCodeGen.getCode(requestModelPost9, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPost9, "https"), + expectedCode); }); group('PUT Request', () { @@ -1127,7 +1165,8 @@ func main() { } fmt.Println(string(res)) }'''; - expect(goHttpCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPut1, "https"), + expectedCode); }); }); @@ -1174,7 +1213,9 @@ func main() { } fmt.Println(string(res)) }'''; - expect(goHttpCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelPatch1, "https"), + expectedCode); }); }); @@ -1216,7 +1257,9 @@ func main() { } fmt.Println(string(res)) }"""; - expect(goHttpCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -1261,7 +1304,9 @@ func main() { } fmt.Println(string(res)) }'''; - expect(goHttpCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelDelete2, "https"), + expectedCode); }); }); } From 493ead5212345562a42659ddf1f6e2ad2beb7aec Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Tue, 12 Mar 2024 20:08:15 +0530 Subject: [PATCH 4/5] golang fixes and updates --- lib/codegen/go/http.dart | 134 ++-- lib/models/request_model.dart | 4 + test/codegen/go_http_codegen_test.dart | 867 +++++++++---------------- 3 files changed, 362 insertions(+), 643 deletions(-) diff --git a/lib/codegen/go/http.dart b/lib/codegen/go/http.dart index 0b7b2a6c..4bdecf48 100644 --- a/lib/codegen/go/http.dart +++ b/lib/codegen/go/http.dart @@ -1,9 +1,7 @@ -import 'dart:convert'; - +import 'package:apidash/consts.dart'; import 'package:jinja/jinja.dart' as jj; import 'package:apidash/utils/utils.dart' show getValidRequestUri; import 'package:apidash/models/models.dart' show RequestModel; -import 'package:apidash/consts.dart'; class GoHttpCodeGen { final String kTemplateStart = """package main @@ -12,10 +10,10 @@ import ( "fmt" "io" "net/http" - "net/url" - {% if isBody %}"bytes" - {% if isFormDataRequest %}"mime/multipart" - "os"{% endif %}{% endif %} + "net/url"{% if hasBody %} + "bytes"{% if hasFormData %} + "mime/multipart"{% if hasFileInFormData %} + "os"{% endif %}{% endif %}{% endif %} ) func main() { @@ -24,44 +22,26 @@ func main() { """; String kTemplateUrl = """ - url, err := url.Parse("{{url}}") - if err != nil { - fmt.Println(err) - return - } + url, _ := url.Parse("{{url}}") """; - String kTemplateRawBody = """ - {% if body %}body := bytes.NewBuffer([]byte(`{{body}}`)){% endif %} - -"""; - - String kTemplateJsonBody = """ - {% if body %}body := bytes.NewBuffer([]byte(`{{body}}`)){% endif %} + String kTemplateBody = """ + {% if body %}payload := bytes.NewBuffer([]byte(`{{body}}`)){% endif %} """; String kTemplateFormData = """ - body := &bytes.Buffer{} - writer := multipart.NewWriter(body) + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload){% if hasFileInFormData %} var ( file *os.File part io.Writer - ) + ){% endif %} {% for field in fields %} - {% if field.type == "file" %}file, err = os.Open("{{field.value}}") - if err != nil { - fmt.Println(err) - return - } + {% if field.type == "file" %}file, _ = os.Open("{{field.value}}") defer file.Close() - - part, err = writer.CreateFormFile("{{field.name}}", "{{field.value}}") - if err != nil { - fmt.Println(err) - return - } + part, _ = writer.CreateFormFile("{{field.name}}", "{{field.value}}") io.Copy(part, file) {% else %}writer.WriteField("{{field.name}}", "{{field.value}}"){% endif %}{% endfor %} writer.Close() @@ -71,43 +51,40 @@ func main() { String kTemplateHeader = """ {% if headers %}{% for header, value in headers %} - req.Header.Set("{{header}}", "{{value}}") -{% endfor %} + req.Header.Set("{{header}}", "{{value}}"){% endfor %} {% endif %} """; + String kStringFormDataHeader = """ + req.Header.Set("Content-Type", writer.FormDataContentType()) +"""; + String kTemplateQueryParam = """ query := url.Query() {% for key, value in params %} - query.Set("{{key}}", "{{value}}") - {% endfor %} + query.Set("{{key}}", "{{value}}"){% endfor %} + url.RawQuery = query.Encode() """; String kTemplateRequest = """ - req, err := http.NewRequest("{{method}}", url.String(), {% if hasBody %}body{% else %}nil{% endif %}) - if err != nil { - fmt.Println(err) - return - } + req, _ := http.NewRequest("{{method}}", url.String(), {% if hasBody %}payload{% else %}nil{% endif %}) """; final String kTemplateEnd = """ - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() - res, err := io.ReadAll(resp.Body) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; String? getCode( @@ -122,9 +99,9 @@ func main() { var templateStart = jj.Template(kTemplateStart); result += templateStart.render({ - "isBody": kMethodsWithBody.contains(requestModel.method) && - requestBody != null, - "isFormDataRequest": requestModel.hasFormData, + "hasBody": requestModel.hasData, + "hasFormData": requestModel.hasFormData, + "hasFileInFormData": requestModel.hasFileInFormData, }); var templateUrl = jj.Template(kTemplateUrl); @@ -138,26 +115,17 @@ func main() { Uri? uri = rec.$1; if (uri != null) { - var method = requestModel.method.name.toUpperCase(); - if (kMethodsWithBody.contains(requestModel.method) && - requestBody != null) { - var contentLength = utf8.encode(requestBody).length; - if (contentLength > 0) { - hasBody = true; - } - if (requestModel.requestBodyContentType == ContentType.text) { - var templateRawBody = jj.Template(kTemplateRawBody); - result += templateRawBody.render({"body": requestBody}); - } else if (requestModel.requestBodyContentType == ContentType.json) { - var templateJsonBody = jj.Template(kTemplateJsonBody); - result += templateJsonBody.render({"body": requestBody}); - } else if (requestModel.hasFormData) { - hasBody = true; - var templateFormData = jj.Template(kTemplateFormData); - result += templateFormData.render({ - "fields": requestModel.formDataMapList, - }); - } + if (requestModel.hasTextData || requestModel.hasJsonData) { + hasBody = true; + var templateRawBody = jj.Template(kTemplateBody); + result += templateRawBody.render({"body": requestBody}); + } else if (requestModel.hasFormData) { + hasBody = true; + var templateFormData = jj.Template(kTemplateFormData); + result += templateFormData.render({ + "hasFileInFormData": requestModel.hasFileInFormData, + "fields": requestModel.formDataMapList, + }); } if (uri.hasQuery) { @@ -168,18 +136,30 @@ func main() { } } + var method = requestModel.method.name.toUpperCase(); var templateRequest = jj.Template(kTemplateRequest); - result += - templateRequest.render({"method": method, "hasBody": hasBody}); + result += templateRequest.render({ + "method": method, + "hasBody": hasBody, + }); var headersList = requestModel.enabledRequestHeaders; - if (headersList != null) { + if (headersList != null || requestModel.hasData) { var headers = requestModel.enabledHeadersMap; + if (requestModel.hasJsonData || requestModel.hasTextData) { + headers.putIfAbsent(kHeaderContentType, + () => requestModel.requestBodyContentType.header); + } if (headers.isNotEmpty) { var templateHeader = jj.Template(kTemplateHeader); - result += templateHeader.render({"headers": headers}); + result += templateHeader.render({ + "headers": headers, + }); } } + if (requestModel.hasFormData) { + result += kStringFormDataHeader; + } result += kTemplateEnd; } diff --git a/lib/models/request_model.dart b/lib/models/request_model.dart index 290681f6..8a1fea7e 100644 --- a/lib/models/request_model.dart +++ b/lib/models/request_model.dart @@ -68,6 +68,7 @@ class RequestModel { bool get hasJsonContentType => requestBodyContentType == ContentType.json; bool get hasTextContentType => requestBodyContentType == ContentType.text; int get contentLength => utf8.encode(requestBody ?? "").length; + bool get hasData => hasJsonData || hasTextData || hasFormData; bool get hasJsonData => kMethodsWithBody.contains(method) && hasJsonContentType && @@ -84,6 +85,9 @@ class RequestModel { requestFormDataList ?? []; List> get formDataMapList => rowsToFormDataMapList(requestFormDataList) ?? []; + bool get hasFileInFormData => formDataList + .map((e) => e.type == FormDataType.file) + .any((element) => element); bool get hasContentTypeHeader => enabledHeadersMap.keys .any((k) => k.toLowerCase() == HttpHeaders.contentTypeHeader); diff --git a/test/codegen/go_http_codegen_test.dart b/test/codegen/go_http_codegen_test.dart index 7e59dd70..421f8018 100644 --- a/test/codegen/go_http_codegen_test.dart +++ b/test/codegen/go_http_codegen_test.dart @@ -16,34 +16,23 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev") - if err != nil { - fmt.Println(err) - return - } - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + url, _ := url.Parse("https://api.apidash.dev") + req, _ := http.NewRequest("GET", url.String(), nil) - res, err := io.ReadAll(resp.Body) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet1, "https"), expectedCode); @@ -57,39 +46,28 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/country/data") - if err != nil { - fmt.Println(err) - return - } + url, _ := url.Parse("https://api.apidash.dev/country/data") query := url.Query() query.Set("code", "US") - - url.RawQuery = query.Encode() - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() - res, err := io.ReadAll(resp.Body) + url.RawQuery = query.Encode() + req, _ := http.NewRequest("GET", url.String(), nil) + + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet2, "https"), expectedCode); @@ -103,39 +81,28 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/country/data?code=US") - if err != nil { - fmt.Println(err) - return - } + url, _ := url.Parse("https://api.apidash.dev/country/data?code=US") query := url.Query() query.Set("code", "IND") - - url.RawQuery = query.Encode() - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() - res, err := io.ReadAll(resp.Body) + url.RawQuery = query.Encode() + req, _ := http.NewRequest("GET", url.String(), nil) + + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet3, "https"), expectedCode); @@ -149,47 +116,32 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/humanize/social") - if err != nil { - fmt.Println(err) - return - } + url, _ := url.Parse("https://api.apidash.dev/humanize/social") query := url.Query() query.Set("num", "8700000") - query.Set("digits", "3") - query.Set("system", "SS") - query.Set("add_space", "true") - query.Set("trailing_zeros", "true") - - url.RawQuery = query.Encode() - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() - res, err := io.ReadAll(resp.Body) + url.RawQuery = query.Encode() + req, _ := http.NewRequest("GET", url.String(), nil) + + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet4, "https"), expectedCode); @@ -203,37 +155,25 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.github.com/repos/foss42/apidash") - if err != nil { - fmt.Println(err) - return - } - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } + url, _ := url.Parse("https://api.github.com/repos/foss42/apidash") + req, _ := http.NewRequest("GET", url.String(), nil) req.Header.Set("User-Agent", "Test Agent") - resp, err := client.Do(req) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - defer resp.Body.Close() + defer response.Body.Close() - res, err := io.ReadAll(resp.Body) - if err != nil { - fmt.Println(err) - return - } - fmt.Println(string(res)) + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet5, "https"), expectedCode); @@ -247,42 +187,30 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.github.com/repos/foss42/apidash") - if err != nil { - fmt.Println(err) - return - } + url, _ := url.Parse("https://api.github.com/repos/foss42/apidash") query := url.Query() query.Set("raw", "true") - + url.RawQuery = query.Encode() - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } + req, _ := http.NewRequest("GET", url.String(), nil) req.Header.Set("User-Agent", "Test Agent") - resp, err := client.Do(req) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - defer resp.Body.Close() + defer response.Body.Close() - res, err := io.ReadAll(resp.Body) - if err != nil { - fmt.Println(err) - return - } - fmt.Println(string(res)) + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet6, "https"), expectedCode); @@ -296,34 +224,23 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev") - if err != nil { - fmt.Println(err) - return - } - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + url, _ := url.Parse("https://api.apidash.dev") + req, _ := http.NewRequest("GET", url.String(), nil) - res, err := io.ReadAll(resp.Body) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet7, "https"), expectedCode); @@ -337,42 +254,30 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.github.com/repos/foss42/apidash") - if err != nil { - fmt.Println(err) - return - } + url, _ := url.Parse("https://api.github.com/repos/foss42/apidash") query := url.Query() query.Set("raw", "true") - + url.RawQuery = query.Encode() - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } + req, _ := http.NewRequest("GET", url.String(), nil) req.Header.Set("User-Agent", "Test Agent") - resp, err := client.Do(req) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - defer resp.Body.Close() + defer response.Body.Close() - res, err := io.ReadAll(resp.Body) - if err != nil { - fmt.Println(err) - return - } - fmt.Println(string(res)) + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet8, "https"), expectedCode); @@ -386,41 +291,29 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/humanize/social") - if err != nil { - fmt.Println(err) - return - } + url, _ := url.Parse("https://api.apidash.dev/humanize/social") query := url.Query() query.Set("num", "8700000") - query.Set("add_space", "true") - - url.RawQuery = query.Encode() - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() - res, err := io.ReadAll(resp.Body) + url.RawQuery = query.Encode() + req, _ := http.NewRequest("GET", url.String(), nil) + + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet9, "https"), expectedCode); @@ -434,37 +327,25 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/humanize/social") - if err != nil { - fmt.Println(err) - return - } - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } + url, _ := url.Parse("https://api.apidash.dev/humanize/social") + req, _ := http.NewRequest("GET", url.String(), nil) req.Header.Set("User-Agent", "Test Agent") - resp, err := client.Do(req) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - defer resp.Body.Close() + defer response.Body.Close() - res, err := io.ReadAll(resp.Body) - if err != nil { - fmt.Println(err) - return - } - fmt.Println(string(res)) + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect( codegen.getCode( @@ -483,44 +364,31 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/humanize/social") - if err != nil { - fmt.Println(err) - return - } + url, _ := url.Parse("https://api.apidash.dev/humanize/social") query := url.Query() query.Set("num", "8700000") - query.Set("digits", "3") - + url.RawQuery = query.Encode() - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } + req, _ := http.NewRequest("GET", url.String(), nil) req.Header.Set("User-Agent", "Test Agent") - resp, err := client.Do(req) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - defer resp.Body.Close() + defer response.Body.Close() - res, err := io.ReadAll(resp.Body) - if err != nil { - fmt.Println(err) - return - } - fmt.Println(string(res)) + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect( codeGen.getCode(CodegenLanguage.goHttp, requestModelGet11, "https"), @@ -535,34 +403,23 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/humanize/social") - if err != nil { - fmt.Println(err) - return - } - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + url, _ := url.Parse("https://api.apidash.dev/humanize/social") + req, _ := http.NewRequest("GET", url.String(), nil) - res, err := io.ReadAll(resp.Body) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect( codeGen.getCode(CodegenLanguage.goHttp, requestModelGet12, "https"), @@ -579,34 +436,23 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev") - if err != nil { - fmt.Println(err) - return - } - req, err := http.NewRequest("HEAD", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + url, _ := url.Parse("https://api.apidash.dev") + req, _ := http.NewRequest("HEAD", url.String(), nil) - res, err := io.ReadAll(resp.Body) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect( codeGen.getCode(CodegenLanguage.goHttp, requestModelHead1, "https"), @@ -621,34 +467,23 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("http://api.apidash.dev") - if err != nil { - fmt.Println(err) - return - } - req, err := http.NewRequest("HEAD", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + url, _ := url.Parse("http://api.apidash.dev") + req, _ := http.NewRequest("HEAD", url.String(), nil) - res, err := io.ReadAll(resp.Body) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelHead2, "http"), expectedCode); @@ -665,37 +500,28 @@ import ( "net/http" "net/url" "bytes" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/case/lower") - if err != nil { - fmt.Println(err) - return - } - body := bytes.NewBuffer([]byte(`{ + url, _ := url.Parse("https://api.apidash.dev/case/lower") + payload := bytes.NewBuffer([]byte(`{ "text": "I LOVE Flutter" }`)) - req, err := http.NewRequest("POST", url.String(), body) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + req, _ := http.NewRequest("POST", url.String(), payload) - res, err := io.ReadAll(resp.Body) + req.Header.Set("Content-Type", "text/plain") + + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }'''; expect( codeGen.getCode(CodegenLanguage.goHttp, requestModelPost1, "https"), @@ -711,17 +537,12 @@ import ( "net/http" "net/url" "bytes" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/case/lower") - if err != nil { - fmt.Println(err) - return - } - body := bytes.NewBuffer([]byte(`{ + url, _ := url.Parse("https://api.apidash.dev/case/lower") + payload := bytes.NewBuffer([]byte(`{ "text": "I LOVE Flutter", "flag": null, "male": true, @@ -729,24 +550,20 @@ func main() { "no": 1.2, "arr": ["null", "true", "false", null] }`)) - req, err := http.NewRequest("POST", url.String(), body) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + req, _ := http.NewRequest("POST", url.String(), payload) - res, err := io.ReadAll(resp.Body) + req.Header.Set("Content-Type", "application/json") + + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }'''; expect( codeGen.getCode(CodegenLanguage.goHttp, requestModelPost2, "https"), @@ -762,40 +579,29 @@ import ( "net/http" "net/url" "bytes" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/case/lower") - if err != nil { - fmt.Println(err) - return - } - body := bytes.NewBuffer([]byte(`{ + url, _ := url.Parse("https://api.apidash.dev/case/lower") + payload := bytes.NewBuffer([]byte(`{ "text": "I LOVE Flutter" }`)) - req, err := http.NewRequest("POST", url.String(), body) - if err != nil { - fmt.Println(err) - return - } + req, _ := http.NewRequest("POST", url.String(), payload) req.Header.Set("User-Agent", "Test Agent") + req.Header.Set("Content-Type", "application/json") - resp, err := client.Do(req) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - defer resp.Body.Close() + defer response.Body.Close() - res, err := io.ReadAll(resp.Body) - if err != nil { - fmt.Println(err) - return - } - fmt.Println(string(res)) + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }'''; expect( codeGen.getCode(CodegenLanguage.goHttp, requestModelPost3, "https"), @@ -810,34 +616,34 @@ import ( "io" "net/http" "net/url" - + "bytes" + "mime/multipart" ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/io/form") - if err != nil { - fmt.Println(err) - return - } - req, err := http.NewRequest("POST", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + url, _ := url.Parse("https://api.apidash.dev/io/form") + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + + writer.WriteField("text", "API") + writer.WriteField("sep", "|") + writer.WriteField("times", "3") + writer.Close() - res, err := io.ReadAll(resp.Body) + req, _ := http.NewRequest("POST", url.String(), payload) + req.Header.Set("Content-Type", writer.FormDataContentType()) + + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }'''; expect( codeGen.getCode(CodegenLanguage.goHttp, requestModelPost4, "https"), @@ -852,37 +658,36 @@ import ( "io" "net/http" "net/url" - + "bytes" + "mime/multipart" ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/io/form") - if err != nil { - fmt.Println(err) - return - } - req, err := http.NewRequest("POST", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } + url, _ := url.Parse("https://api.apidash.dev/io/form") + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + + writer.WriteField("text", "API") + writer.WriteField("sep", "|") + writer.WriteField("times", "3") + writer.Close() + + req, _ := http.NewRequest("POST", url.String(), payload) req.Header.Set("User-Agent", "Test Agent") + req.Header.Set("Content-Type", writer.FormDataContentType()) - resp, err := client.Do(req) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - defer resp.Body.Close() + defer response.Body.Close() - res, err := io.ReadAll(resp.Body) - if err != nil { - fmt.Println(err) - return - } - fmt.Println(string(res)) + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }'''; expect( codeGen.getCode(CodegenLanguage.goHttp, requestModelPost5, "https"), @@ -898,34 +703,42 @@ import ( "io" "net/http" "net/url" - + "bytes" + "mime/multipart" + "os" ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/io/img") - if err != nil { - fmt.Println(err) - return - } - req, err := http.NewRequest("POST", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + url, _ := url.Parse("https://api.apidash.dev/io/img") + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + var ( + file *os.File + part io.Writer + ) + + writer.WriteField("token", "xyz") + file, _ = os.Open("/Documents/up/1.png") + defer file.Close() + part, _ = writer.CreateFormFile("imfile", "/Documents/up/1.png") + io.Copy(part, file) + + writer.Close() - res, err := io.ReadAll(resp.Body) + req, _ := http.NewRequest("POST", url.String(), payload) + req.Header.Set("Content-Type", writer.FormDataContentType()) + + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }'''; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPost6, "https"), expectedCode); @@ -945,53 +758,35 @@ import ( func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/io/img") - if err != nil { - fmt.Println(err) - return - } - body := &bytes.Buffer{} - writer := multipart.NewWriter(body) + url, _ := url.Parse("https://api.apidash.dev/io/img") + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) var ( file *os.File part io.Writer ) writer.WriteField("token", "xyz") - file, err = os.Open("/Documents/up/1.png") - if err != nil { - fmt.Println(err) - return - } + file, _ = os.Open("/Documents/up/1.png") defer file.Close() - - part, err = writer.CreateFormFile("imfile", "/Documents/up/1.png") - if err != nil { - fmt.Println(err) - return - } + part, _ = writer.CreateFormFile("imfile", "/Documents/up/1.png") io.Copy(part, file) writer.Close() - req, err := http.NewRequest("POST", url.String(), body) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + req, _ := http.NewRequest("POST", url.String(), payload) + req.Header.Set("Content-Type", writer.FormDataContentType()) - res, err := io.ReadAll(resp.Body) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }'''; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPost7, "https"), expectedCode); @@ -1004,41 +799,40 @@ import ( "io" "net/http" "net/url" - + "bytes" + "mime/multipart" ) func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/io/form") - if err != nil { - fmt.Println(err) - return - } + url, _ := url.Parse("https://api.apidash.dev/io/form") + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + + writer.WriteField("text", "API") + writer.WriteField("sep", "|") + writer.WriteField("times", "3") + writer.Close() + query := url.Query() query.Set("size", "2") - query.Set("len", "3") - - url.RawQuery = query.Encode() - req, err := http.NewRequest("POST", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() - res, err := io.ReadAll(resp.Body) + url.RawQuery = query.Encode() + req, _ := http.NewRequest("POST", url.String(), payload) + req.Header.Set("Content-Type", writer.FormDataContentType()) + + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }'''; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPost8, "https"), expectedCode); @@ -1058,31 +852,18 @@ import ( func main() { client := &http.Client{} - url, err := url.Parse("https://api.apidash.dev/io/img") - if err != nil { - fmt.Println(err) - return - } - body := &bytes.Buffer{} - writer := multipart.NewWriter(body) + url, _ := url.Parse("https://api.apidash.dev/io/img") + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) var ( file *os.File part io.Writer ) writer.WriteField("token", "xyz") - file, err = os.Open("/Documents/up/1.png") - if err != nil { - fmt.Println(err) - return - } + file, _ = os.Open("/Documents/up/1.png") defer file.Close() - - part, err = writer.CreateFormFile("imfile", "/Documents/up/1.png") - if err != nil { - fmt.Println(err) - return - } + part, _ = writer.CreateFormFile("imfile", "/Documents/up/1.png") io.Copy(part, file) writer.Close() @@ -1090,33 +871,25 @@ func main() { query := url.Query() query.Set("size", "2") - query.Set("len", "3") - + url.RawQuery = query.Encode() - req, err := http.NewRequest("POST", url.String(), body) - if err != nil { - fmt.Println(err) - return - } + req, _ := http.NewRequest("POST", url.String(), payload) req.Header.Set("User-Agent", "Test Agent") - req.Header.Set("Keep-Alive", "true") + req.Header.Set("Content-Type", writer.FormDataContentType()) - resp, err := client.Do(req) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - defer resp.Body.Close() + defer response.Body.Close() - res, err := io.ReadAll(resp.Body) - if err != nil { - fmt.Println(err) - return - } - fmt.Println(string(res)) + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }'''; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPost9, "https"), expectedCode); @@ -1132,38 +905,29 @@ import ( "net/http" "net/url" "bytes" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://reqres.in/api/users/2") - if err != nil { - fmt.Println(err) - return - } - body := bytes.NewBuffer([]byte(`{ + url, _ := url.Parse("https://reqres.in/api/users/2") + payload := bytes.NewBuffer([]byte(`{ "name": "morpheus", "job": "zion resident" }`)) - req, err := http.NewRequest("PUT", url.String(), body) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + req, _ := http.NewRequest("PUT", url.String(), payload) - res, err := io.ReadAll(resp.Body) + req.Header.Set("Content-Type", "application/json") + + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }'''; expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPut1, "https"), expectedCode); @@ -1180,38 +944,29 @@ import ( "net/http" "net/url" "bytes" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://reqres.in/api/users/2") - if err != nil { - fmt.Println(err) - return - } - body := bytes.NewBuffer([]byte(`{ + url, _ := url.Parse("https://reqres.in/api/users/2") + payload := bytes.NewBuffer([]byte(`{ "name": "marfeus", "job": "accountant" }`)) - req, err := http.NewRequest("PATCH", url.String(), body) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + req, _ := http.NewRequest("PATCH", url.String(), payload) - res, err := io.ReadAll(resp.Body) + req.Header.Set("Content-Type", "application/json") + + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }'''; expect( codeGen.getCode(CodegenLanguage.goHttp, requestModelPatch1, "https"), @@ -1228,34 +983,23 @@ import ( "io" "net/http" "net/url" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://reqres.in/api/users/2") - if err != nil { - fmt.Println(err) - return - } - req, err := http.NewRequest("DELETE", url.String(), nil) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + url, _ := url.Parse("https://reqres.in/api/users/2") + req, _ := http.NewRequest("DELETE", url.String(), nil) - res, err := io.ReadAll(resp.Body) + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }"""; expect( codeGen.getCode(CodegenLanguage.goHttp, requestModelDelete1, "https"), @@ -1271,38 +1015,29 @@ import ( "net/http" "net/url" "bytes" - ) func main() { client := &http.Client{} - url, err := url.Parse("https://reqres.in/api/users/2") - if err != nil { - fmt.Println(err) - return - } - body := bytes.NewBuffer([]byte(`{ + url, _ := url.Parse("https://reqres.in/api/users/2") + payload := bytes.NewBuffer([]byte(`{ "name": "marfeus", "job": "accountant" }`)) - req, err := http.NewRequest("DELETE", url.String(), body) - if err != nil { - fmt.Println(err) - return - } - resp, err := client.Do(req) - if err != nil { - fmt.Println(err) - return - } - defer resp.Body.Close() + req, _ := http.NewRequest("DELETE", url.String(), payload) - res, err := io.ReadAll(resp.Body) + req.Header.Set("Content-Type", "application/json") + + response, err := client.Do(req) if err != nil { fmt.Println(err) return } - fmt.Println(string(res)) + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) }'''; expect( codeGen.getCode(CodegenLanguage.goHttp, requestModelDelete2, "https"), From a8637ea609c1458324cd6845ccd158ab763f5143 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Tue, 12 Mar 2024 20:12:57 +0530 Subject: [PATCH 5/5] Update codegen order --- lib/consts.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/consts.dart b/lib/consts.dart index 8c4cfe8f..28818b62 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -266,14 +266,14 @@ enum CodegenLanguage { har("HAR", "json", "har"), dartHttp("Dart (http)", "dart", "dart"), dartDio("Dart (dio)", "dart", "dart"), + goHttp("Go (http)", "go", "go"), jsAxios("JavaScript (axios)", "javascript", "js"), jsFetch("JavaScript (fetch)", "javascript", "js"), nodejsAxios("node.js (axios)", "javascript", "js"), nodejsFetch("node.js (fetch)", "javascript", "js"), kotlinOkHttp("Kotlin (okhttp3)", "java", "kt"), pythonHttpClient("Python (http.client)", "python", "py"), - pythonRequests("Python (requests)", "python", "py"), - goHttp("Golang (http)", "go", "go"); + pythonRequests("Python (requests)", "python", "py"); const CodegenLanguage(this.label, this.codeHighlightLang, this.ext); final String label;