Workflow Trigger Code
ワークフロー起動サンプルコード / Workflow Trigger Code Example

“新しいプロセス” が自動生成されるワークフローは秀逸です。”自動開始” は改善モチベーションを維持するための最重要要素と言っても過言ではありません。Workflow アプリに[メッセージ開始イベント]を配置すれば、「Workflow 基盤の外からの HTTP リクエスト」によって新しいプロセス(案件)を自動開始させることが可能となります。たとえば「センサー検知で対応ワークフローを起動する」、「部外者からのリクエスト受信で回答ワークフローを起動する」、あるいは「リストファイルを用いて沢山の調査ワークフローを一括して起動する」といった実装が可能となります。この記事では、[メッセージ開始イベント(HTTP)]や[メッセージ開始イベント(Webhook)]をキックするHTML/JavaScriptコードを例示します。

Workflow Apps that automatically generate “new processes” are great. Automation of the starting point is the most important factor for maintaining improvement motivation. By placing a Message Start Event at the top of the Workflow, it can be triggered by HTTP request from outside the Workflow Platform. For example, it is possible to implement “Sensor detection triggers workflow”, “Incoming inquiry triggers workflow” or “Issue List triggers many investigative workflows”. This article provides examples of HTML/JavaScript code that kicks “Message Start Event (HTTP)” and “Message Start Event (Webhook)“.

クロスオリジン通信が多用されています。あらかじめワークフロー基盤側にて、「CORS 通信許可」(M419)を設定しておく必要があります。なお、当該 HTML/JavaScript コードを WordPress ブロックエディタ記事内に配置する場合は「Custom HTML ブロック」等を活用します。

Cross-origin communication is used. CORS permission setting (M419) is required in advance on the Workflow Platform. Use “Custom HTML” in a WordPress article.

HTML/JavaScript code examples for the public website, the intranets portals and so on. Keywords: Business Process, BPMN, No-Code Low-Code development, External trigger, Human Workflow, CORS, Email Verification, XHR, Fetch, FormData, JavaScript submit().


Send Process Title

Workflow Trigger Code Example: Send Process Title

Online DEMO

  • form#send_process_title_trigger
    • #qTitle: title
  • script
    • strKey key
HTML/JavaScript (click to open)
<form id="send_process_title_trigger">
  <input type="text" name="title" id="qTitle">
  <input type="submit" value="Send">
</form>
<div id="send_process_title_log"></div>
<script>
const strStartUrl = "https://example.questetra.net/System/Event/MessageStart/99/0/start";
const strKey      = "GdixCgUffsvDBqnsOPPQUVgWtmwEbsjC"; // 
const strIdForm   = "#send_process_title_trigger";
const strIdLog    = "#send_process_title_log";

const elTriggerForm = document.querySelector ( strIdForm );
elTriggerForm.addEventListener ( 'submit', function(ev) {
  ev.preventDefault();
  let elOutput = document.querySelector( strIdLog );
  let objFormData = new FormData( elTriggerForm );
    // https://developer.mozilla.org/docs/Web/API/FormData/Using_FormData_Objects
  objFormData.append ( 'key', strKey );
    // https://developer.mozilla.org/docs/Web/API/FormData/append
  let objXHR = new XMLHttpRequest();
    // https://developer.mozilla.org/docs/Web/API/XMLHttpRequest
  objXHR.open( "POST", strStartUrl, true ); // "true": async (default)
  objXHR.send( objFormData );
  elOutput.innerHTML = "... waiting 'load' event";
  objXHR.onload = function( oEvent ) {
    if ( objXHR.status == 200 ) {
      elOutput.innerHTML = "Sent!";
    } else {
      elOutput.innerHTML = "Error " + objXHR.status;
    }
  };
}, false);
</script>

Request with Registered Email

Online DEMO

  • form#email_verification_trigger
    • qRegisteredEmail: q_Email
    • : qProcedure: q_Procedure
  • script
    • strKey key
HTML/JavaScript (click to open)
<form id="email_verification_trigger">
  <label for="qEmail"><strong>Registered Email Address / ご登録メールアドレス</strong>:</label><br>
  <input  id="qEmail" type="email" name="q_Email"
    placeholder="you@example.com" required size="32" maxlength="64" autocomplete="on" autofocus><br>
  <label for="qProcedure"><strong>Procedures / お手続き</strong>:</label><br>
  <select id="qProcedure" name="q_Procedure">
    <option value="">--Please choose an option--</option>
    <option value="password">Reset Password (Forget Password)</option>
    <option value="magazine">Stop Mail Magazine</option>
    <option value="payment">Change Payment Method</option>
  </select>
  <input type="submit" value="Send">
