วิธีทดสอบ API Localhost ด้วย Webhook Service

Ashley Innocent

Ashley Innocent

28 January 2026

วิธีทดสอบ API Localhost ด้วย Webhook Service

enterprise.banner.title

enterprise.banner.feature1

enterprise.banner.feature2

enterprise.banner.feature3

enterprise.banner.ctaB

การทดสอบ API บน localhost ที่ต้องรับ webhook หรือ callback จากบริการภายนอก จำเป็นต้องเปิดเผยเซิร์ฟเวอร์การพัฒนาในเครื่องของคุณออกสู่สาธารณะชั่วคราว บริการ Tunneling เช่น ngrok, NPort, Cloudflare Tunnel และอื่นๆ จะสร้างการเชื่อมต่อที่ปลอดภัยที่ทำให้ localhost ของคุณมี URL สาธารณะ

💡
ดาวน์โหลด Apidog เพื่อทำตามขั้นตอนการทดสอบ webhook ในคู่มือนี้ คู่มือนี้ครอบคลุมวิธีการเลือกเครื่องมือที่เหมาะสม การตั้งค่า tunneling การทดสอบ webhook อย่างมีประสิทธิภาพโดยใช้ Apidog และการจัดการกับความท้าทายทั่วไป เช่น การตรวจสอบสิทธิ์ อัตราการจำกัด และการดีบัก
button

ทำไมคุณถึงต้องการ Localhost Tunneling

คุณกำลังสร้าง API ที่จะเชื่อมโยงกับบริการภายนอก ทุกอย่างทำงานได้ดีบนแล็ปท็อปของคุณ — endpoint ตอบสนองอย่างถูกต้อง ข้อมูลไหลลื่น จากนั้นคุณก็ลองทดสอบ webhook callbacks จาก Stripe, GitHub, Twilio หรือบริการภายนอกอื่นๆ

ปัญหา: บริการภายนอกไม่สามารถเข้าถึง localhost:3000 ได้ เซิร์ฟเวอร์การพัฒนาของคุณไม่สามารถเข้าถึงได้จากอินเทอร์เน็ต

สถานการณ์ทั่วไปที่ทำให้การทำงานของคุณหยุดชะงัก:

1. การทดสอบ Webhook

บริการต่างๆ เช่น Stripe ส่งการยืนยันการชำระเงิน, GitHub ส่งเหตุการณ์เกี่ยวกับ Repository, Slack ส่งเหตุการณ์การโต้ตอบ — ทั้งหมดในรูปแบบคำขอ POST ไปยัง API ของคุณ ในระหว่างการพัฒนา บริการเหล่านี้ต้องการ URL สาธารณะเพื่อส่ง webhook ไปยัง

2. OAuth Callback URLs

เมื่อคุณใช้งาน "เข้าสู่ระบบด้วย Google," "เข้าสู่ระบบด้วย GitHub" หรือ OAuth flow ใดๆ ผู้ให้บริการการตรวจสอบสิทธิ์จะเปลี่ยนเส้นทางผู้ใช้กลับไปยังแอปพลิเคชันของคุณพร้อมกับรหัสการอนุญาต URL การเปลี่ยนเส้นทางต้องสามารถเข้าถึงได้จากสาธารณะและตรงกับที่คุณลงทะเบียนไว้กับผู้ให้บริการ

3. การเชื่อมโยง API ของบุคคลที่สาม

API บางตัวต้องการ callback URL สำหรับการดำเนินการแบบ asynchronous ตัวอย่างเช่น บริการแปลงวิดีโอจะแจ้งเตือน API ของคุณเมื่อการประมวลผลเสร็จสิ้น หรือผู้ประมวลผลการชำระเงินจะยืนยันธุรกรรม

4. การพัฒนาแอปพลิเคชันมือถือ

การทดสอบ API ของคุณจากอุปกรณ์มือถือบนเครือข่ายเดียวกันมักจะล้มเหลวเนื่องจากแอปมือถือไม่สามารถระบุ localhost ได้ การใช้ tunnel จะทำให้คุณมี URL ที่ใช้งานได้จากทุกอุปกรณ์

