Node-RED - ตอนที่ 2 - สร้าง Response ตามเงื่อนไขที่ต้องการและสร้าง webhook เพื่อใช้ในการ Test

Node-RED - ตอนที่ 2 - สร้าง Response ตามเงื่อนไขที่ต้องการและสร้าง webhook เพื่อใช้ในการ Test

ในตอนที่แล้วเราทำการสร้าง Mock server ด้วย Node-RED โดยตัวอย่างที่แล้วจะเป็นการสร้าง Transaction Reference และ Response กลับไปให้เพื่อใช้ในการ Test แต่ในการ Test นั้นมีหลายกรณี เช่น กรณีที่ถูกต้อง กรณีที่เกิดปัญหา หรือกรณีต่างๆตามเงื่อนไขที่ Application ต้องการ อีกทั้งใน Appllication บางประเภทนั้นไม่ได้มีแค่การ Response ข้อมูล แต่จะมีการยิง Http request ไปหา URL ที่ตกลงกันไว้หรือที่เรียกกันว่า Webhook ดังนั้นตอนนี้เราจะมาทำสิ่งที่ว่ามาด้วย Node-RED กัน

สิ่งที่เราจะทำกัน

สมมติว่าเราจะเขียน Application ขายของที่เมื่อลูกค้าเลือกของเรียบร้อยแล้วจะส่งไปให้ Payment application (ซึ่งก็คือ Mock server ที่จะใช้ Node-RED สร้าง) ที่ทำหน้าหักเงินจากบัญชีลูกค้าแล้วจากนั้นตัว Payment application จะยิง Request กลับไปหา Server ของเราโดยมี Flow ตามนี้

โดย Request ที่ต้องการหักเงินลูกค้า (1) ของเราจะมีหน้าตาแบบนี้

1
2
3
4
5
6
{
"transactionId" : "4d74cb8f-b3a6-42ba-8383-4f60339fd84b",
"accountNo" : "10110",
"ref" : "ABCDEFG",
"amount" : 300
}

ส่วน Response ที่กลับมาจาก Payment Application (2) จะมีหน้าตาแบบนี้

1
2
3
4
{
"transactionId" : "4d74cb8f-b3a6-42ba-8383-4f60339fd84b",
"status" : "PROCESSING"
}

ส่วน Request ที่ยิงกลับไปที่ Webhook (3) จะมีหน้าตาแบบนี้

1
2
3
4
5
6
{
"transactionId" : "4d74cb8f-b3a6-42ba-8383-4f60339fd84b",
"status" : "SUCCESS",
"amount" : 300,
"errorMessage" : null
}

สร้างกรณีสำเร็จและหาบัญชีไม่เจอ

ในการทำงานของ Application นั้นไม่ได้เขียนรองรับกรณีที่สำเร็จอย่างเดียว เราจะต้องเขียนกรณีที่เกิดปัญหาด้วยซึ่งเมื่อต้องการ Test ว่าเมื่อเกิดกรณีที่เกิดปัญหาแล้ว Application ของเราจะทำงานได้อย่างที่คิดไหม ดังนั้นเราจึงต้อง Mock ตัว Payment Application ส่ง Response ที่มีปัญหากลับมาคือหาบัญชีไม่เจอ โดยจะให้กรณีนี้เกิดขึ้นเมื่อส่งค่า accountNo เป็น UNKNOWN โดยตัว Payment application จะตอบ Http response status เป็น 404 กลับมา ดังนั้นเมื่อจะทำการ Test กรณีนี้ก็แค่ตอนส่งค่าไปก็ set ค่า accountNo เป็น UNKNOWN

ตัวอย่าง Http request ที่ยิงไปแล้วจะเกิดปัญหา

1
2
3
4
5
6
{
"transactionId" : "4d74cb8f-b3a6-42ba-8383-4f60339fd84b",
"accountNo" : "UNKNOWN",
"ref" : "ABCDEFG",
"amount" : 300
}