</form>
<div id="email_verification_log"></div>

<script>
const strStartUrl = "https://example.questetra.net/System/Event/MessageStart/99/0/start"; // ★★
const strKey      = "ZaMvJs9YA27pybqKgvFmlczTDfEEoKVL"; // ★★See your workflow app★★
const strIdForm   = "#email_verification_trigger";      // ★must be same as Trigger form id★
const strIdLog    = "#email_verification_log";          // ★must be same as Log div id★

const elTriggerForm = document.querySelector ( strIdForm );
elTriggerForm.addEventListener ( 'submit', function(ev) {
  ev.preventDefault();
  let elOutput = document.querySelector( strIdLog );
  let objFormData = new FormData( elTriggerForm );
  objFormData.append ( 'key', strKey );

  fetch( strStartUrl, {	method: 'POST', mode: 'cors', body: objFormData } ).then( response => {
    console.log( 'response: ' + response.ok + " " + response.status + " " + response.statusText );
      // https://developer.mozilla.org/docs/Web/API/Response
    if ( !response.ok ) { throw new Error( "response was not ok" ); } // go "catch"
    return response.text(); // QBPMS responces the string PID.
  })
  .then( (text) => {
    elOutput.innerHTML = "Accepted (ID: " + text + "). A URL will be sent to you.";
    elTriggerForm.reset();
      // https://developer.mozilla.org/docs/Web/API/HTMLFormElement/reset
  })
  .catch( (error) => {
    elOutput.innerHTML = error;
  });
}, false);
</script>

Post Photo from Smartphone

Online DEMO

  • form#post_photo_trigger
    • qGeolocation q_Geolocation
    • qFile q_attachments
  • script
    • strKey key
HTML/JavaScript (click to open)
<form id="post_photo_trigger">
  <button type="button" onclick="setLatitudeLongitude('#qGeolocation')">
    <i class="fa-light fa-location-crosshairs"></i></button>
  <input type="text" name="q_Geolocation" id="qGeolocation"><br><br>
  <label for="qFile" style="
    color: #ffffff; border-radius: 10px; padding: 10px 40px; border-color: #1565c0; background-color: #1565c0;
  ">Outward Camera / 外向カメラ</label><br>
  <input style="display: none;" onchange="getFileName(this)"
     id="qFile" type="file" name="q_attachments" capture="environment" accept="image/*"><br>
  <label for="qFile2" style="
    color: #ffffff; border-radius: 10px; padding: 10px 40px; border-color: #1565c0; background-color: #1565c0;
  ">User-facing Camera / 内向カメラ</label><br>
  <input style="display: none;" onchange="getFileName(this)"
     id="qFile2" type="file" name="q_attachments" capture="user" accept="image/*"><br>
  <input id="qsubmit" type="submit" value="Post Image">
</form>
<div id="post_photo_log"></div>

<script>
const strStartUrl = "https://example.questetra.net/System/Event/MessageStart/99/0/start"; // ★★
const strKey      = "GdixCgUffsvDBqnsOPPQUVgWtmwEbsjC"; // ★★See your workflow app★★
const strIdForm   = "#post_photo_trigger";      // ★must be same as Trigger form id★
const strIdLog    = "#post_photo_log";          // ★must be same as Log div id★

const elTriggerForm = document.querySelector ( strIdForm );
const elOutput      = document.querySelector ( strIdLog );