5. การสาธิตให้ลูกค้าดู

บางครั้งคุณจำเป็นต้องแสดงผลงานที่กำลังดำเนินอยู่ให้ลูกค้าหรือผู้มีส่วนได้ส่วนเสียดู การ deploy ไปยัง staging สำหรับการเปลี่ยนแปลงเล็กๆ น้อยๆ ทุกครั้งจะทำให้การทำงานช้าลง URL สาธารณะชั่วคราวช่วยให้ลูกค้าสามารถทดสอบสภาพแวดล้อมการพัฒนาของคุณได้

Localhost Tunneling ทำงานอย่างไร

บริการ Tunneling สร้างการเชื่อมต่อที่ปลอดภัยระหว่างเซิร์ฟเวอร์คลาวด์ของพวกเขากับเครื่องคอมพิวเตอร์ของคุณ:

External Service → Tunneling Service (public URL) → Secure Connection → Your Localhost:3000

กระบวนการ:

  1. คุณเริ่มไคลเอนต์ tunnel บนเครื่องของคุณ โดยชี้ไปยังพอร์ตภายในเครื่องของคุณ
  2. ไคลเอนต์เชื่อมต่อ ไปยังโครงสร้างพื้นฐานคลาวด์ของบริการ tunneling
  3. บริการกำหนด URL สาธารณะ (เช่น https://abc123.ngrok.io)
  4. คำขอที่เข้ามา ไปยัง URL สาธารณะนั้นจะถูกส่งผ่านการเชื่อมต่อที่เข้ารหัสไปยัง localhost ของคุณ
  5. เซิร์ฟเวอร์ภายในเครื่องของคุณ จะได้รับคำขอราวกับว่ามันมาจากไคลเอนต์โดยตรง
  6. การตอบสนองจะไหลกลับ ผ่าน tunnel ไปยังผู้ร้องขอ

สิ่งนี้เกิดขึ้นอย่างโปร่งใส เซิร์ฟเวอร์ภายในเครื่องของคุณไม่จำเป็นต้องรู้ว่ามันอยู่เบื้องหลัง tunnel

การเปรียบเทียบบริการ Tunneling ยอดนิยม

นี่คือตัวเลือกที่ได้รับความนิยมมากที่สุดในปี 2026 พร้อมจุดแข็งและข้อจำกัด:

ngrok (ยอดนิยมที่สุด)

เหมาะสำหรับ: โครงการที่จัดตั้งแล้ว, ทีมที่ต้องการความน่าเชื่อถือ

ngrok http 3000

ข้อดี:

ข้อเสีย:

แพลนฟรี:

แพลนแบบชำระเงิน: $8-$20/เดือน

NPort (ทางเลือกฟรีที่กำลังมาแรง)

เหมาะสำหรับ: นักพัฒนาที่ต้องการหลีกเลี่ยงค่าใช้จ่ายรายเดือน

nport start 3000

ข้อดี:

ข้อเสีย:

แพลนฟรี:

นี่คือเครื่องมือที่กำลังได้รับความนิยมบน Dev.to เนื่องจากนักพัฒนาแสวงหาทางเลือกอื่นแทน ngrok โดยไม่มีค่าใช้จ่ายต่อเนื่อง

Cloudflare Tunnel (เหมาะที่สุดสำหรับสภาพแวดล้อมใกล้เคียง Production)

เหมาะสำหรับ: ทีมที่ใช้ Cloudflare อยู่แล้ว, ต้องการ tunnel ที่ทำงานระยะยาว

cloudflared tunnel --url http://localhost:3000

ข้อดี:

ข้อเสีย:

แพลนฟรี:

Localtunnel (ง่ายที่สุด)

เหมาะสำหรับ: การทดสอบแบบครั้งเดียวที่รวดเร็ว, ไม่ต้องติดตั้ง

npx localtunnel --port 3000

ข้อดี:

ข้อเสีย:

แพลนฟรี:

Tailscale Funnel (เหมาะที่สุดสำหรับทีม)

เหมาะสำหรับ: การแชร์ส่วนตัวภายในทีม, การสาธิตที่ปลอดภัย

tailscale serve https / http://localhost:3000
tailscale funnel 443 on

ข้อดี:

ข้อเสีย:

แพลนฟรี:

ตารางเปรียบเทียบ

คุณสมบัติngrokNPortCloudflare TunnelLocaltunnelTailscale
ราคาฟรี/$10+ฟรีฟรีฟรีฟรี/ชำระเงิน
จำกัดเวลาเซสชัน2 ชั่วโมงไม่มีไม่มีไม่มีไม่มี
โดเมนที่กำหนดเองชำระเงินฟรีใช่ไม่ใช่
ตัวตรวจสอบคำขอใช่พื้นฐานไม่ไม่ไม่
ความซับซ้อนในการตั้งค่าต่ำต่ำปานกลางต่ำมากปานกลาง
ความน่าเชื่อถือยอดเยี่ยมดียอดเยี่ยมแย่ยอดเยี่ยม
เหมาะสำหรับการทดสอบ Productionนักพัฒนาที่คำนึงถึงค่าใช้จ่ายองค์กรการทดสอบด่วนการแชร์ในทีม

การตั้งค่า Localhost Tunnel ครั้งแรกของคุณ

มาดูขั้นตอนการตั้งค่าด้วยเครื่องมือที่พบบ่อยที่สุด เราจะใช้ Node.js Express API เป็นตัวอย่าง แต่สิ่งนี้ใช้งานได้กับเซิร์ฟเวอร์ภายในเครื่องทุกประเภท

ตัวอย่าง: เซิร์ฟเวอร์ API ภายในเครื่อง

// server.js
const express = require('express');
const app = express();

app.use(express.json());

app.post('/webhook', (req, res) => {
  console.log('Webhook received:', req.body);
  res.json({ received: true });
});

app.get('/health', (req, res) => {
  res.json({ status: 'healthy' });
});

app.listen(3000, () => {
  console.log('Server running on http://localhost:3000');
});

ตัวเลือกที่ 1: การใช้ ngrok

ขั้นตอนที่ 1: ติดตั้ง ngrok

# macOS
brew install ngrok

# Windows (ผ่าน Chocolatey)
choco install ngrok

# Linux
curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | \
  sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null && \
  echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | \
  sudo tee /etc/apt/sources.list.d/ngrok.list && \
  sudo apt update && sudo apt install ngrok

ขั้นตอนที่ 2: ตรวจสอบสิทธิ์ (เป็นทางเลือกแต่แนะนำ)

ngrok config add-authtoken YOUR_AUTH_TOKEN

ขั้นตอนที่ 3: เริ่มต้น tunnel

ngrok http 3000

ผลลัพธ์:

Session Status                online
Account                       you@example.com (Plan: Free)
Version                       3.5.0
Region                        United States (us)
Forwarding                    https://abc123.ngrok.io -> http://localhost:3000

ตอนนี้ API ของคุณสามารถเข้าถึงได้ที่ https://abc123.ngrok.io

ขั้นตอนที่ 4: ทดสอบ

curl https://abc123.ngrok.io/health
# {"status":"healthy"}

ตัวเลือกที่ 2: การใช้ NPort (ทางเลือกฟรี)

ขั้นตอนที่ 1: ติดตั้ง NPort

npm install -g nport-cli
# หรือ
curl -sSL https://nport.io/install.sh | bash

ขั้นตอนที่ 2: เริ่มต้น tunnel

nport start 3000 --subdomain myapi

ผลลัพธ์:

✓ Tunnel started successfully
Public URL: https://myapi.nport.io
Local URL:  http://localhost:3000

ขั้นตอนที่ 3: ทดสอบ

curl https://myapi.nport.io/health
# {"status":"healthy"}

ตัวเลือกที่ 3: การใช้ Cloudflare Tunnel

ขั้นตอนที่ 1: ติดตั้ง cloudflared

# macOS
brew install cloudflare/cloudflare/cloudflared

# Linux
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

ขั้นตอนที่ 2: Quick tunnel (ไม่ต้องลงทะเบียน)

cloudflared tunnel --url http://localhost:3000

ผลลัพธ์:

2026-01-27T12:00:00Z INF Your quick tunnel is: https://xyz789.trycloudflare.com

สำหรับ tunnel แบบถาวร (ต้องมีบัญชี Cloudflare):

# เข้าสู่ระบบ
cloudflared tunnel login

# สร้าง tunnel
cloudflared tunnel create myapi

# กำหนดค่าและรัน
cloudflared tunnel --config config.yml run myapi

การทดสอบ Webhooks ด้วย Apidog

ตอนนี้ localhost ของคุณสามารถเข้าถึงได้จากสาธารณะแล้ว มาทดสอบ webhook อย่างเป็นระบบโดยใช้ Apidog

ทำไมต้องรวม Tunneling + Apidog?

Tunneling แก้ปัญหาการเข้าถึง; Apidog แก้ปัญหาการยืนยัน:

การตั้งค่าการทดสอบ Webhook ใน Apidog

ขั้นตอนที่ 1: นำเข้าหรือสร้าง API ของคุณ

  1. เปิด Apidog

2. สร้างโปรเจกต์ใหม่

3. เพิ่ม endpoint ของ webhook:

ขั้นตอนที่ 2: กำหนดค่าตัวแปรสภาพแวดล้อม (Environment Variables)

ตั้งค่าสภาพแวดล้อมสองแบบ:

การพัฒนา (Tunneled):

{
  "base_url": "https://abc123.ngrok.io"
}

Production:

{
  "base_url": "https://api.yourapp.com"
}

สิ่งนี้ช่วยให้คุณสามารถทดสอบ endpoint เดียวกันทั้งในเครื่องและในสภาพแวดล้อม Production ได้ด้วยการคลิกเพียงครั้งเดียว

ขั้นตอนที่ 3: สร้างสถานการณ์การทดสอบ

ทดสอบสิ่งที่เกิดขึ้นเมื่อ webhook เข้ามา:

ตัวอย่าง: การทดสอบ Stripe Payment Webhook

// เนื้อหาคำขอ (Request Body)
{
  "type": "payment_intent.succeeded",
  "data": {
    "object": {
      "id": "pi_test123",
      "amount": 2000,
      "currency": "usd",
      "status": "succeeded"
    }
  }
}

การยืนยันใน Apidog:

  1. รหัสสถานะเท่ากับ 200
  2. การตอบกลับมี received: true
  3. เวลาตอบสนอง < 1000ms
  4. Content-Type คือ application/json

ขั้นตอนที่ 4: จำลองบริการบุคคลที่สาม

แทนที่จะเรียกใช้ webhook จริงจาก Stripe หรือ GitHub ให้จำลองใน Apidog:

  1. คัดลอกตัวอย่าง payload ของ webhook จากเอกสารของบริการ
  2. สร้างกรณีทดสอบพร้อมสถานการณ์ต่างๆ (สำเร็จ, ล้มเหลว, กรณีขอบ)
  3. เรียกใช้สถานการณ์ทั้งหมดกับ localhost ที่คุณได้ทำ tunnel ไว้
  4. ตรวจสอบว่า API ของคุณจัดการแต่ละกรณีได้อย่างถูกต้อง

การทดสอบ OAuth Callbacks

สถานการณ์: คุณกำลังใช้งาน "เข้าสู่ระบบด้วย Google"

ขั้นตอนที่ 1: เริ่มต้น tunnel ด้วย subdomain ที่กำหนดเอง

ngrok http 3000 --subdomain myapp
# URL: https://myapp.ngrok.io

ขั้นตอนที่ 2: กำหนดค่า OAuth redirect ใน Google Console

ตั้งค่า callback URL: https://myapp.ngrok.io/auth/google/callback

ขั้นตอนที่ 3: ทดสอบ flow ใน Apidog

  1. ส่งคำขอไปยัง /auth/google เพื่อรับ URL การอนุญาต
  2. ติดตามการเปลี่ยนเส้นทางด้วยตนเองหรือโดยโปรแกรม
  3. ตรวจสอบว่า callback ได้รับรหัสการอนุญาต
  4. ยืนยันว่าการแลกเปลี่ยนโทเค็นทำงานได้อย่างถูกต้อง

ขั้นตอนที่ 4: ตรวจสอบการจัดเก็บโทเค็น

ใช้ Apidog เพื่อ:

กรณีการใช้งานทั่วไป

1. การทดสอบ Webhook การชำระเงิน (Stripe, PayPal)

ความท้าทาย: ผู้ให้บริการชำระเงินส่ง webhook สำหรับเหตุการณ์ต่างๆ เช่น การชำระเงินสำเร็จ การคืนเงิน ข้อพิพาท

วิธีแก้ปัญหา:

# เริ่มต้น tunnel
ngrok http 3000

# กำหนดค่า webhook URL ในแดชบอร์ด Stripe
# https://abc123.ngrok.io/webhook/stripe

# ใช้ Stripe CLI เพื่อส่งต่อ webhook ทดสอบ
stripe listen --forward-to localhost:3000/webhook/stripe

# เรียกใช้เหตุการณ์ทดสอบ
stripe trigger payment_intent.succeeded

ทดสอบด้วย Apidog:

2. การทดสอบคำสั่ง Bot ของ Slack/Discord

ความท้าทาย: แพลตฟอร์มแชทส่งเหตุการณ์การโต้ตอบเมื่อผู้ใช้คลิกปุ่มหรือรันคำสั่ง

วิธีแก้ปัญหา:

# เริ่มต้น tunnel
nport start 3000 --subdomain myslackbot

# กำหนดค่าใน Slack API:
# Interactivity URL: https://myslackbot.nport.io/slack/interactions
# Slash Commands: https://myslackbot.nport.io/slack/commands

ทดสอบด้วย Apidog:

3. การทดสอบ SMS/Voice Webhooks (Twilio)

ความท้าทาย: Twilio ส่ง webhook เมื่อมี SMS เข้ามาหรือได้รับสายโทรศัพท์

วิธีแก้ปัญหา:

cloudflared tunnel --url http://localhost:3000

กำหนดค่า TwiML webhooks เพื่อชี้ไปยัง URL ของ tunnel ของคุณ

ทดสอบด้วย Apidog:

4. การทดสอบ API สำหรับแอปพลิเคชันมือถือ

ความท้าทาย: การทดสอบ API ของคุณจากอุปกรณ์จริงหรือโปรแกรมจำลอง

ปัญหาเกี่ยวกับ localhost:

// สิ่งนี้ล้มเหลวจากอุปกรณ์มือถือ
fetch('http://localhost:3000/api/users')

วิธีแก้ปัญหาด้วย tunnel:

// สิ่งนี้ใช้ได้จากทุกที่
fetch('https://myapi.ngrok.io/api/users')

ทดสอบด้วย Apidog:

  1. สร้างเอกสาร API ด้วย base URL ที่ tunneled
  2. แชร์กับทีมมือถือ
  3. นักพัฒนาแอปพลิเคชันมือถือสามารถทดสอบกับเซิร์ฟเวอร์การพัฒนาของคุณได้โดยตรง
  4. เปลี่ยนไปใช้ URL ของ staging/production เมื่อพร้อม

5. การทดสอบ GitHub/GitLab Webhooks

ความท้าทาย: การทดสอบ repository webhooks (push, pull request, issues) ในเครื่อง

วิธีแก้ปัญหา:

# เริ่มต้น tunnel
ngrok http 4000

# กำหนดค่าในการตั้งค่า GitHub repo:
# Webhook URL: https://abc123.ngrok.io/github/webhook
# Content type: application/json
# Events: Push, Pull requests

ทดสอบด้วย Apidog:

แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัย

การเปิดเผย localhost สู่สาธารณะสร้างความเสี่ยงด้านความปลอดภัย โปรดปฏิบัติตามแนวทางปฏิบัติดังต่อไปนี้:

1. ใช้ HTTPS เท่านั้น

บริการ tunneling ทั้งหมดมี HTTPS ให้โดยค่าเริ่มต้น ห้ามใช้ HTTP ธรรมดาสำหรับ tunnels:

# ดี
ngrok http 3000
# สร้าง https://abc123.ngrok.io

# ไม่ดี (อย่าทำสิ่งนี้)
ngrok http --scheme=http 3000

2. ใช้การตรวจสอบลายเซ็น Webhook

อย่าเชื่อ webhook ที่เข้ามาโดยไม่ตรวจสอบ ตรวจสอบลายเซ็น:

const crypto = require('crypto');

function verifyStripeSignature(payload, signature, secret) {
  const expectedSignature = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expectedSignature)
  );
}