สร้าง Flow Node-Red สำหรับกรณีทั่วไป

  • ในขั้นนี้ไม่ทำอะไรมากครับเราจะสร้าง component http in เข้าไปโดยกำหนด path เป็น /payment

  • ในส่วนถัดไปเราจะทำการกำหนด Response เพื่อตอบกลับโดยในตอนที่แล้วเราใช้ component : function สร้าง แต่ตอนนี้เราจะลองใช้ Component : change ในการกำหนดค่า Response โดยมีขั้นตอนดังต่อไปนี้

    1. ทำการลาก Component : change ลงไปใน Flow

    2. ทำการเชื่อม Http in กับ Change เข้าด้วยกัน

    3. ทำการคลิกที่ Component : change จากนั้นดูที่ด้านขวาในส่วนนี้จะเป็นการบอกว่าเราจะทำการเปลี่ยนค่า msg อะไรบ้าง โดยเราจะแก้ไขข้อมูล msg.payload.status เป็น PROCESSING เพื่อให้ตรงกับ Response ที่เราต้องการ เราจึงเลือก type ของการเปลี่ยนเป็น set จากนั้นเลือกค่าเป็น PROCESSING

    4. ทำการกด Add เพื่อเพิ่มการแก้ไขข้อมูลของ msg

    5. ทำการเลือก type เป็น Delete เพื่อลบ accountNo, ref, amount

    6. กด done

  • ในส่วนถัดไปการลาก Component : http response จากนั้นลากเชื่อมระหว่าง change เข้ากับ http response

  • เปิด Postman เพื่อทดลอง

    เลือก set endpoint ให้ยิงไปที่ http://your-nodered-endpoint/payment ( Node-RED ของผมคือ http://192.168.56.101:1880) และ payload เป็น

    1
    2
    3
    4
    5
    6
    {
    "transactionId" : "4d74cb8f-b3a6-42ba-8383-4f60339fd84b",
    "accountNo" : "10110",
    "ref" : "ABCDEFG",
    "amount" : 300
    }

    จากนั้นลองยิงซึ่งจะได้ผลลัพธ์ดังภาพ

จากการ setting ทั้งหมดเราจะได้ mcok server ที่ตอบกลับในกรณีที่สำเร็จแล้ว

สร้าง Flow Node-RED ในกรณีไม่สำเร็จ

ในขั้นตอนที่แล้วเราได้กรณีที่สำเร็จแล้ว ในตอนนี้เราจะสร้างกรณีที่ไม่สำเร็จโดยมีขั้นตอนดังต่อไปนี้

  • ทำการสร้างเงื่อนไขให้ Flow ด้วย Component : change

    1. ทำการดึง Component : change เข้ามาใน Flow

    2. ดูตรงส่วน Property ตรงส่วนนี้จะเป็นการบอกว่าให้ทำการตรวจสอบ property ไหนโดยจากที่เราจะทำกันคือเราจะตรวจสอย property : accountNo ที่อยู่ใน request ดังนั้นค่าจึงเป็น msg.payload.request (payload คือ request ที่ยิงเข้ามา)

    3. ส่วนนี้เป็นเงื่อนไขที่เราจะตรวจสอบโดยที่เราจะทำกันจะเช็คว่าหากค่า accountNo จะเข้าเงื่อนไข error

    4. ส่วนอันนี้เป็นเงื่อนไขกรณีที่ไม่ตรงกับเงื่อนไขอื่นๆเราจะให้ทำอะไร

  • ทำการสร้าง component : Http respones และกำหนดให้ return http status เป็น 404 เพื่อใช้เป็นการตอบกลับกรณีไม่สำเร็จ

  • ทำการแก้ไขการเชื่อมต่อ

    1. ทำการลากเส้นจาก switch ที่เป็นเงื่อนไขแรกไปที่ component : http response ตัวใหม่ เพื่อให้เวลาเจอกรณีไม่สำเร็จให้ไปออก response 404

    2. ทำการลากเส้นจาก switch ที่เป็นเงื่อนไขที่ 2 ไปที่ component เดิม เพื่อให้กรณีสำเร็จไปส่งไปที่เงื่อนไขเดิม

  • ทดสอบยิงด้วย Postman

    จากภาพจะเห็นว่าถ้า accountNo เป็น UNKNOWN http status ที่กลับมาจะเป็น 404

    แต่กรณีที่ accountNo ไม่ใช่ UNKNOWN ข้อมูลจะตอบกลับมาปกติ

สร้างกรณียิง Http request ไปที่ webhook

ในส่วนนี้เราจะทำการจำลองให้ตัว payment application ยิง Request กลับไปที่ webhook ที่เรากำหนด โดยการยิงเนี่ยเราจะทำการหน่วงเวลาเพื่อให้สมจริงคือจะหน่วงเวลาทิ้งไว้สัก 5 วินาทีจากนั้นค่อยยิงไป โดยเรามีขั้นตอนการทำดังต่อไปนี้

  • ทำการสร้างตัวหน่วงเวลาโดยการดึง component : delay

  • ทำการสร้าง Component : change และกำหนดค่าเพื่อให้ได้ response ตามที่เราต้องการคือให้ status เป็น success เพื่อ field errorMessage และลบ field อื่นที่ไม่ต้องการออก

  • ทำการส่ง Http request ไปที่ url ที่กำหนด

    1. เนื่องจากเราไม่ได้เขียน My application จึงไม่มีที่ให้ตัว Node-RED ยิงไปหาดังนั้นเราจะใช้ตัว web hook online แทน โดยเราจะทำการเข้า web https://webhook.site/ ซึ่งเมื่อเข้าแล้วให้เรา copy ตรงส่วน url ไว้ และเปิดหน้านี้ทิ้งไว้

    2. ทำการสร้าง Component : http reqeust จากนั้น set ค่า Method เป็น POST และ set ค่า URL เป็น URL ที่เราทำการ Copy จากส่วนขั้นตอนที่แล้ว

  • ทำการเชื่อม flow ดังภาพ

    1. เชื่อมให้ข้อมูลที่มาจากกรณีสำเร็จไหลไปเข้า component : delay เพื่อทำการหน่วงเวลา

    2. เชื่อมข้อมูลจาก component : delay ไปหา component : change เพื่อทำการแก้ไขค่าให้เป็นไปตาม Response ที่เราต้องการ

    3. เชื่อมข้อมูลจาก component : change ไปที่ http request เพื่อยิง http request ไปที่ url ที่ต้องการ

  • ทำการทดลองส่งข้อมูลด้วย Postman เพื่อทดสอบว่าใช้งานได้จริงหรือไม่

  1. เลือก set endpoint ให้ยิงไปที่ http://your-nodered-endpoint/payment ( Node-RED ของผมคือ http://192.168.56.101:1880) และ payload เป็น

    1
    2
    3
    4
    5
    6
    {
    "transactionId" : "4d74cb8f-b3a6-42ba-8383-4f60339fd84b",
    "accountNo" : "THANAPORN",
    "ref" : "ABCDEFG",
    "amount" : 300
    }

  1. จากนั้นเข้าไปดูที่ webhook.site ที่เปิดไว้ในขั้นตอนก่อนหน้านี้จะเห็นว่ามี Request เข้ามาแล้วซึ่งนั่นหมายความว่าตัว Node-RED ของเรายิง http request ออกมาแล้ว

สรุป

สำหรับตอนนี้เราได้ทำการสร้าง Flow ของ Node-RED ให้สามารถ Response ได้ตามเงื่อนไขที่เราต้องการและทำตัวยิง Http request ไปยัง endpoint ที่เราต้องการได้ ซึ่งทั้งสองเป็นสิ่งที่เป็นเรื่องพื้นฐานที่เราจะเจอเวลาที่ต้องทำการ Test ให้ครบ Loop