function setLatitudeLongitude ( idSelector ) {
  // https://developer.mozilla.org/docs/Web/API/Geolocation_API/Using_the_Geolocation_API#examples
  if( !navigator.geolocation ) {
    elOutput.textContent = 'Geolocation is not supported by your browser';
  } else {
    elOutput.textContent = 'Locating ..';
    navigator.geolocation.getCurrentPosition( success, error );
  }
  function success ( position ) {
    document.querySelector ( idSelector ).value = position.coords.latitude + "," + position.coords.longitude;
    elOutput.textContent = "";
  }
  function error() {
    elOutput.textContent = 'Unable to retrieve your location';
  }
}
function getFileName ( el ) {
  let files = el.files;
  elOutput.textContent = files[0].name + ' ' + files[0].size + ' byte';
}
elTriggerForm.addEventListener ( 'submit', function(ev) {
  ev.preventDefault();
  let objFormData = new FormData( elTriggerForm );
  objFormData.append ( 'key', strKey );

  elOutput.innerHTML = "Uploading ...";
  fetch( strStartUrl, {	method: 'POST', mode: 'cors', body: objFormData } ).then( response => {
    console.log( 'response: ' + response.ok + " " + response.status + " " + response.statusText );
      // https://developer.mozilla.org/docs/Web/API/Response
    if ( !response.ok ) { throw new Error( "response was not ok" ); } // go "catch"
    return response.text(); // QBPMS responces the string PID.
  })
  .then( (text) => {
    elOutput.innerHTML = "Accepted (ID: " + text + ").";
    elTriggerForm.reset();
      // https://developer.mozilla.org/docs/Web/API/HTMLFormElement/reset
  })
  .catch( (error) => {
    elOutput.innerHTML = error;
  });
}, false);
</script>

Send Purchase Order TSV

Online DEMO

  • form#send_po_tsv_trigger
    • qEmail q_Email
    • qTSV q_line_items
  • script
    • strKey key
HTML/JavaScript (click to open)
<form id="send_po_tsv_trigger">
  <label for="qEmail"><strong>Email Address / メールアドレス</strong>:</label><br>
  <input  id="qEmail" type="email" name="q_Email"
    placeholder="you@example.com" required size="32" maxlength="64"><br><br>
  <label   for="qTsv"><strong>Purchase Orders TSV / 発注TSV</strong>:</label><br>
  q_product -  q_quantity - q_price - (q_amount:calced)<br>
  <textarea id="qTsv" name="q_line_items" rows="5" cols="33"></textarea>
  <input id="qsubmit" type="submit" value="Submit / 送信">
</form>
<div id="send_po_tsv_log">A few minutes after submitting, an order confirmation URL will be sent.</div>

<script>
const strStartUrl   = "https://example.questetra.net/System/Event/MessageStart/99/0/start"; // ★★
const strKey        = "GdixCgUffsvDBqnsOPPQUVgWtmwEbsjC"; // ★★See your workflow app★★
const strIdForm     = "#send_po_tsv_trigger";      // ★must be same as Trigger form id★
const strIdLog      = "#send_po_tsv_log";          // ★must be same as Log div id★
const strIdTextarea = "#qTsv";   // ★
const strIdEmail    = "#qEmail"; // ★

const elTriggerForm = document.querySelector ( strIdForm );
const elOutput      = document.querySelector ( strIdLog );
const elTextarea    = document.querySelector ( strIdTextarea );
const elEmail       = document.querySelector ( strIdEmail );

elTextarea.addEventListener ( 'change', function(ev) { // Preview TSV in elOutput
  //let elOutput    = document.querySelector ( strIdLog );
  let arr2dPo = parseAsRectangular( elTextarea.value );
  let strTmpHtml    = "";
  strTmpHtml       += "Entered TSV preview  (" + arr2dPo[0].length + " cols  " + arr2dPo.length + " rows)<br>";
  strTmpHtml       += "<table>";
  for( let i = 0; i < arr2dPo.length; i++ ){
    strTmpHtml     += "<tr>";
    for( let j = 0; j < arr2dPo[i].length; j++ ){
      strTmpHtml   += "<td style='padding:0px 2px'>" + encodeHTML( arr2dPo[i][j] ) + "</td>";
    }
    strTmpHtml     += "</tr>";
  }
  strTmpHtml       += "</table>";
  elOutput.innerHTML = strTmpHtml;
}, false);