app.post('/webhook/stripe', (req, res) => {
  const signature = req.headers['stripe-signature'];

  if (!verifyStripeSignature(req.body, signature, process.env.STRIPE_SECRET)) {
    return res.status(401).send('Invalid signature');
  }

  // ประมวลผล webhook
});

3. จำกัดการเข้าถึงด้วย Basic Auth

เพิ่มการตรวจสอบสิทธิ์ให้กับ tunnel ของคุณ:

# ngrok พร้อม basic auth
ngrok http 3000 --auth="username:password"

# NPort พร้อม basic auth
nport start 3000 --auth username:password

ตอนนี้คำขอต้องการข้อมูลประจำตัว:

curl -u username:password https://abc123.ngrok.io/webhook

4. ใช้ความลับเฉพาะสภาพแวดล้อม

ห้าม commit ความลับของ webhook หรือ API keys:

// .env.development
STRIPE_WEBHOOK_SECRET=whsec_test_abc123
WEBHOOK_TUNNEL_URL=https://abc123.ngrok.io

// .env.production
STRIPE_WEBHOOK_SECRET=whsec_live_xyz789
WEBHOOK_URL=https://api.yourapp.com

5. ตรวจสอบการเข้าถึง Tunnel

ใช้ request inspector เพื่อตรวจสอบกิจกรรมที่น่าสงสัย:

# ngrok มีเว็บอินเทอร์เฟซที่:
http://localhost:4040

# ดูคำขอ การตอบสนอง การโจมตีซ้ำทั้งหมด

6. จำกัดระยะเวลาของ Tunnel

อย่าปล่อยให้ tunnels ทำงานตลอดไป:

# หมดอายุ tunnel โดยอัตโนมัติหลังจาก 1 ชั่วโมง
ngrok http 3000 --session-duration 1h

7. ตรวจสอบแหล่งที่มาของคำขอ

ตรวจสอบที่อยู่ IP ที่เข้ามาหรือใช้ allowlists:

const allowedIPs = [
  '192.0.2.1',  // IP ของ Stripe webhook
  '198.51.100.0/24'
];

app.use('/webhook', (req, res, next) => {
  const clientIP = req.ip;

  if (!allowedIPs.includes(clientIP)) {
    return res.status(403).send('Forbidden');
  }

  next();
});

การแก้ไขปัญหาทั่วไป

ปัญหาที่ 1: URL ของ Tunnel เปลี่ยนแปลงทุกครั้งที่เริ่มเซสชัน

ปัญหา: Tunnel ฟรีของ ngrok ใช้ URL แบบสุ่มที่เปลี่ยนแปลงทุกครั้งที่รีสตาร์ท Webhooks ที่กำหนดค่าด้วย URL เก่าจะไม่ทำงาน

วิธีแก้ปัญหา:

  1. ใช้แผนแบบชำระเงิน สำหรับ URL แบบคงที่:
ngrok http 3000 --domain=myapp.ngrok.app
  1. เปลี่ยนไปใช้ NPort พร้อม subdomain ที่กำหนดเองได้ฟรี:
nport start 3000 --subdomain myapp
# ได้ https://myapp.nport.io เสมอ
  1. อัปเดต webhooks ด้วยโปรแกรม ผ่าน API เมื่อ tunnel เริ่มต้น

ปัญหาที่ 2: Webhooks หมดเวลา

ปัญหา: เซิร์ฟเวอร์ในเครื่องของคุณใช้เวลานานเกินไปในการตอบสนอง บริการเช่น Slack ต้องการการตอบสนองภายใน 3 วินาที

วิธีแก้ปัญหา:

ประมวลผลแบบ asynchronous:

app.post('/webhook', async (req, res) => {
  // รับทราบทันที
  res.json({ received: true });

  // ประมวลผลในเบื้องหลัง
  processWebhookAsync(req.body).catch(console.error);
});

async function processWebhookAsync(data) {
  // ทำงานที่ใช้เวลานานที่นี่ (ฐานข้อมูล, API ภายนอก ฯลฯ)
  await heavyProcessing(data);
}

