diff --git a/src/templates/core/ApiRequestOptions.hbs b/src/templates/core/ApiRequestOptions.hbs index 355929a71..0998ce569 100644 --- a/src/templates/core/ApiRequestOptions.hbs +++ b/src/templates/core/ApiRequestOptions.hbs @@ -10,6 +10,7 @@ export type ApiRequestOptions = { readonly formData?: Record; readonly body?: any; readonly mediaType?: string; + readonly responseType?: 'blob'; readonly responseHeader?: string; readonly errors?: Record; }; diff --git a/src/templates/core/angular/sendRequest.hbs b/src/templates/core/angular/sendRequest.hbs index ad73d8332..79ada8bdf 100644 --- a/src/templates/core/angular/sendRequest.hbs +++ b/src/templates/core/angular/sendRequest.hbs @@ -7,10 +7,11 @@ export const sendRequest = ( formData: FormData | undefined, headers: HttpHeaders ): Observable> => { - return http.request(options.method, url, { + return http.request(options.method, url, { headers, body: body ?? formData, withCredentials: config.WITH_CREDENTIALS, observe: 'response', + responseType: options.responseType, }); }; diff --git a/src/templates/core/axios/sendRequest.hbs b/src/templates/core/axios/sendRequest.hbs index 0b871ea36..0da8a1962 100644 --- a/src/templates/core/axios/sendRequest.hbs +++ b/src/templates/core/axios/sendRequest.hbs @@ -15,6 +15,7 @@ const sendRequest = async ( data: body ?? formData, method: options.method, withCredentials: config.WITH_CREDENTIALS, + responseType: options.responseType, cancelToken: source.token, }; diff --git a/src/templates/core/fetch/getResponseBody.hbs b/src/templates/core/fetch/getResponseBody.hbs index 083cd16e9..0f7ad8681 100644 --- a/src/templates/core/fetch/getResponseBody.hbs +++ b/src/templates/core/fetch/getResponseBody.hbs @@ -1,4 +1,4 @@ -const getResponseBody = async (response: Response): Promise => { +const getResponseBody = async (response: Response, options: ApiRequestOptions): Promise => { if (response.status !== 204) { try { const contentType = response.headers.get('Content-Type'); @@ -6,6 +6,8 @@ const getResponseBody = async (response: Response): Promise => { const isJSON = contentType.toLowerCase().startsWith('application/json'); if (isJSON) { return await response.json(); + } else if (options.responseType === 'blob') { + return await response.blob(); } else { return await response.text(); } diff --git a/src/templates/core/fetch/request.hbs b/src/templates/core/fetch/request.hbs index 4af6f9440..ec6ed8492 100644 --- a/src/templates/core/fetch/request.hbs +++ b/src/templates/core/fetch/request.hbs @@ -72,7 +72,7 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C if (!onCancel.isCancelled) { const response = await sendRequest(config, options, url, body, formData, headers, onCancel); - const responseBody = await getResponseBody(response); + const responseBody = await getResponseBody(response, options); const responseHeader = getResponseHeader(response, options.responseHeader); const result: ApiResult = { diff --git a/src/templates/core/node/getResponseBody.hbs b/src/templates/core/node/getResponseBody.hbs index 083cd16e9..0f7ad8681 100644 --- a/src/templates/core/node/getResponseBody.hbs +++ b/src/templates/core/node/getResponseBody.hbs @@ -1,4 +1,4 @@ -const getResponseBody = async (response: Response): Promise => { +const getResponseBody = async (response: Response, options: ApiRequestOptions): Promise => { if (response.status !== 204) { try { const contentType = response.headers.get('Content-Type'); @@ -6,6 +6,8 @@ const getResponseBody = async (response: Response): Promise => { const isJSON = contentType.toLowerCase().startsWith('application/json'); if (isJSON) { return await response.json(); + } else if (options.responseType === 'blob') { + return await response.blob(); } else { return await response.text(); } diff --git a/src/templates/core/node/request.hbs b/src/templates/core/node/request.hbs index 8e6f6110e..edf40a4cd 100644 --- a/src/templates/core/node/request.hbs +++ b/src/templates/core/node/request.hbs @@ -77,7 +77,7 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C if (!onCancel.isCancelled) { const response = await sendRequest(options, url, body, formData, headers, onCancel); - const responseBody = await getResponseBody(response); + const responseBody = await getResponseBody(response, options); const responseHeader = getResponseHeader(response, options.responseHeader); const result: ApiResult = { diff --git a/src/templates/core/xhr/getResponseBody.hbs b/src/templates/core/xhr/getResponseBody.hbs index 596733a8a..af30434c6 100644 --- a/src/templates/core/xhr/getResponseBody.hbs +++ b/src/templates/core/xhr/getResponseBody.hbs @@ -1,4 +1,4 @@ -const getResponseBody = (xhr: XMLHttpRequest): any => { +const getResponseBody = (xhr: XMLHttpRequest, options: ApiRequestOptions): any => { if (xhr.status !== 204) { try { const contentType = xhr.getResponseHeader('Content-Type'); @@ -6,6 +6,8 @@ const getResponseBody = (xhr: XMLHttpRequest): any => { const isJSON = contentType.toLowerCase().startsWith('application/json'); if (isJSON) { return JSON.parse(xhr.responseText); + } else if (options.responseType === 'blob') { + return xhr.response; } else { return xhr.responseText; } diff --git a/src/templates/core/xhr/request.hbs b/src/templates/core/xhr/request.hbs index 47f92870b..fe5992435 100644 --- a/src/templates/core/xhr/request.hbs +++ b/src/templates/core/xhr/request.hbs @@ -75,7 +75,7 @@ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): C if (!onCancel.isCancelled) { const response = await sendRequest(config, options, url, body, formData, headers, onCancel); - const responseBody = getResponseBody(response); + const responseBody = getResponseBody(response, options); const responseHeader = getResponseHeader(response, options.responseHeader); const result: ApiResult = { diff --git a/src/templates/core/xhr/sendRequest.hbs b/src/templates/core/xhr/sendRequest.hbs index 0badf8daa..17b13ab1d 100644 --- a/src/templates/core/xhr/sendRequest.hbs +++ b/src/templates/core/xhr/sendRequest.hbs @@ -10,6 +10,7 @@ export const sendRequest = async ( const xhr = new XMLHttpRequest(); xhr.open(options.method, url, true); xhr.withCredentials = config.WITH_CREDENTIALS; + xhr.responseType = options.responseType; headers.forEach((value, key) => { xhr.setRequestHeader(key, value); diff --git a/src/templates/exportService.hbs b/src/templates/exportService.hbs index 2fdd9af58..c63f53206 100644 --- a/src/templates/exportService.hbs +++ b/src/templates/exportService.hbs @@ -133,6 +133,9 @@ export class {{{name}}}{{{@root.postfix}}} { mediaType: '{{{parametersBody.mediaType}}}', {{/if}} {{/if}} + {{#if results}} + {{>responseType}} + {{/if}} {{#if responseHeader}} responseHeader: '{{{responseHeader}}}', {{/if}} diff --git a/src/templates/partials/responseType.hbs b/src/templates/partials/responseType.hbs new file mode 100644 index 000000000..8d16b8a68 --- /dev/null +++ b/src/templates/partials/responseType.hbs @@ -0,0 +1,5 @@ +{{~#equals results.length 1~}} + {{~#equals results.0.base 'binary'~}} + responseType: 'blob', + {{/equals}} +{{~/equals~}} \ No newline at end of file diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index bf77cbdc1..cfd60b8ae 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -66,6 +66,7 @@ import partialIsNullable from '../templates/partials/isNullable.hbs'; import partialIsReadOnly from '../templates/partials/isReadOnly.hbs'; import partialIsRequired from '../templates/partials/isRequired.hbs'; import partialParameters from '../templates/partials/parameters.hbs'; +import partialResponseType from '../templates/partials/responseType.hbs'; import partialResult from '../templates/partials/result.hbs'; import partialSchema from '../templates/partials/schema.hbs'; import partialSchemaArray from '../templates/partials/schemaArray.hbs'; @@ -147,6 +148,7 @@ export const registerHandlebarTemplates = (root: { Handlebars.registerPartial('isReadOnly', Handlebars.template(partialIsReadOnly)); Handlebars.registerPartial('isRequired', Handlebars.template(partialIsRequired)); Handlebars.registerPartial('parameters', Handlebars.template(partialParameters)); + Handlebars.registerPartial('responseType', Handlebars.template(partialResponseType)); Handlebars.registerPartial('result', Handlebars.template(partialResult)); Handlebars.registerPartial('schema', Handlebars.template(partialSchema)); Handlebars.registerPartial('schemaArray', Handlebars.template(partialSchemaArray));