elTriggerForm.addEventListener ( 'submit', function(ev) {
  ev.preventDefault();
  //let elOutput    = document.querySelector( strIdLog );
  let arr2dPo = parseAsRectangular( elTextarea.value );
  let strQtableXml  = "";
  strQtableXml     += "<list>";
  for( let i = 0; i < arr2dPo.length; i++ ){
    strQtableXml   += "<row>";
    for( let j = 0; j < arr2dPo[i].length; j++ ){
      strQtableXml += "<col>" + encodeHTML( arr2dPo[i][j] ) + "</col>";
    }
    strQtableXml   += "</row>";
  }
  strQtableXml     += "</list>";

  let objFormData   = new FormData();
  objFormData.append ( 'q_Email'     , elEmail.value ); // ★
  objFormData.append ( 'q_line_items', strQtableXml  ); // ★
  objFormData.append ( 'key', strKey );

  elOutput.innerHTML = "Uploading ...";
  fetch( strStartUrl, {	method: 'POST', mode: 'cors', body: objFormData } ).then( response => {
    console.log( 'response: ' + response.ok + " " + response.status + " " + response.statusText );
      // https://developer.mozilla.org/docs/Web/API/Response
    if ( !response.ok ) { throw new Error( "response was not ok" ); } // go "catch"
    return response.text(); // QBPMS responces the string PID.
  })
  .then( (text) => {
    elOutput.innerHTML = "Accepted (ID: " + text + ").";
  })
  .catch( (error) => {
    elOutput.innerHTML = error;
  });
}, false);