ทดสอบการหมดเวลาด้วย Apidog โดยการตั้งค่าขีดจำกัดเวลาหมดอายุที่เข้มงวดในสถานการณ์ทดสอบ

ปัญหาที่ 3: ข้อผิดพลาด CORS จากเบราว์เซอร์

ปัญหา: ส่วนหน้า (Frontend) ที่ส่งคำขอไปยัง URL ของ tunnel ได้รับข้อผิดพลาด CORS

วิธีแก้ปัญหา:

กำหนดค่าส่วนหัว CORS:

const cors = require('cors');

app.use(cors({
  origin: [
    'http://localhost:3001',  // เซิร์ฟเวอร์พัฒนาส่วนหน้าของคุณ
    'https://abc123.ngrok.io'  // URL ของ tunnel ของคุณ
  ],
  credentials: true
}));

ปัญหาที่ 4: การจำกัดอัตรา (Rate Limiting) ในแพลนฟรี

ปัญหา: Tunnels ฟรีมีข้อจำกัดการเชื่อมต่อ (ngrok: 40/นาที)

วิธีแก้ปัญหา:

  1. รวมคำขอทดสอบ ใน Apidog แทนที่จะทดสอบแต่ละรายการอย่างรวดเร็ว
  2. ใช้ tunnels หลายอัน สำหรับบริการที่แตกต่างกัน
  3. อัปเกรดเป็นแผนแบบชำระเงิน หากมีการทดสอบจำนวนมาก
  4. เปลี่ยนไปใช้บริการที่ไม่จำกัด เช่น Cloudflare Tunnel หรือ NPort

