[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-what-is-webhook-vs-api-all--*":3,"academy-blog-faqs-jidu7qjvaeric9p-th":89,"academy-blog-translations-jidu7qjvaeric9p":114},{"data":4,"page":88,"perPage":88,"totalItems":88,"totalPages":88},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_l_url":11,"cover_image_m_url":12,"cover_image_path":13,"cover_image_s_url":14,"created":15,"created_by":16,"expand":17,"id":81,"keywords":82,"locale":51,"published_at":83,"scheduled_at":68,"school_blog":77,"short_description":84,"status":75,"title":85,"updated":86,"updated_by":87,"slug":78,"views":80},"ตู้จดหมายริมถนนยกธงขึ้นในเช้าที่เงียบสงบ พร้อมการ์ดเปรียบเทียบ Polling: คุณถามซ้ำๆ กับ Webhook: ยิงมาที่ URL ของคุณ","sclblg987654321","school_blog_translations","\u003Cp>ลองนึกภาพว่าคุณสั่งของออนไลน์แล้วรอพัสดุอยู่ที่บ้าน วิธีแรกคือเดินออกไปเปิดตู้จดหมายหน้าบ้านทุกๆ 10 นาที เกือบทุกรอบเจอตู้ว่าง แต่ก็ต้องเดินไปอยู่ดี วิธีที่สองคือนั่งทำงานของคุณไปตามปกติ แล้วรอให้บุรุษไปรษณีย์มากดกริ่งตอนที่ของมาถึงจริงๆ\u003C\u002Fp>\u003Cp>โปรแกรมคอมพิวเตอร์ก็เจอเรื่องเดียวกันทุกวัน วิธีแรกเรียกว่า Polling ส่วนวิธีที่สองคือสิ่งที่คุณเห็นในคำค้นอย่าง \"webhook discord คือ\" หรือ \"webhook url คือ\" วันนี้ Superdev Academy จะพาไปดูว่า Webhook คืออะไร ต่างจากการเรียก API ตรงไหน ลองส่งข้อความเข้า Discord ด้วยคำสั่งเดียว แล้วปิดท้ายด้วยสามเรื่องที่มือใหม่มักพลาดเมื่อต้องรับ Webhook เอง\u003C\u002Fp>\u003Ch2>Polling กับ Webhook ถามซ้ำๆ หรือรอให้อีกฝั่งบอก\u003C\u002Fh2>\u003Cp>Polling (การถามซ้ำเป็นรอบ) คือการให้โปรแกรมของคุณเรียก API ของอีกระบบซ้ำๆ ตามเวลาที่ตั้งไว้ เช่น ทุก 1 นาที ถามว่ามีออเดอร์ใหม่ไหม มีคนเปิด Issue ใหม่ไหม คำตอบส่วนใหญ่คือ \"ยังไม่มี\" แต่ทุกคำถามก็กินแรงทั้งสองฝั่ง และถ้าเหตุการณ์เกิดขึ้นหลังรอบที่แล้วแค่ไม่กี่วินาที คุณก็ต้องรออีกเกือบเต็มรอบกว่าจะรู้\u003C\u002Fp>\u003Cp>Webhook กลับทิศกัน คุณเอา URL ของคุณไปลงทะเบียนไว้กับอีกระบบหนึ่งครั้ง จากนั้นเมื่อเกิดเหตุการณ์ที่คุณสนใจ ระบบนั้นจะส่ง HTTP Request มาที่ URL ของคุณเอง พร้อมข้อมูลของเหตุการณ์นั้น คุณไม่ต้องถามอะไรเลย\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Polling:\u003C\u002Fstrong> คุณถามซ้ำๆ ว่ามีอะไรใหม่ไหม\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Webhook:\u003C\u002Fstrong> อีกระบบยิงมาที่ URL ของคุณเมื่อมีเหตุการณ์\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>GitHub เขียนไว้ในเอกสารของตัวเองว่า Webhook ใช้แรงและทรัพยากรน้อยกว่าการ Poll API และได้ข้อมูลเกือบเรียลไทม์ เพราะมันถูกส่งออกมาตอนที่เหตุการณ์เกิดขึ้นพอดี\u003C\u002Fp>\u003Ch2>Webhook ต่างจาก API ยังไง\u003C\u002Fh2>\u003Cp>คำถามนี้ขึ้นมาในช่องค้นหาบ่อยมาก และคำตอบที่ตรงที่สุดคือ Webhook ไม่ได้เป็นคู่แข่งของ API แต่เป็นการสื่อสารแบบเดียวกันที่หันกลับด้าน\u003C\u002Fp>\u003Cp>ตอนที่คุณเรียก API คุณเป็นฝั่งเริ่มคุย ส่ง Request ไปถาม แล้วรอ Response กลับมา (ถ้ายังไม่คุ้นกับภาพนี้ อ่าน \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002Fblogs\u002Fwhat-is-api-beginners-guide\">API คืออะไร ทำงานอย่างไร\u003C\u002Fa> ก่อนได้) ส่วน Webhook คุณกลายเป็นฝั่งที่รอรับ อีกระบบเป็นคนเริ่มคุย ทั้งสองแบบใช้ HTTP เหมือนกัน ต่างกันแค่ว่าใครเป็นคนกดส่งก่อน\u003C\u002Fp>\u003Cp>แล้วเมื่อไหร่ควรใช้แบบไหน GitHub แนะนำไว้ชัดว่าการเรียก API เหมาะกับการดึงข้อมูลเป็นครั้งคราวจากไม่กี่แหล่ง ส่วน Webhook เหมาะเมื่อต้องติดตามหลายอย่างและอยากรู้ทันทีที่มีอะไรเปลี่ยน ในงานจริงสองอย่างนี้มักใช้คู่กัน Webhook บอกว่ามีอะไรเกิดขึ้น แล้วโปรแกรมของคุณค่อยเรียก API ไปดึงรายละเอียดเพิ่ม\u003C\u002Fp>\u003Ch2>Webhook ทำงานยังไง: มันคือ HTTP Request หนึ่งครั้ง\u003C\u002Fh2>\u003Cp>ไม่มีเวทมนตร์อะไรซ่อนอยู่ ตัวอย่างจาก GitHub คือ เมื่อมีเหตุการณ์ที่คุณเลือกไว้ GitHub จะส่ง \u003Ccode>POST\u003C\u002Fcode> มาที่ URL ของคุณ เนื้อหาเป็น JSON (หรือ form-urlencoded ถ้าเลือกแบบนั้น) และแนบ Header ที่บอกบริบทมาด้วย เช่น\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Ccode>X-GitHub-Event\u003C\u002Fcode>: เหตุการณ์นี้คืออะไร เช่น \u003Ccode>push\u003C\u002Fcode> หรือ \u003Ccode>issues\u003C\u002Fcode>\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode>X-GitHub-Delivery\u003C\u002Fcode>: รหัสไม่ซ้ำของการส่งครั้งนี้\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode>X-Hub-Signature-256\u003C\u002Fcode>: ลายเซ็นที่ใช้พิสูจน์ว่า GitHub เป็นคนส่งจริง (จะกลับมาพูดถึงข้างล่าง)\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>GitHub ยังระบุด้วยว่า Payload ใหญ่สุดได้ 25 MB ถ้าเหตุการณ์ไหนใหญ่กว่านั้นจะไม่ถูกส่งเลย\u003C\u002Fp>\u003Cp>ส่วนคำว่า \"Webhook คือ HTTP POST\" ถูกเกือบทุกกรณี แต่ไม่ใช่กฎตายตัว เช่น Webhook node ของ n8n รับได้ทั้ง \u003Ccode>GET\u003C\u002Fcode>, \u003Ccode>POST\u003C\u002Fcode>, \u003Ccode>PUT\u003C\u002Fcode>, \u003Ccode>PATCH\u003C\u002Fcode>, \u003Ccode>DELETE\u003C\u002Fcode> และ \u003Ccode>HEAD\u003C\u002Fcode> ถ้าอยากทบทวนว่า Request กับ Response ประกอบด้วยอะไรบ้าง เรามีบทความ \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002Fblogs\u002Fep-30-http-requests-responses-js-go\">การทำงานกับ HTTP Requests และ Responses\u003C\u002Fa> ให้อ่านต่อ\u003C\u002Fp>\u003Ch2>ลองเล่น: ส่งข้อความเข้า Discord ด้วย curl คำสั่งเดียว\u003C\u002Fh2>\u003Cp>ตัวอย่างที่จับต้องได้ง่ายที่สุดคือ Incoming Webhook ของ Discord ซึ่งรอบนี้คุณจะเป็นฝั่งส่ง และ Discord เป็นฝั่งรับ\u003C\u002Fp>\u003Cp>ขั้นแรก สร้าง Webhook ในเซิร์ฟเวอร์ Discord ที่คุณเป็นแอดมิน ตามคู่มือของ Discord คือเข้า Server Settings แล้วไปที่แท็บ Integrations กด Create Webhook เลือก channel ที่จะให้ข้อความไปโผล่ แล้วกด Copy Webhook URL จะได้ URL หน้าตาประมาณ \u003Ccode>https:\u002F\u002Fdiscord.com\u002Fapi\u002Fwebhooks\u002F&lt;id&gt;\u002F&lt;token&gt;\u003C\u002Fcode>\u003C\u002Fp>\u003Cp>ขั้นที่สอง เปิด Terminal แล้วส่งข้อความด้วย curl (ถ้ายังไม่คล่อง Terminal ดู \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002Fblogs\u002Fterminal-command-line-pro-essential-commands\">คำสั่ง Terminal ที่ควรรู้\u003C\u002Fa> ประกอบได้)\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">curl -X POST \"https:\u002F\u002Fdiscord.com\u002Fapi\u002Fwebhooks\u002F&lt;id&gt;\u002F&lt;token&gt;\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"content\": \"Deploy เสร็จแล้ว\"}'\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>สิ่งที่ \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fdocs.discord.com\u002Fdevelopers\u002Fresources\u002Fwebhook\">เอกสาร Execute Webhook ของ Discord\u003C\u002Fa> ระบุไว้ และควรรู้ก่อนลองมีดังนี้\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>ต้องมีอย่างน้อยหนึ่งใน \u003Ccode>content\u003C\u002Fcode>, \u003Ccode>embeds\u003C\u002Fcode>, \u003Ccode>components\u003C\u002Fcode>, \u003Ccode>file\u003C\u002Fcode> หรือ \u003Ccode>poll\u003C\u002Fcode>\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Ccode>content\u003C\u002Fcode> ยาวได้ไม่เกิน 2000 ตัวอักษร\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>ถ้าไม่ใส่ \u003Ccode>?wait=true\u003C\u002Fcode> ท้าย URL ค่าเริ่มต้นคือไม่รอ และ Discord จะตอบกลับเป็น \u003Ccode>204 No Content\u003C\u002Fcode> คือสำเร็จแต่ไม่มีเนื้อหาตอบกลับ\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>ใส่ \u003Ccode>username\u003C\u002Fcode> หรือ \u003Ccode>avatar_url\u003C\u002Fcode> เพื่อเปลี่ยนชื่อและรูปของผู้ส่งเฉพาะข้อความนั้นได้\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>ทีมเราลองยิงคำสั่งเดียวกันไปที่ URL ที่แต่ง id และ token ขึ้นมาเอง ได้ \u003Ccode>404\u003C\u002Fcode> กลับมาพร้อม \u003Ccode>{\"message\": \"Unknown Webhook\", \"code\": 10015}\u003C\u002Fcode> ถ้าคุณเจอข้อความนี้ แปลว่า URL ผิดหรือ Webhook ถูกลบไปแล้ว\u003C\u002Fp>\u003Cp>อีกเรื่องที่ควรรู้คือ Webhook ของ Discord ทำหน้าที่โพสต์ข้อความเข้า channel อย่างเดียว ถ้าอยากได้ระบบที่อ่านข้อความแล้วตอบกลับใน Discord ได้ ต้องไปทางบอต ซึ่งเราเล่าไว้ใน \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002Fblogs\u002Fbuild-ai-multi-agent-discord-openclaw-ep2\">ปั้นทีม AI Multi-Agent บน Discord\u003C\u002Fa>\u003C\u002Fp>\u003Ch2>ฝั่งรับ: เมื่อ GitHub หรือ LINE ยิงมาหาคุณ\u003C\u002Fh2>\u003Cp>พอสลับมาเป็นฝั่งรับ งานของคุณคือเปิด URL หนึ่งตัวบนเซิร์ฟเวอร์ให้พร้อมรับ Request แล้วเอา URL นั้นไปกรอกในระบบต้นทาง\u003C\u002Fp>\u003Cp>\u003Cstrong>GitHub:\u003C\u002Fstrong> เข้า Settings ของ repository ไปที่ Webhooks กด Add webhook แล้วกรอก Payload URL เลือกเหตุการณ์ที่อยากรับ และตั้ง Secret ไว้ใช้ตรวจลายเซ็น เกร็ดเล็กๆ จากคู่มือของ Discord คือ ถ้าอยากให้ commit ใน GitHub ไปโผล่ใน Discord ให้เอา Webhook URL ของ Discord มาเติม \u003Ccode>\u002Fgithub\u003C\u002Fcode> ต่อท้าย แล้วใส่เป็น Payload URL ได้เลย\u003C\u002Fp>\u003Cp>\u003Cstrong>LINE:\u003C\u002Fstrong> \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fdevelopers.line.biz\u002Fen\u002Fdocs\u002Fmessaging-api\u002Freceiving-messages\u002F\">เอกสาร Messaging API ของ LINE\u003C\u002Fa> อธิบายว่า เมื่อผู้ใช้ทักบัญชี LINE OA ของคุณ LINE Platform จะส่ง HTTP POST พร้อม webhook event object ไปที่ Webhook URL ที่คุณลงทะเบียนไว้ URL นั้นต้องเป็น HTTPS และทุก Request มี Header \u003Ccode>x-line-signature\u003C\u002Fcode> ที่คุณต้องตรวจก่อนประมวลผล\u003C\u002Fp>\u003Cp>ถ้าคุณเคยเห็นบทเรียนเก่าที่สอนส่งแจ้งเตือนเข้า LINE ด้วย LINE Notify ตอนนี้ใช้ไม่ได้แล้ว \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fdevelopers.line.biz\u002Fen\u002Fnews\u002F2025\u002F04\u002F01\u002Fline-notify\u002F\">LINE ประกาศว่าบริการ LINE Notify ยุติไปเมื่อ 31 มีนาคม 2025\u003C\u002Fa> และแนะนำให้ย้ายไปใช้ Messaging API แทน\u003C\u002Fp>\u003Ch2>Webhook URL คือความลับ ใครได้ไปก็ส่งได้\u003C\u002Fh2>\u003Cp>สังเกตไหมว่าคำสั่ง curl ข้างบนไม่มี API Key ไม่มีรหัสผ่าน เอกสารของ Discord ระบุตรงๆ ว่า Webhook ไม่ต้องใช้ bot user และไม่ต้องยืนยันตัวตน เพราะ token ฝังอยู่ใน URL แล้ว แปลว่าใครก็ตามที่ได้ URL นี้ไป สามารถโพสต์อะไรก็ได้เข้า channel ของคุณในนามของ Webhook ตัวนั้น\u003C\u002Fp>\u003Cp>ดังนั้นให้ปฏิบัติกับ Webhook URL เหมือน API Key ทุกประการ เก็บไว้ในไฟล์ \u003Ccode>.env\u003C\u002Fcode> อย่าเขียนลงโค้ดตรงๆ อย่า commit ขึ้น GitHub และอย่าแปะในแชตกลุ่ม วิธีเก็บให้ปลอดภัยเราอธิบายไว้ใน \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002Fblogs\u002Fapi-key-env-keep-secrets-safe\">API Key คืออะไร เก็บในไฟล์ .env ยังไงไม่ให้หลุด\u003C\u002Fa> ถ้าเผลอหลุดไปแล้ว ให้ลบ Webhook ตัวนั้นใน Discord แล้วสร้างใหม่ URL เก่าจะใช้ไม่ได้ทันที\u003C\u002Fp>\u003Ch2>ตรวจลายเซ็นก่อนเชื่อ: X-Hub-Signature-256\u003C\u002Fh2>\u003Cp>ฝั่งรับมีปัญหากลับด้าน URL ที่คุณเปิดรอไว้เป็น URL สาธารณะ ใครก็ส่ง POST ปลอมมาหลอกว่าเป็น GitHub ได้ ทางแก้คือการตรวจลายเซ็น\u003C\u002Fp>\u003Cp>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fwebhooks\u002Fusing-webhooks\u002Fvalidating-webhook-deliveries\">เอกสารของ GitHub\u003C\u002Fa> อธิบายว่า เมื่อคุณตั้ง Secret ไว้ GitHub จะเอา body ของ Request ไปคำนวณ HMAC ด้วย SHA-256 โดยใช้ Secret เป็นกุญแจ แล้วส่งผลลัพธ์มาใน Header \u003Ccode>X-Hub-Signature-256\u003C\u002Fcode> ซึ่งขึ้นต้นด้วย \u003Ccode>sha256=\u003C\u002Fcode> เสมอ ฝั่งคุณแค่คำนวณแบบเดียวกันแล้วเทียบ ถ้าไม่ตรงก็ปฏิเสธไป\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-javascript\">const crypto = require('crypto');\n\nfunction isFromGitHub(rawBody, signature, secret) {\n  const expected = 'sha256=' +\n    crypto.createHmac('sha256', secret).update(rawBody).digest('hex');\n  return signature.length === expected.length &amp;&amp;\n    crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>ทีมเราลองรันฟังก์ชันนี้บนเครื่องด้วย Node.js แล้วยิง curl ใส่ ลายเซ็นมั่วได้ \u003Ccode>401\u003C\u002Fcode> ส่วนลายเซ็นที่คำนวณถูกได้ \u003Ccode>204\u003C\u002Fcode> จุดที่ต้องระวังคือ GitHub แนะนำให้เทียบด้วยฟังก์ชันแบบ constant time อย่าง \u003Ccode>crypto.timingSafeEqual\u003C\u002Fcode> แทน \u003Ccode>===\u003C\u002Fcode> ธรรมดา เพื่อกันการโจมตีแบบจับเวลา และ Header \u003Ccode>X-Hub-Signature\u003C\u002Fcode> ตัวเก่าที่ใช้ SHA-1 มีไว้เพื่อความเข้ากันได้ย้อนหลังเท่านั้น ส่วน LINE ใช้หลักเดียวกัน คือ HMAC-SHA256 ด้วย channel secret แต่เข้ารหัสผลลัพธ์เป็น Base64 และส่งมาใน \u003Ccode>x-line-signature\u003C\u002Fcode>\u003C\u002Fp>\u003Ch2>ตอบให้ไว แล้วเตรียมรับของซ้ำ\u003C\u002Fh2>\u003Cp>GitHub กำหนดว่าเซิร์ฟเวอร์ของคุณควรตอบ 2XX ภายใน 10 วินาที ถ้าช้ากว่านั้น GitHub จะตัดการเชื่อมต่อและนับว่าการส่งครั้งนั้นล้มเหลว LINE ก็แนะนำไปทางเดียวกันว่าให้ประมวลผล event แบบ asynchronous (ทำเบื้องหลัง) ภาษาง่ายๆ คือ รับของ ตรวจลายเซ็น ตอบ 200 ไปก่อน แล้วค่อยทำงานหนักทีหลัง\u003C\u002Fp>\u003Cp>อีกเรื่องที่มือใหม่มักคิดไม่ถึงคือ ของอาจมาไม่ครบ และอาจมาซ้ำ GitHub เขียนไว้ว่าไม่ส่งซ้ำให้อัตโนมัติเมื่อส่งไม่สำเร็จ ถ้าเซิร์ฟเวอร์คุณล่มไป คุณต้องกด redeliver เอง ฝั่ง LINE ฟีเจอร์ส่งซ้ำปิดไว้เป็นค่าเริ่มต้น และ LINE ไม่เปิดเผยจำนวนครั้งหรือช่วงเวลาที่ส่งซ้ำ\u003C\u002Fp>\u003Cp>เพราะฉะนั้นโค้ดฝั่งรับควรจำรหัสของ event ที่ประมวลผลไปแล้ว เจอซ้ำก็ข้าม GitHub ให้ใช้ \u003Ccode>X-GitHub-Delivery\u003C\u002Fcode> ซึ่งการ redeliver จะใช้ค่าเดิม ส่วน LINE ให้ใช้ \u003Ccode>webhookEventId\u003C\u002Fcode> และดู \u003Ccode>deliveryContext.isRedelivery\u003C\u002Fcode> ประกอบ\u003C\u002Fp>\u003Ch2>Webhook ดีกว่า Polling เสมอไหม\u003C\u002Fh2>\u003Cp>ไม่เสมอ และควรพูดตรงๆ Polling ยังเหมาะเมื่อระบบต้นทางไม่มี Webhook ให้ใช้ เมื่อคุณต้องการข้อมูลแค่นานๆ ครั้ง หรือเมื่อโปรแกรมของคุณรันอยู่บนเครื่องที่ไม่มี URL สาธารณะให้ใครยิงเข้ามาได้\u003C\u002Fp>\u003Cp>และ Webhook เองก็พึ่งพาไม่ได้ร้อยเปอร์เซ็นต์ เพราะถ้าเซิร์ฟเวอร์ของคุณล่มในจังหวะที่ event ถูกส่งมา event นั้นอาจหายไปเงียบๆ ระบบที่ต้องการความแม่นยำจริงจึงมักใช้ทั้งสองอย่าง ให้ Webhook เป็นช่องทางหลักที่เร็ว แล้วมีงานเล็กๆ คอยเรียก API ตรวจทานเป็นระยะว่าไม่มีอะไรหลุดไป\u003C\u002Fp>\u003Cdiv data-type=\"horizontalRule\">\u003Chr>\u003C\u002Fdiv>\u003Ch2>สรุป: Webhook ต่างจาก API ยังไง\u003C\u002Fh2>\u003Cp>Webhook คือ HTTP Request ที่อีกระบบส่งมาหาคุณเองเมื่อมีเหตุการณ์ ส่วนการเรียก API คือคุณเป็นฝั่งไปถามเอง ทั้งคู่ใช้ HTTP และมักส่ง JSON เหมือนกัน ต่างกันแค่ทิศทาง ในฝั่งส่ง Webhook URL คือความลับที่ต้องเก็บเหมือน API Key ในฝั่งรับ ให้ตรวจลายเซ็นก่อนเชื่อ ตอบ 2XX ให้ไว และเตรียมรับ event ซ้ำเสมอ\u003C\u002Fp>\u003Cp>ถ้าอยากเห็นภาพชัดที่สุด ลองสร้าง Webhook ในเซิร์ฟเวอร์ Discord ส่วนตัวของคุณ แล้วส่งข้อความแรกด้วย curl ข้างบนดู พอเห็นข้อความโผล่ใน channel ครั้งแรก คำว่า Webhook จะไม่ใช่ศัพท์ลอยๆ อีกต่อไป\u003C\u002Fp>\u003Cp>ติดตามบทความและเทคนิคสำหรับคนเริ่มต้นสายโปรแกรมเมอร์ได้ที่ช่องทางของเรา\u003C\u002Fp>\u003Cp>Facebook: \u003Cstrong>Superdev Academy Thailand\u003C\u002Fstrong> — \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\u003C\u002Fa>\u003C\u002Fp>\u003Cp>YouTube: \u003Cstrong>Superdev Academy Channel\u003C\u002Fstrong> — \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.youtube.com\u002F@SuperdevAcademy\">https:\u002F\u002Fwww.youtube.com\u002F@SuperdevAcademy\u003C\u002Fa>\u003C\u002Fp>\u003Cp>Instagram: \u003Cstrong>@superdevacademy\u003C\u002Fstrong> — \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F\">https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F\u003C\u002Fa>\u003C\u002Fp>\u003Cp>TikTok: \u003Cstrong>@superdevacademy\u003C\u002Fstrong> — \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\u003C\u002Fa>\u003C\u002Fp>","cover_cover_dvaw60l8wl.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fa3fdk5ica2jt693\u002Fl\u002Fcover_cover_dvaw60l8wl.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fa3fdk5ica2jt693\u002Fm\u002Fcover_cover_dvaw60l8wl.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fa3fdk5ica2jt693\u002Fcover_cover_dvaw60l8wl.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fa3fdk5ica2jt693\u002Fs\u002Fcover_cover_dvaw60l8wl.webp","2026-09-29 04:47:54.691Z","wfztm6bp9384v3u",{"keywords":18,"locale":45,"school_blog":55},[19,25,29,33,37,41],{"collectionId":20,"collectionName":21,"created":22,"created_by":16,"id":23,"name":24,"updated":22,"updated_by":16},"sclkey987654321","school_keywords","2026-09-29 04:47:54.682Z","kmj5sys1ns1tikp","webhook คืออะไร",{"collectionId":20,"collectionName":21,"created":26,"created_by":16,"id":27,"name":28,"updated":26,"updated_by":16},"2026-09-29 04:47:54.683Z","uqbj6a7506q3hhw","webhook กับ api ต่างกันยังไง",{"collectionId":20,"collectionName":21,"created":30,"created_by":16,"id":31,"name":32,"updated":30,"updated_by":16},"2026-09-29 04:47:54.685Z","uxh1fnwc0l18cd0","webhook url คือ",{"collectionId":20,"collectionName":21,"created":34,"created_by":16,"id":35,"name":36,"updated":34,"updated_by":16},"2026-09-29 04:47:54.686Z","pq7996md9veh7bj","webhook discord",{"collectionId":20,"collectionName":21,"created":38,"created_by":16,"id":39,"name":40,"updated":38,"updated_by":16},"2026-09-29 04:47:54.687Z","bk029cjn9ke4ioc","webhook line",{"collectionId":20,"collectionName":21,"created":42,"created_by":16,"id":43,"name":44,"updated":42,"updated_by":16},"2026-09-29 04:47:54.688Z","1ue1aoixbnghk7t","polling vs webhook",{"code":46,"collectionId":47,"collectionName":48,"created":49,"flag":50,"id":51,"is_default":52,"label":53,"updated":54},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":56,"collectionId":57,"collectionName":58,"created":59,"expand":60,"id":77,"slug":78,"updated":79,"views":80},"spm4l1k5bgmhmmt","pbc_2105096300","school_blogs","2026-09-29 04:47:54.689Z",{"category":61},{"blogIds":62,"collectionId":63,"collectionName":64,"created":65,"created_by":66,"id":56,"image":67,"image_alt":68,"image_path":69,"image_s_url":70,"label":71,"name":72,"priority":73,"publish_at":74,"scheduled_at":68,"status":75,"updated":76,"updated_by":66},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:31:18.590Z","76qprkevbgfdps8","50hyjr6os45_ayazwr5gq7_tqzz9l5y5w.webp","","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fspm4l1k5bgmhmmt\u002F50hyjr6os45_ayazwr5gq7_tqzz9l5y5w.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fspm4l1k5bgmhmmt\u002Fs\u002F50hyjr6os45_ayazwr5gq7_tqzz9l5y5w.webp",{"en":72,"th":72},"Knowledge",0,"2026-03-18 02:25:41.222Z","published","2026-08-18 14:49:11.737Z","jidu7qjvaeric9p","what-is-webhook-vs-api","2026-10-20 10:01:55.421Z",127,"a3fdk5ica2jt693",[23,27,31,35,39,43],"2026-10-20 05:00:00.000Z","Webhook คืออะไร ต่างจาก API และ Polling ยังไง ลองส่งข้อความเข้า Discord ด้วย curl พร้อมวิธีเก็บ Webhook URL ให้ปลอดภัย ตรวจ signature และรับมือ event ซ้ำ","Webhook คืออะไร ต่างจาก API ยังไง พร้อมลองส่งเข้า Discord","2026-10-20 05:00:00.123Z","ebkf8ra4nd55ual",1,[90,94,98,102,106,110],{"answer":91,"id":92,"question":93},"Webhook กับ API ต่างกันที่ทิศทางของการคุย ตอนเรียก API โปรแกรมของคุณเป็นฝั่งส่ง Request ไปถามเอง ส่วน Webhook คืออีกระบบส่ง HTTP Request มาที่ URL ของคุณเองเมื่อเกิดเหตุการณ์ เช่น GitHub ส่ง POST พร้อม JSON มาเมื่อมีคน push โค้ด ทั้งสองแบบใช้ HTTP เหมือนกัน และในงานจริงมักใช้คู่กัน คือ Webhook บอกว่ามีอะไรเกิดขึ้น แล้วค่อยเรียก API ไปดึงรายละเอียดเพิ่ม","nxjtu5j777h5f3y","Webhook กับ API ต่างกันยังไง",{"answer":95,"id":96,"question":97},"Webhook URL คือที่อยู่ปลายทางที่ระบบหนึ่งจะส่ง HTTP Request ไปหาเมื่อเกิดเหตุการณ์ ได้มาสองทาง ถ้าคุณเป็นฝั่งส่ง เช่น Discord ให้เข้า Server Settings แท็บ Integrations กด Create Webhook แล้วกด Copy Webhook URL ถ้าคุณเป็นฝั่งรับ URL นั้นคือ Endpoint บนเซิร์ฟเวอร์ของคุณเอง แล้วเอาไปกรอกในระบบต้นทาง เช่นช่อง Payload URL ของ GitHub","g5x3xottk1313v4","Webhook URL คืออะไร เอามาจากไหน",{"answer":99,"id":100,"question":101},"Webhook ของ Discord ส่งข้อความได้ด้วย HTTP POST หนึ่งครั้งไปที่ Webhook URL พร้อม JSON อย่าง {\"content\": \"ข้อความ\"} เช่นใช้ curl ใส่ Header Content-Type: application\u002Fjson ตามเอกสาร Execute Webhook ของ Discord ข้อความใน content ยาวได้ไม่เกิน 2000 ตัวอักษร และถ้าไม่ใส่ ?wait=true จะได้ 204 No Content กลับมาเมื่อสำเร็จ Endpoint นี้ไม่ต้องยืนยันตัวตน จึงต้องเก็บ URL เป็นความลับ","ts2ec1whhkjzmnx","Webhook ของ Discord ใช้ส่งข้อความเข้า channel ยังไง",{"answer":103,"id":104,"question":105},"Webhook ของ LINE คือ URL ที่ LINE Platform ส่ง HTTP POST พร้อม webhook event object มาหาเมื่อผู้ใช้โต้ตอบกับ LINE OA ของคุณ ผ่าน Messaging API URL นั้นต้องเป็น HTTPS และต้องตรวจ Header x-line-signature ทุกครั้ง ส่วน LINE Notify เป็นอีกบริการที่ใช้ส่งแจ้งเตือน และยุติไปแล้วเมื่อ 31 มีนาคม 2025 โดย LINE แนะนำให้ย้ายไปใช้ Messaging API แทน","33rkznemm7047xt","Webhook ของ LINE คืออะไร ต่างจาก LINE Notify ไหม",{"answer":107,"id":108,"question":109},"Webhook ใน n8n คือ Webhook node ซึ่งเป็น trigger node ที่สร้าง URL ไว้รอรับข้อมูลจากแอปอื่น แล้วเริ่มรัน workflow เมื่อมี Request เข้ามา node นี้มี 2 URL คือ Test URL ใช้ตอนกด Listen for Test Event และ Production URL ที่ทำงานเมื่อ publish workflow แล้ว รองรับ GET, POST, PUT, PATCH, DELETE และ HEAD ตามเอกสารของ n8n ขนาด payload สูงสุดคือ 16MB","h8q2gpxqb5mevjv","Webhook ใน n8n คืออะไร",{"answer":111,"id":112,"question":113},"Webhook redelivery คือการส่ง event เดิมซ้ำอีกรอบหลังส่งครั้งแรกไม่สำเร็จ GitHub ไม่ส่งซ้ำให้อัตโนมัติ คุณต้องกด redeliver เอง และการส่งซ้ำจะใช้ค่า X-GitHub-Delivery เดิม ส่วน LINE ปิดฟีเจอร์ส่งซ้ำไว้เป็นค่าเริ่มต้น โค้ดฝั่งรับจึงควรจำรหัส event ที่ทำไปแล้ว เช่น X-GitHub-Delivery หรือ webhookEventId ของ LINE เจอซ้ำให้ข้าม เพื่อไม่ให้งานเดียวถูกทำสองครั้ง","96r0ci4n8ont8dg","Webhook redelivery คืออะไร ทำไมต้องกันข้อมูลซ้ำ",{"th":78,"en":78}]