From 644b5455c9b974fc9377202bdfd91e3992071f3e Mon Sep 17 00:00:00 2001 From: Leo Date: Sat, 2 Nov 2019 10:12:59 +0100 Subject: [PATCH] added ability to post raw/string/xml --- packages/nodes-base/nodes/HttpRequest.node.ts | 44 ++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/packages/nodes-base/nodes/HttpRequest.node.ts b/packages/nodes-base/nodes/HttpRequest.node.ts index 9ab1068e08..5d9367b948 100644 --- a/packages/nodes-base/nodes/HttpRequest.node.ts +++ b/packages/nodes-base/nodes/HttpRequest.node.ts @@ -196,11 +196,11 @@ export class HttpRequest implements INodeType { }, { - displayName: 'JSON Parameters', + displayName: 'JSON/RAW Parameters', name: 'jsonParameters', type: 'boolean', default: false, - description: 'If the query and/or body parameter should be set via the UI or raw as JSON', + description: 'If the query and/or body parameter should be set via the value-key pair UI or JSON/RAW', }, { @@ -228,6 +228,10 @@ export class HttpRequest implements INodeType { name: 'JSON', value: 'json' }, + { + name: 'RAW/Custom', + value: 'raw' + }, { name: 'Form-Data Multipart', value: 'multipart-form-data' @@ -240,6 +244,24 @@ export class HttpRequest implements INodeType { default: 'json', description: 'Content-Type to use to send body parameters.', }, + { + displayName: 'MIME Type', + name: 'bodyContentCustomMIMEType', + type: 'string', + default: '', + placeholder: 'text/xml', + description: 'Specify the mime type for raw/custom body type', + required: false, + displayOptions: { + show: { + '/requestMethod': [ + 'PATCH', + 'POST', + 'PUT', + ], + }, + }, + }, { displayName: 'Full Response', name: 'fullResponse', @@ -357,7 +379,7 @@ export class HttpRequest implements INodeType { }, }, default: '', - description: 'Body parameters as JSON.', + description: 'Body parameters as JSON or RAW.', }, { displayName: 'Body Parameters', @@ -554,13 +576,13 @@ export class HttpRequest implements INodeType { requestOptions[optionData.name] = tempValue; // @ts-ignore - if (typeof requestOptions[optionData.name] !== 'object') { - // If it is not an object it must be JSON so parse it + if (typeof requestOptions[optionData.name] !== 'object' && options.bodyContentType !== 'raw') { + // If it is not an object && bodyContentType is not 'raw' it must be JSON so parse it try { // @ts-ignore requestOptions[optionData.name] = JSON.parse(requestOptions[optionData.name]); } catch (e) { - throw new Error(`The data in "${optionData.displayName}" is no valid JSON.`); + throw new Error(`The data in "${optionData.displayName}" is no valid JSON. Set Body Content Type to "RAW/Custom" for XML or other types of payloads`); } } } @@ -592,6 +614,14 @@ export class HttpRequest implements INodeType { } } + // Add Content Type if any are set + if (options.bodyContentCustomMIMEType) { + if(requestOptions.headers === undefined) { + requestOptions.headers = {}; + } + requestOptions.headers['Content-Type'] = options.bodyContentCustomMIMEType; + } + // Add credentials if any are set if (httpBasicAuth !== undefined) { requestOptions.auth = { @@ -612,6 +642,8 @@ export class HttpRequest implements INodeType { if (responseFormat === 'file') { requestOptions.encoding = null; + } else if(options.bodyContentType === 'raw') { + requestOptions.json = false; } else { requestOptions.json = true; }