From cbf4a921e809ba6fde7329e1ea9b57598cc91faf Mon Sep 17 00:00:00 2001 From: ricardo Date: Wed, 8 Apr 2020 23:17:02 -0400 Subject: [PATCH 1/2] :zap: HTTP node improvements --- packages/nodes-base/nodes/HttpRequest.node.ts | 55 +++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/packages/nodes-base/nodes/HttpRequest.node.ts b/packages/nodes-base/nodes/HttpRequest.node.ts index 5afc2bb74..2948e3bff 100644 --- a/packages/nodes-base/nodes/HttpRequest.node.ts +++ b/packages/nodes-base/nodes/HttpRequest.node.ts @@ -168,7 +168,20 @@ export class HttpRequest implements INodeType { default: 'json', description: 'The format in which the data gets returned from the URL.', }, - + { + displayName: 'Parse to JSON', + name: 'parseToJson', + type: 'boolean', + default: false, + displayOptions: { + show: { + responseFormat: [ + 'string', + ], + }, + }, + description: 'Parse the response to JSON', + }, { displayName: 'Property Name', name: 'dataPropertyName', @@ -180,6 +193,9 @@ export class HttpRequest implements INodeType { responseFormat: [ 'string', ], + parseToJson: [ + false, + ], }, }, description: 'Name of the property to which to write the response data.', @@ -634,9 +650,9 @@ export class HttpRequest implements INodeType { // Paramter is empty so skip it continue; } + const sendBinaryData = this.getNodeParameter('sendBinaryData', itemIndex, false) as boolean; if (optionData.name === 'body' && parametersAreJson === true) { - const sendBinaryData = this.getNodeParameter('sendBinaryData', itemIndex, false) as boolean; if (sendBinaryData === true) { const contentTypesAllowed = [ @@ -698,8 +714,14 @@ export class HttpRequest implements INodeType { } } + try { + JSON.parse(tempValue as string); + } catch (error) { + throw new Error(`${optionData.name} must be a valid JSON`); + } + // @ts-ignore - requestOptions[optionData.name] = tempValue; + requestOptions[optionData.name] = JSON.parse(tempValue); // @ts-ignore if (typeof requestOptions[optionData.name] !== 'object' && options.bodyContentType !== 'raw') { @@ -767,6 +789,7 @@ export class HttpRequest implements INodeType { } if (responseFormat === 'json') { + requestOptions.headers!['accept'] = 'application/json,text/*;q=0.99'; } else if (responseFormat === 'string') { requestOptions.headers!['accept'] = 'application/json,text/html,application/xhtml+xml,application/xml,text/*;q=0.9, */*;q=0.1'; @@ -781,7 +804,6 @@ export class HttpRequest implements INodeType { } else { requestOptions.json = true; } - try { // Now that the options are all set make the actual http request response = await this.helpers.request(requestOptions); @@ -833,13 +855,22 @@ export class HttpRequest implements INodeType { items[itemIndex] = newItem; } else if (responseFormat === 'string') { - const dataPropertyName = this.getNodeParameter('dataPropertyName', 0) as string; + const parseToJson = this.getNodeParameter('parseToJson', 0) as string; + + let dataPropertyName = ''; + if (!parseToJson) { + dataPropertyName = this.getNodeParameter('dataPropertyName', 0) as string; + } if (fullResponse === true) { - const returnItem: IDataObject = {}; + let returnItem: IDataObject = {}; for (const property of fullReponseProperties) { if (property === 'body') { - returnItem[dataPropertyName] = response[property]; + if (!parseToJson) { + returnItem[dataPropertyName] = response[property]; + } else { + returnItem = JSON.parse(response.property); + } continue; } @@ -847,10 +878,14 @@ export class HttpRequest implements INodeType { } returnItems.push({ json: returnItem }); } else { + let output: IDataObject = {}; + if (!parseToJson) { + output = { [dataPropertyName]: response }; + } else { + output = JSON.parse(response); + } returnItems.push({ - json: { - [dataPropertyName]: response, - } + json: output, }); } } else { From 4374b3d91483cbf17c69b28122fac8d22b150c6c Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Fri, 10 Apr 2020 00:44:09 +0200 Subject: [PATCH 2/2] :zap: Small improvement to HTTP Request-Node --- packages/nodes-base/nodes/HttpRequest.node.ts | 64 ++++++------------- 1 file changed, 20 insertions(+), 44 deletions(-) diff --git a/packages/nodes-base/nodes/HttpRequest.node.ts b/packages/nodes-base/nodes/HttpRequest.node.ts index 2948e3bff..2186a2f22 100644 --- a/packages/nodes-base/nodes/HttpRequest.node.ts +++ b/packages/nodes-base/nodes/HttpRequest.node.ts @@ -168,20 +168,6 @@ export class HttpRequest implements INodeType { default: 'json', description: 'The format in which the data gets returned from the URL.', }, - { - displayName: 'Parse to JSON', - name: 'parseToJson', - type: 'boolean', - default: false, - displayOptions: { - show: { - responseFormat: [ - 'string', - ], - }, - }, - description: 'Parse the response to JSON', - }, { displayName: 'Property Name', name: 'dataPropertyName', @@ -193,9 +179,6 @@ export class HttpRequest implements INodeType { responseFormat: [ 'string', ], - parseToJson: [ - false, - ], }, }, description: 'Name of the property to which to write the response data.', @@ -715,14 +698,12 @@ export class HttpRequest implements INodeType { } try { - JSON.parse(tempValue as string); + // @ts-ignore + requestOptions[optionData.name] = JSON.parse(tempValue as string); } catch (error) { throw new Error(`${optionData.name} must be a valid JSON`); } - // @ts-ignore - requestOptions[optionData.name] = JSON.parse(tempValue); - // @ts-ignore 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 @@ -855,22 +836,13 @@ export class HttpRequest implements INodeType { items[itemIndex] = newItem; } else if (responseFormat === 'string') { - const parseToJson = this.getNodeParameter('parseToJson', 0) as string; - - let dataPropertyName = ''; - if (!parseToJson) { - dataPropertyName = this.getNodeParameter('dataPropertyName', 0) as string; - } + const dataPropertyName = this.getNodeParameter('dataPropertyName', 0) as string; if (fullResponse === true) { - let returnItem: IDataObject = {}; + const returnItem: IDataObject = {}; for (const property of fullReponseProperties) { if (property === 'body') { - if (!parseToJson) { - returnItem[dataPropertyName] = response[property]; - } else { - returnItem = JSON.parse(response.property); - } + returnItem[dataPropertyName] = response[property]; continue; } @@ -878,14 +850,10 @@ export class HttpRequest implements INodeType { } returnItems.push({ json: returnItem }); } else { - let output: IDataObject = {}; - if (!parseToJson) { - output = { [dataPropertyName]: response }; - } else { - output = JSON.parse(response); - } returnItems.push({ - json: output, + json: { + [dataPropertyName]: response, + }, }); } } else { @@ -896,14 +864,22 @@ export class HttpRequest implements INodeType { returnItem[property] = response[property]; } - if (typeof returnItem.body === 'string') { - throw new Error('Response body is not valid JSON. Change "Response Format" to "String"'); + if (responseFormat === 'json' && typeof returnItem.body === 'string') { + try { + returnItem.body = JSON.parse(returnItem.body); + } catch (e) { + throw new Error('Response body is not valid JSON. Change "Response Format" to "String"'); + } } returnItems.push({ json: returnItem }); } else { - if (typeof response === 'string') { - throw new Error('Response body is not valid JSON. Change "Response Format" to "String"'); + if (responseFormat === 'json' && typeof response === 'string') { + try { + response = JSON.parse(response); + } catch (e) { + throw new Error('Response body is not valid JSON. Change "Response Format" to "String"'); + } } returnItems.push({ json: response });