////// functions
//// Escape XML/HTML
function encodeHTML ( str ){
  return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')
            .replace(/"/g, '"').replace(/'/g, ''');
}

//// Parses TSV string as two-dimensional rectangular data matrix and creates a 2D array.
function parseAsRectangular( strTsv ){
  const arrTsv = strTsv.split("\n");
  /// Get numMinWidth and numMaxWidth (blank lines are excluded)
  let numMinWidth   = Infinity; // cf. String-Type Max: 1 million
  let numMaxWidth   = 0;
  let numBlanklines = 0;
  for( let i = 0; i < arrTsv.length; i++ ){
    if( arrTsv[i] === "" ){ // Skip blank lines
      numBlanklines += 1;
      continue;
    }
    let arrCells = arrTsv[i].split("\t");
    if( numMinWidth > arrCells.length ){ numMinWidth = arrCells.length; }
    if( numMaxWidth < arrCells.length ){ numMaxWidth = arrCells.length; }
  }
  console.log( " TsvDataCheck:" + " MinWidth:" + numMinWidth + " MaxWidth:" + numMaxWidth +
               " Lines:" + arrTsv.length + " (BlankLines:" + numBlanklines + ")" );
  /// Get numMinWidth and numMaxWidth (blank lines are excluded)
  let arr2dTsv      = [];
  for( let i = 0; i < arrTsv.length; i++ ){
    if( arrTsv[i] === "" ){ // Skip blank lines
      continue;
    }
    let arrTmp = [];
    let arrCells = arrTsv[i].split("\t");
    for( let j = 0; j < numMaxWidth; j++ ){
      if( j < arrCells.length ){
        arrTmp[j] = arrCells[j];
      }else{
        arrTmp[j] = "";
      }
    }
    arr2dTsv.push( arrTmp );
  }
  return arr2dTsv;
}
</script>

Send Inquiry with reCAPTCHA token

Online DEMO

  • form#recaptcha_token_trigger
    • qEmail q_Email
    • qInquiryText q_InquiryText
  • script
    • strKey key
    • strToken q_Token
HTML/JavaScript (click to open)
<form id="recaptcha_token_trigger" style="background:#f4f5f7;border-radius:10px;padding:10px 40px;margin:0px 10px 20px;">
  <label for="qEmail"><strong>Email Address / メールアドレス</strong>:</label><br>
  <input  id="qEmail" type="email" name="q_Email"
    placeholder="you@example.com" required size="32" maxlength="64"><br>
  <br>
  <label   for="qInquiryText"><strong>Inquiry / 問合</strong>:</label><br>
  <textarea id="qInquiryText" name="q_InquiryText" rows="5" cols="33"></textarea><br>
  <br>
  <input type="checkbox" class="qPolicyCheck">
  I Agree to <a href="https://questetra.com/privacy/" target="_blank">Privacy Policy</a> /
  <a href="https://questetra.com/ja/privacy/" target="_blank">プライバシーポリシー</a>に同意<br><!-- ★★ -->
  <button type="button" id="qSubmit" class="qCorsSubmit">Submit / 送信</button><br>
  <span id="recaptcha_token_log"></span><br>
  <span style="color:#8899cc;margin:10px;font-size:80%;">This site is protected by <strong>reCAPTCHA</strong>
  and the Google <a href="https://policies.google.com/privacy" target="_blank">Privacy Policy</a>
  and <a href="https://policies.google.com/terms" target="_blank">Terms of Service</a> apply.</span><br>
</form>
<script src="https://www.google.com/recaptcha/api.js?render=6LfUw-oiAAAAAKCeFNc4OeABMQnOY_6N1mTf0ot5"></script>
<style>
  .grecaptcha-badge { visibility: hidden; }
  .qCorsSubmit { pointer-events:none; background:#888888;} /* imperfect control */
  .qPolicyCheck:checked ~ .qCorsSubmit { pointer-events:auto; background:#1565c0;}
</style>
<script>
const strRecSitekey = "6LfUw-oiAAAAAKCeFNc4OeABMQnOY_6N1mTf0ot5"; // ★★★ See recaptcha/admin ★★★
  // https://www.google.com/recaptcha/admin/
const strStartUrl   = "https://example.questetra.net/System/Event/MessageStart/99/0/start"; // ★★
const strKey        = "vJbtcnFVF5TY72WIHOMddZLcIUkuFxEj"; // ★★ See your workflow app ★★
const strIdLog      = "#recaptcha_token_log";       // ★must be same as Log dom id★
const strIdTrigForm = "#recaptcha_token_trigger";   // ★
const strIdEmail    = "#qEmail";                    // ★
const strIdInquiry  = "#qInquiryText";              // ★
const strIdSubmit   = "#qSubmit";                   // ★

const elTriggerForm = document.querySelector ( strIdTrigForm );
const elOutput      = document.querySelector ( strIdLog );
const elEmail       = document.querySelector ( strIdEmail );
const elInquiry     = document.querySelector ( strIdInquiry );

document.querySelector ( strIdSubmit ).addEventListener( 'click', ()=>{
  grecaptcha.ready( ()=>{   // https://developers.google.com/recaptcha/docs/v3
    grecaptcha.execute( strRecSitekey, { action: 'DemoInquiry' } ).then( async ( strToken )=>{
      // For your top ten actions in the admin console ,..
      // https://developers.google.com/recaptcha/docs/v3#actions

      let objFormData   = new FormData();
      objFormData.append ( 'key', strKey );
      objFormData.append ( 'q_RecToken', strToken );
      objFormData.append ( 'q_Email'   , elEmail.value   ); // ★
      objFormData.append ( 'q_Inquiry' , elInquiry.value ); // ★
      elOutput.innerHTML = "Uploading ...";
      fetch( strStartUrl, { method: 'POST', mode: 'cors', body: objFormData } ).then( response => {
        console.log( 'response: ' + response.ok + " " + response.status + " " + response.statusText );
          // https://developer.mozilla.org/docs/Web/API/Response
        if ( !response.ok ) { throw new Error( "response was not ok" ); } // goto "catch"
        return response.text(); // QBPMS responces the string PID.
      })
      .then( (text) => {
        elOutput.innerHTML = "Accepted (ID: " + text + ").";
        elTriggerForm.reset();
          // https://developer.mozilla.org/docs/Web/API/HTMLFormElement/reset
      })
      .catch( (error) => {
        elOutput.innerHTML = error;
      });

    });
  });
});

//// The gReCaptcha badge is hidden.
//// 右下表示される reCAPTCHA v3 のバッジは非表示に。
  // https://developers.google.com/recaptcha/docs/faq#id-like-to-hide-the-recaptcha-badge.-what-is-allowed
  // CAPTCHA: "Completely Automated Public Turing test to tell Computers and Humans Apart"
</script>

Send Inquiry and GA4 Event

Online DEMO

  • form#ga4_event_trigger
    • qEmail q_Email
    • qInquiryText q_Inquiry
  • script
    • strKey key
    • {event} → GA4 event
HTML/JavaScript (click to open)
<script async src="https://www.googletagmanager.com/gtag/js?id=G-YourMesuID"></script> 
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'G-YourMesuID');
</script>

<form id="ga4_event_trigger" style="background:#f4f5f7;border-radius:10px;padding:10px 40px;margin:0px 10px 20px;">
  <br>
  <label for="qEmail"><strong>Email Address / メールアドレス</strong>:</label><br>
  <input  id="qEmail" type="email" name="q_Email"
    placeholder="you@example.com" required size="32" maxlength="64"><br>
  <br>
  <label   for="qInquiryText"><strong>Inquiry / 問合</strong>:</label><br>
  <textarea id="qInquiryText" name="q_InquiryText" rows="5" cols="33"></textarea><br>
  <br>
  <button type="button" id="qSubmit" class="qCorsSubmit">Submit / 送信</button><br>
  <span id="ga4_event_log"></span><br>
</form>

<script>
const strGa4Id            = "G-YourMesuID";               // ★★ See GA4 Admin DataStreams ★★
const strGa4EventName     = "sign_up";                    // ★★ Event Name Count As ★★
const numGa4EventValue    = 5000;                         // ★★ Event Value for Conversion ★★
const strGa4EventCurrency = "JPY";                        // ★★ USD, JPY, EUR... ★★
const strGa4EventMethod   = "Camp202212";                 // ★★ form parameter "method" ★★

const strStartUrl   = "https://example.questetra.net/System/Event/MessageStart/99/0/start"; // ★★
const strKey        = "sYJDWsP09zFT2rkoVLmFnUgvmphfrgzq";       // ★★ See your workflow app ★★
const strIdLog      = "#ga4_event_log";                         // ★must be same as Log dom id★
const strIdTrigForm = "#ga4_event_trigger";                     // ★
const strIdEmail    = "#qEmail";                                // ★
const strIdInquiry  = "#qInquiryText";                          // ★
const strIdSubmit   = "#qSubmit";                               // ★

const elTriggerForm = document.querySelector ( strIdTrigForm );
const elOutput      = document.querySelector ( strIdLog );
const elEmail       = document.querySelector ( strIdEmail );
const elInquiry     = document.querySelector ( strIdInquiry );

document.querySelector ( strIdSubmit ).addEventListener( 'click', ()=>{
  gtag( 'event', strGa4EventName, {
    'value':    numGa4EventValue,
    'currency': strGa4EventCurrency,
    'mothod':   strGa4EventMethod,
    'send_to':  strGa4Id
  });
  // https://developers.google.com/tag-platform/gtagjs/reference?#event

  let objFormData   = new FormData();
  objFormData.append ( 'key', strKey );
  objFormData.append ( 'q_Email'   , elEmail.value   ); // ★
  objFormData.append ( 'q_Inquiry' , elInquiry.value ); // ★
  elOutput.innerHTML = "Uploading ...";
  fetch( strStartUrl, { method: 'POST', mode: 'cors', body: objFormData } ).then( response => {
    console.log( 'response: ' + response.ok + " " + response.status + " " + response.statusText );
      // https://developer.mozilla.org/docs/Web/API/Response
    if ( !response.ok ) { throw new Error( "response was not ok" ); } // goto "catch"
    return response.text(); // QBPMS responces the string PID.
  })
  .then( (text) => {
    elOutput.innerHTML = "Accepted (ID: " + text + ").";
    elTriggerForm.reset();
      // https://developer.mozilla.org/docs/Web/API/HTMLFormElement/reset
  })
  .catch( (error) => {
    elOutput.innerHTML = error;
  });

});
</script>


– appendix (ja) –

  • ワークフロー基盤(データ受信側)にて[CORS]が正しく設定されていない場合、
    • [CORS]: Cross-Origin Resource Sharing
    • ブラウザ DevTool “Console” にエラーが出力されます。
      • Access to XMLHttpRequest at ‘http s://example.questetra.net/System/Event/MessageStart/999/0/start’
      • from origin ‘http s://corp.example.com’ has been blocked by CORS policy:
      • No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
      • POST http s://example.questetra.net/System/Event/MessageStart/999/0/start net::ERR_FAILED 403
    • ブラウザ DevTool “Network” にエラーが出力されます。
      • Request URL: http s://example.questetra.net/System/Event/MessageStart/999/0/start
      • Request Method: POST
      • Status Code: 403
      • Referrer Policy: strict-origin-when-cross-origin
  • Questetra Manual (ja)

– appendix (en) –

  • If CORS is not configured correctly on the workflow platform (data receiving side)
    • CORS: Cross-Origin Resource Sharing
    • Errors are logged in the Browser DevTool “Console”.
      • Access to XMLHttpRequest at ‘http s://example.questetra.net/System/Event/MessageStart/999/0/start’
      • from origin ‘http s://corp.example.com’ has been blocked by CORS policy:
      • No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
      • POST http s://example.questetra.net/System/Event/MessageStart/999/0/start net::ERR_FAILED 403
    • Errors are logged in the Browser DevTool “”Network”.
      • Request URL: http s://example.questetra.net/System/Event/MessageStart/999/0/start
      • Request Method: POST
      • Status Code: 403
      • Referrer Policy: strict-origin-when-cross-origin
  • Questetra Manual (en)

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: