You can invoke the custom action using pure XMLHttpRequest
:
function executeRequest(
httpAction: HttpAction,
uri: string,
data?: any): Promise<XMLHttpRequest> {
// Construct a fully qualified URI if a relative URI is passed in.
if (uri.startsWith("/")) {
uri = `${getWebApiUrl()}${uri}`;
}
const preferHeaders = [
"OData.Community.Display.V1.FormattedValue",
"Microsoft.Dynamics.CRM.associatednavigationproperty",
"Microsoft.Dynamics.CRM.lookuplogicalname",
].join(",");
return new Promise(function (resolve, reject) {
const request = new XMLHttpRequest();
request.open(httpAction, encodeURI(uri), true);
request.setRequestHeader("OData-MaxVersion", "4.0");
request.setRequestHeader("OData-Version", "4.0");
request.setRequestHeader("Accept", "application/json");
request.setRequestHeader("Content-Type", "application/json; charset=utf-8");
request.setRequestHeader("Prefer", `odata.include-annotations='${preferHeaders}'`);
request.onreadystatechange = function () {
if (this.readyState === 4) {
request.onreadystatechange = null;
let error: any;
switch (this.status) {
case 200: // Success with content returned in response body.
case 204: // Success with no content returned in response body.
resolve(this);
break;
default: // All other statuses are unexpected so are treated like errors.
try {
const resp = JSON.parse(request.response as string) as { error: any };
error = resp.error;
} catch (e) {
error = new Error("Unexpected Error");
}
reject(error);
break;
}
}
};
if (data) {
request.send(JSON.stringify(data));
} else {
request.send();
}
});
}
Usage:
const actionName = "/new_MyActionName";
const data = {}; // Your action input parameter data
// If you have 2 input params: Name (string), Age (number);
// You will define the data as following:
// const data = { Name: "John", Age: 18 };
executeRequest("POST", actionName, data).then((resp) => {
const respObj = resp.responseText
? (JSON.parse(resp.responseText))
: ({});
console.log(respObj);
}).catch(e => console.error(e));