ปัญหาที่ 5: Tunnel หลุดบ่อย

ปัญหา: ความไม่เสถียรของเครือข่ายทำให้ tunnel หลุด

วิธีแก้ปัญหา:

ใช้ systemd/pm2 เพื่อรีสตาร์ทอัตโนมัติ:

# สร้างบริการ systemd
sudo nano /etc/systemd/system/ngrok.service
[Unit]
Description=ngrok tunnel
After=network.target

[Service]
Type=simple
User=youruser
WorkingDirectory=/home/youruser
ExecStart=/usr/local/bin/ngrok http 3000
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
sudo systemctl enable ngrok
sudo systemctl start ngrok

ปัญหาที่ 6: ไม่สามารถเข้าถึง Tunnel จากเครือข่ายเฉพาะ

ปัญหา: Firewall ขององค์กรหรือเครือข่ายที่เข้มงวดบล็อกการรับส่งข้อมูลของ tunnel

วิธีแก้ปัญหา:

  1. ใช้ Cloudflare Tunnel (ไม่ค่อยถูกบล็อก)
  2. เปลี่ยนภูมิภาคของ tunnel ให้ใกล้กับคุณมากขึ้น:
ngrok http 3000 --region eu
  1. ใช้ Tailscale สำหรับเครือข่ายส่วนตัวแทน tunnel สาธารณะ

