mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Update http request node to support Property In/Out
This commit is contained in:
parent
dc36975083
commit
f1e54c959b
@ -15,6 +15,16 @@
|
||||
-->
|
||||
|
||||
<script type="text/html" data-template-name="http request">
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<label for="node-input-property"><i class="fa fa-sign-in"></i> <span data-i18n="common.label.propertyIn"></span></label>
|
||||
<input type="text" id="node-input-property" style="width:70%;"/>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<label for="node-input-method"><i class="fa fa-tasks"></i> <span data-i18n="httpin.label.method"></span></label>
|
||||
<select type="text" id="node-input-method" style="width:70%;">
|
||||
@ -98,7 +108,7 @@
|
||||
|
||||
|
||||
<div class="form-row">
|
||||
<label for="node-input-ret"><i class="fa fa-arrow-left"></i> <span data-i18n="httpin.label.return"></span></label>
|
||||
<label for="node-input-ret"><i class="fa fa-sign-out"></i> <span data-i18n="httpin.label.return"></span></label>
|
||||
<select type="text" id="node-input-ret" style="width:70%;">
|
||||
<option value="txt" data-i18n="httpin.utf8"></option>
|
||||
<option value="bin" data-i18n="httpin.binary"></option>
|
||||
@ -107,7 +117,10 @@
|
||||
</div>
|
||||
|
||||
<div class="form-row form-tips" id="tip-json" hidden><span data-i18n="httpin.tip.req"></span></div>
|
||||
|
||||
<div class="form-row">
|
||||
<label for="node-input-propertyOut"><i class="fa fa-sign-out"></i> <span data-i18n="common.label.propertyOut"></span></label>
|
||||
<input type="text" id="node-input-propertyOut" style="width:70%;"/>
|
||||
</div>
|
||||
<div class="form-row" style="margin-bottom:0;">
|
||||
<label><i class="fa fa-list"></i> <span data-i18n="httpin.label.headers"></span></label>
|
||||
</div>
|
||||
@ -115,10 +128,7 @@
|
||||
<ol id="node-input-headers-container"></ol>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
|
||||
<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
|
||||
</div>
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript">
|
||||
@ -235,7 +245,13 @@
|
||||
insecureHTTPParser: {value: false},
|
||||
authType: {value: ""},
|
||||
senderr: {value: false},
|
||||
headers: { value: [] }
|
||||
headers: { value: [] },
|
||||
property: {value:"payload",required:true,
|
||||
validate: RED.validators.typedInput({ type: 'msg', allowUndefined: true }),
|
||||
label:RED._("node-red:common.label.propertyIn")},
|
||||
propertyOut: {value:"payload",required:true,
|
||||
validate: RED.validators.typedInput({ type: 'msg', allowUndefined: true}),
|
||||
label:RED._("node-red:common.label.propertyOut")}
|
||||
},
|
||||
credentials: {
|
||||
user: {type:"text"},
|
||||
@ -426,6 +442,15 @@
|
||||
headerList.editableList('addItem', node.headers[index]);
|
||||
}
|
||||
}
|
||||
if (this.property === undefined) {
|
||||
$("#node-input-property").val("payload");
|
||||
}
|
||||
$("#node-input-property").typedInput({default:'msg',types:['msg']});
|
||||
if (this.propertyOut === undefined) {
|
||||
$("#node-input-propertyOut").val("payload");
|
||||
}
|
||||
$("#node-input-propertyOut").typedInput({default:'msg',types:['msg']});
|
||||
|
||||
},
|
||||
oneditsave: function() {
|
||||
if (!$("#node-input-usetls").is(':checked')) {
|
||||
|
@ -68,6 +68,8 @@ in your Node-RED user directory (${RED.settings.userDir}).
|
||||
RED.nodes.createNode(this,n);
|
||||
checkNodeAgentPatch();
|
||||
const node = this;
|
||||
node.property = n.property||"payload";
|
||||
node.propertyOut = n.propertyOut||node.property;
|
||||
const nodeUrl = n.url;
|
||||
const isTemplatedUrl = (nodeUrl||"").indexOf("{{") != -1;
|
||||
const nodeMethod = n.method || "GET";
|
||||
@ -431,14 +433,15 @@ in your Node-RED user directory (${RED.settings.userDir}).
|
||||
}
|
||||
}
|
||||
var payload = null;
|
||||
const value = RED.util.getMessageProperty(msg, node.property)
|
||||
|
||||
|
||||
if (method !== 'GET' && method !== 'HEAD' && typeof msg.payload !== "undefined") {
|
||||
if (opts.headers['content-type'] == 'multipart/form-data' && typeof msg.payload === "object") {
|
||||
if (method !== 'GET' && method !== 'HEAD' && typeof value !== "undefined") {
|
||||
if (opts.headers['content-type'] == 'multipart/form-data' && typeof value === "object") {
|
||||
let formData = new FormData();
|
||||
for (var opt in msg.payload) {
|
||||
if (msg.payload.hasOwnProperty(opt)) {
|
||||
var val = msg.payload[opt];
|
||||
for (var opt in value) {
|
||||
if (value.hasOwnProperty(opt)) {
|
||||
var val = value[opt];
|
||||
if (val !== undefined && val !== null) {
|
||||
if (typeof val === 'string' || Buffer.isBuffer(val)) {
|
||||
formData.append(opt, val);
|
||||
@ -455,15 +458,15 @@ in your Node-RED user directory (${RED.settings.userDir}).
|
||||
delete opts.headers['content-type'];
|
||||
opts.body = formData;
|
||||
} else {
|
||||
if (typeof msg.payload === "string" || Buffer.isBuffer(msg.payload)) {
|
||||
payload = msg.payload;
|
||||
} else if (typeof msg.payload == "number") {
|
||||
payload = msg.payload+"";
|
||||
if (typeof value === "string" || Buffer.isBuffer(value)) {
|
||||
payload = value;
|
||||
} else if (typeof value == "number") {
|
||||
payload = value + "";
|
||||
} else {
|
||||
if (opts.headers['content-type'] == 'application/x-www-form-urlencoded') {
|
||||
payload = querystring.stringify(msg.payload);
|
||||
payload = querystring.stringify(value);
|
||||
} else {
|
||||
payload = JSON.stringify(msg.payload);
|
||||
payload = JSON.stringify(value);
|
||||
if (opts.headers['content-type'] == null) {
|
||||
opts.headers[ctSet] = "application/json";
|
||||
}
|
||||
@ -481,13 +484,13 @@ in your Node-RED user directory (${RED.settings.userDir}).
|
||||
}
|
||||
|
||||
|
||||
if (method == 'GET' && typeof msg.payload !== "undefined" && paytoqs) {
|
||||
if (typeof msg.payload === "object") {
|
||||
if (method == 'GET' && typeof value !== "undefined" && paytoqs) {
|
||||
if (typeof value === "object") {
|
||||
try {
|
||||
if (url.indexOf("?") !== -1) {
|
||||
url += (url.endsWith("?")?"":"&") + querystring.stringify(msg.payload);
|
||||
url += (url.endsWith("?")?"":"&") + querystring.stringify(value);
|
||||
} else {
|
||||
url += "?" + querystring.stringify(msg.payload);
|
||||
url += "?" + querystring.stringify(value);
|
||||
}
|
||||
} catch(err) {
|
||||
|
||||
@ -501,14 +504,14 @@ in your Node-RED user directory (${RED.settings.userDir}).
|
||||
nodeDone();
|
||||
return;
|
||||
}
|
||||
} else if ( method == "GET" && typeof msg.payload !== "undefined" && paytobody) {
|
||||
} else if ( method == "GET" && typeof value !== "undefined" && paytobody) {
|
||||
opts.allowGetBody = true;
|
||||
if (typeof msg.payload === "object") {
|
||||
opts.body = JSON.stringify(msg.payload);
|
||||
} else if (typeof msg.payload == "number") {
|
||||
opts.body = msg.payload+"";
|
||||
} else if (typeof msg.payload === "string" || Buffer.isBuffer(msg.payload)) {
|
||||
opts.body = msg.payload;
|
||||
if (typeof value === "object") {
|
||||
opts.body = JSON.stringify(value);
|
||||
} else if (typeof value == "number") {
|
||||
opts.body = value + "";
|
||||
} else if (typeof value === "string" || Buffer.isBuffer(value)) {
|
||||
opts.body = value;
|
||||
}
|
||||
}
|
||||
|
||||
@ -597,7 +600,7 @@ in your Node-RED user directory (${RED.settings.userDir}).
|
||||
msg.statusCode = res.statusCode;
|
||||
msg.headers = res.headers;
|
||||
msg.responseUrl = res.url;
|
||||
msg.payload = res.body;
|
||||
let result = res.body;
|
||||
msg.redirectList = redirectList;
|
||||
msg.retry = 0;
|
||||
|
||||
@ -622,14 +625,15 @@ in your Node-RED user directory (${RED.settings.userDir}).
|
||||
|
||||
// Convert the payload to the required return type
|
||||
if (node.ret !== "bin") {
|
||||
msg.payload = msg.payload.toString('utf8'); // txt
|
||||
result = result.toString('utf8'); // txt
|
||||
|
||||
if (node.ret === "obj") {
|
||||
if (msg.statusCode == 204){msg.payload= "{}"};
|
||||
try { msg.payload = JSON.parse(msg.payload); } // obj
|
||||
if (msg.statusCode == 204){result= "{}"};
|
||||
try { result = JSON.parse(result); } // obj
|
||||
catch(e) { node.warn(RED._("httpin.errors.json-error")); }
|
||||
}
|
||||
}
|
||||
RED.util.setMessageProperty(msg, node.propertyOut, result)
|
||||
node.status({});
|
||||
nodeSend(msg);
|
||||
nodeDone();
|
||||
@ -647,7 +651,8 @@ in your Node-RED user directory (${RED.settings.userDir}).
|
||||
node.error(err,msg);
|
||||
node.status({fill:"red", shape:"ring", text:err.code});
|
||||
}
|
||||
msg.payload = err.toString() + " : " + url;
|
||||
result = err.toString() + " : " + url;
|
||||
RED.util.setMessageProperty(msg, node.propertyOut, result)
|
||||
msg.statusCode = err.code || (err.response?err.response.statusCode:undefined);
|
||||
if (node.metric() && timingLog) {
|
||||
emitTimingMetricLog(err.timings, msg);
|
||||
|
Loading…
x
Reference in New Issue
Block a user