[BPMN] Service Task with REST-API (Get) Example

หลังจากงมๆมานานพอสมควรแล้วกับการใช้งาน Service Task กับ Web Service กับ Camunda BPMN Engine ครับ โดยสิ่งที่ผมใช้ คือ ตัว Camunda Connector ที่ช่วยให้เราสามารถ Config Web Service ได้ง่าย ไม่ต้องส่งงานให้ Delegate Code อย่าง BPMN Engine ของค่ายอื่นๆครับ สำหรับ

NOTE: สำหรับเรื่อง Service Task ตัว Spec ของ BPMN ไม่ได้ระบุใน Spec ชัดเจน ว่าต้องมีขั้นตอนการทำงานอย่างไร จึงเปิดให้ BPMN Engine แต่ละเจ้าสามารถเสริมเติมแต่ง Feature ได้เต็มที่ครับ

Camunda Connector

มี 3 รูปแบบ อ้างอิงจากเวอร์ชันที่ 7.9.0 ได้แก่

  • HTTP Connector - พวก REST API  ทั้งหลาย ใช้วิธี GET / POST และอื่นๆ แล้วเอา XML หรือ JSON มาใช้งานต่อ
  • SOAP Connector - พวก WSDL หรือ SOAP แบบเดิม
  • Custom - เขียน Code แล้วจัดการเองเลย

หลังจากเกริ่นนำได้ทดสอบ ตัว Connector แต่ละตัวกันแล้ว ตอนนี้มาดูตัวอย่างดีกว่าครับ โดยตัวอย่างที่ผมเขียนเป็นการใช้งาน HTTP Connector โดยใช้วิธี GET และผลลัพธ์ที่ได้ออกมาเป็นไฟล์ JSON ครับ เอาหละมาดูกันเลย ว่าเรา HTTP Connector แบบต้องใส่อะไรไปบ้าง

  • url => บอกว่าให้ไปเอาข้อมูลมาจาก Domain ไหน อะไร ถ้าเป็นแบบ GET ต้องยัด Parameter ลงไปในนี้ด้วยครับ
  • method => อันนี้กำหนดเป็น GET
  • header => บอกว่า Request ของเรามีอะไรบ้าง โดยกำหนดเป็น Key
    - key => Accept
    - value => application/json
  • payload => ไม่จำเป็นสำหรับ Method GET นะครับ ใส่เข้าไป จากการที่ลองไล่ Code ดูมันไม่ได้สนใจนะครับ

ตัวอย่าง Process ของการดึงข้อมูลของกระทู้

มาดูตัวอย่างกันบ้างดีกว่าครับ โดยผมทำเป็น Process ของการดึงข้อมูลของกระทู้ครับ

[
  {
    "userId": 1,
    "id": 1,
    "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
  },
  {
    "userId": 1,
    "id": 2,
    "title": "qui est esse",
    "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
  },
  {
    "userId": 1,
    "id": 3,
    "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut",
    "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"
  },
  {
    "userId": 1,
    "id": 4,
    "title": "eum et est occaecati",
    "body": "ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit"
  },
  {
    "userId": 1,
    "id": 5,
    "title": "nesciunt quas odio",
    "body": "repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque"
  },
....
  • Note: แต่เราสนใจเฉพาะ Id นะครับ ไม่ได้ ดึงมาหมด ดังนี้ URL อยู่ในรูป  https://jsonplaceholder.typicode.com/posts/<POST-ID>
{
  "userId": 1,
  "id": 2,
  "title": "qui est esse",
  "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}
  • ตัว BPMN Process - เดี๋ยวจะกล่าวในช่วงถัดไปครับ

มาเจาะลึกที่ BPMN Process ครับ

ในตัว BPMN ของเราประกอบด้วย Task ย่อย 3 Task ครับ

- Task "Enter Post Id"

เป็น User Task ให้ User กรอก Id ของ Post ที่ต้องการเรียกดูครับ

- Task "Test REST-API (GET)"

สำหรับ Task นี้ เป็น Service Task ครับ โดย Task นี้เป็นพระเอกเลยครับ เพราะใช้เชื่อมกับ Web Service ครับ โดยมีกำหนด Config เป็น Connector

Config เป็น Connector
  • ภาพรวมของข้างในของ Connector
ถ้าเข้าที่ใน Tab Connector เห็นการ Config ประมาณนี้

มาดูที่ส่วน Input ของตัว Connector ครับ มีจุดย่อยๆที่เราต้องมาทำความเข้า ดังนี้ครับ

  • Connector-Id : ต้องเป็น http-connector เท่านั้น ห้ามตั้งชื่อเองนะครับ Engine ไม่รู้จัก
  • URL - สังเกตุว่า ผมไม่ได้ Map เป็น Text ครับ ผมใช้เป็น Script แทน เพราะต้องการเอา Post Id เช่น 1  จากตัวแปรของ Process ${PostId} มาใส่ต่อท้าย URL ตามคำสั่ง ดังนี้ "https://jsonplaceholder.typicode.com/posts/${PostId}".toString()
    ภาพรวมของ URL
  • ส่วน Method
  • ส่วน Header
  • การจัดการ Output ครับ - ผลลัพธ์ของ Web Service อยู่ในรูปของ JSON ซึ่งผมจะเก็บไว้ใน postResult ครับ

เนื่องจาก ผมต้องการเอาผลลัพธ์ที่เป็น JSON มายังลงใน Variable ของ Process ครับ เพื่อเอาไปแสดงผลใน Task ถัดไปครับ เลยต้องทำเป็น Script เพื่อกำหนดค่าครับ

import groovy.json.JsonSlurper;

jsonResponse= connector.getVariable("response");
out:println "jsonResponse :" + jsonResponse.getClass();

JsonSlurper jsonSlurper = new JsonSlurper();
Object result = jsonSlurper.parseText(jsonResponse);
//Convert to MAP
Map jsonResponseMap  = (Map)result ;

//Step Value to Process Engine
connector.setVariable('userId', jsonResponseMap.get("userId"));
connector.setVariable('id', jsonResponseMap.get("id"));
connector.setVariable('title', jsonResponseMap.get("title"));
connector.setVariable('body', jsonResponseMap.get("body"));

//Return JSON to outpur variable
postResult = result;
- Task "View Result"

เอาผลลัพธ์ที่ได้มาแสดงผลครับ โดยมีการ Config ดังนี้

  • BPMN Model สามารถดูได้จาก GitHub เลยครับ

ทดสอบครับ

  • Task "Enter Post Id" : ดึงข้อมูลของ Post Id 2
  • Task "Test REST-API (GET)" : หน้าที่ของ Engine ทำครับ เราต้องจัดการอะไร
  • Task "View Result" : ข้อมูลขึ้นเรียบร้อยครับ

จบไปแล้วกับการงมๆ Web Service กับ BPMN ครับ โดยผมคิดว่าคงใช้ json-server ซึ่งเป็น Standalone JSON Mock REST-API มาใช้ทำ Thesis ครับ


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.