รูปแบบขั้นสูง

รูปแบบที่ 1: Multi-Port Tunneling

เปิดเผยบริการหลายรายการพร้อมกัน:

# เทอร์มินัล 1: API server
ngrok http 3000

# เทอร์มินัล 2: Frontend dev server
ngrok http 3001

# เทอร์มินัล 3: Webhook worker
ngrok http 3002

หรือใช้ไฟล์กำหนดค่า ngrok:

# ~/.ngrok2/ngrok.yml
tunnels:
  api:
    proto: http
    addr: 3000
  frontend:
    proto: http
    addr: 3001
  worker:
    proto: http
    addr: 3002
ngrok start --all

รูปแบบที่ 2: Tunnel + Docker Compose

# docker-compose.yml
version: '3'
services:
  api:
    build: .
    ports:
      - "3000:3000"

  ngrok:
    image: ngrok/ngrok:latest
    command:
      - "http"
      - "api:3000"
    environment:
      NGROK_AUTHTOKEN: ${NGROK_AUTHTOKEN}
docker-compose up

รูปแบบที่ 3: การฉีด URL ของ Tunnel แบบไดนามิก

อัปเดตแอปของคุณด้วย URL ของ tunnel โดยอัตโนมัติ:

// start-tunnel.js
const ngrok = require('ngrok');
const fs = require('fs');

(async function() {
  const url = await ngrok.connect(3000);
  console.log(`Tunnel started: ${url}`);

  // อัปเดตไฟล์ .env
  fs.appendFileSync('.env', `\nTUNNEL_URL=${url}\n`);

  // อัปเดต Stripe webhook
  await updateStripeWebhook(url);
})();

รูปแบบที่ 4: การส่งต่อคำขอไปยังหลายสภาพแวดล้อม

ทดสอบ webhook เดียวกันกับสภาพแวดล้อม dev, staging และ production:

// webhook-multiplexer.js
app.post('/webhook', async (req, res) => {
  const environments = [
    'http://localhost:3000',
    'https://staging.api.com',
    'https://api.yourapp.com'
  ];

  // ส่งต่อให้ทุกสภาพแวดล้อม
  const results = await Promise.all(
    environments.map(env =>
      fetch(`${env}/webhook`, {
        method: 'POST',
        headers: req.headers,
        body: JSON.stringify(req.body)
      })
    )
  );

  res.json({ forwarded: results.length });
});

บทสรุป

การทดสอบ API บน localhost ที่ได้รับ webhook หรือ callback ไม่จำเป็นต้อง deploy ไปยัง staging สำหรับทุกการเปลี่ยนแปลง บริการ Tunneling สร้าง URL สาธารณะชั่วคราวที่ช่วยให้บริการภายนอกสามารถเข้าถึงสภาพแวดล้อมการพัฒนาของคุณได้

เริ่มต้นด้วยแผนฟรีของเครื่องมือใดๆ หากการทดสอบ webhook กลายเป็นส่วนหนึ่งของการทำงานประจำวันของคุณ ลองพิจารณาแผนแบบชำระเงินสำหรับ URL แบบคงที่และคุณสมบัติเพิ่มเติม แต่สำหรับนักพัฒนาส่วนใหญ่ บริการ tunneling ฟรีที่รวมเข้ากับ ความสามารถในการทดสอบ API ของ Apidog ก็มีทุกสิ่งที่คุณต้องการเพื่อทดสอบ API บน localhost ได้อย่างมีประสิทธิภาพ

button

ฝึกการออกแบบ API แบบ Design-first ใน Apidog

ค้นพบวิธีที่ง่ายขึ้นในการสร้างและใช้ API