วิธีการส่งคำขอ POST ด้วย curl: คู่มือฉบับสมบูรณ์
ประมาณสองหมื่นล้านการติดตั้ง curl กำลังทำงานอยู่ทั่วโลกในขณะนี้ ตัวเลขนี้มาจากผู้สร้างเครื่องมืออย่าง Daniel Stenberg ซึ่งดูแลรักษามันแทบจะด้วยตัวคนเดียว curl ถูกติดตั้งอยู่ในเราเตอร์ รถยนต์ ดาวเทียม สมาร์ททีวี เซิร์ฟเวอร์ Linux ที่รองรับเว็บสาธารณะส่วนใหญ่ และรันไทม์ LLM หลักๆ ทุกตัว ในบรรดาคำสั่ง HTTP ทั้งหมดที่การติดตั้งเหล่านั้นใช้งาน คำสั่ง POST คือคำสั่งที่ทำงานหนักที่สุด การใช้ curl POST เป็นวิธีที่นักพัฒนาส่วนใหญ่ใช้ในการทดสอบ ดีบัก หรือเชื่อมต่อกับ API เป็นครั้งแรก
รายงาน State of the API ปี 2025 ของ Postman ระบุว่า REST มีการใช้งานถึง 93% 82% ขององค์กรต่างๆ ดำเนินการโดยใช้ API เป็นหลักอย่างน้อยบางส่วน POST คือคำสั่งที่ใช้บ่อยที่สุดในการสร้าง ส่ง หรือถ่ายโอนข้อมูลไปยังเซิร์ฟเวอร์ การใช้งาน AI ได้เร่งแนวโน้มนี้ให้เร็วขึ้น ปริมาณการใช้งาน API ที่เกี่ยวข้องกับ AI เพิ่มขึ้น 73% ในปี 2024 (Postman, 2024) และเอกสารประกอบการใช้งานของผู้ให้บริการ LLM ทุกรายในปัจจุบันเริ่มต้นด้วยตัวอย่างคำสั่ง curl POST เป็น "การเรียกใช้งานครั้งแรก" ที่เป็นมาตรฐาน
เอกสารอ้างอิงนี้จะอธิบายรูปแบบต่างๆ ของคำขอ POST ที่ใช้ curl ตั้งแต่แบบบรรทัดเดียวไปจนถึงการเรียกใช้งาน API การชำระเงินคริปโตจริง เป้าหมาย: เพื่อให้คุณสามารถคัดลอกไปใช้ได้ทันที ไม่ใช่แค่เพียงอ่าน การส่งข้อมูลไปยังเซิร์ฟเวอร์เป็นครั้งแรกหรือการสร้างตัวจัดการ webhook ใหม่ในเวลาตี 2 รูปแบบด้านล่างนี้ครอบคลุมสิ่งที่คุณต้องการจริงๆ
ตารางด้านล่างนี้เป็นเวอร์ชันย่อ เป็นเอกสารสรุปคำสั่ง curl ที่ใช้บ่อยที่สุดในการส่งคำขอ POST โดยแต่ละตัวเลือกจะอธิบายรายละเอียดในส่วนถัดไป
| ธง | มันทำอะไรได้บ้าง | เมื่อคุณเอื้อมมือไปหยิบมัน |
|---|---|---|
| `-X POST`, `--request POST` | บังคับให้ใช้วิธีการร้องขอ HTTP แบบ POST | วิธีการที่ชัดเจน หรือคำกริยาที่ไม่ธรรมดา |
| `-d`, `--data` | ส่งข้อมูลในส่วนเนื้อหาของคำขอ และตั้งค่า POST โดยอัตโนมัติ | ช่องกรอกข้อมูล, JSON แบบอินไลน์, ข้อมูลส่งแบบง่าย |
| `--data-binary` | ส่งไฟล์หรือข้อมูลไบนารีโดยไม่ตัดบรรทัดใหม่ | การอัปโหลดไฟล์, JSON ขนาดใหญ่, ข้อมูลไบนารีดิบ |
| `--data-urlencode` | เข้ารหัส URL ของค่าก่อนส่ง | ค่าที่มีช่องว่างหรืออักขระพิเศษ |
| `--json` | ส่งข้อมูลด้วย `Content-Type: application/json` และ `Accept: application/json` | curl เวอร์ชัน 7.82.0 หรือใหม่กว่า, API ในรูปแบบ JSON |
| `-H`, `--header` | เพิ่มส่วนหัว HTTP แบบกำหนดเอง | ประเภทเนื้อหา, การอนุญาต, คีย์ API |
| `-F`, `--form` | ส่งข้อมูลแบบ multipart/form-data พร้อมช่องกรอกข้อมูลหรือไฟล์ | การอัปโหลดไฟล์, แบบฟอร์มสไตล์ HTML |
| `-u`, `--user` | ส่งข้อมูลรับรองการตรวจสอบสิทธิ์ HTTP Basic | API รุ่นเก่า, การตรวจสอบสิทธิ์แบบง่ายๆ ด้วยชื่อผู้ใช้และรหัสผ่าน |
| `-i`, `--include` | รวมส่วนหัวการตอบกลับไว้ในผลลัพธ์ | การตรวจสอบการตอบสนองของเซิร์ฟเวอร์ |
| `-v`, `--verbose` | พิมพ์คำขอและคำตอบทั้งหมด รวมถึงส่วนหัวด้วย | การแก้ไขข้อผิดพลาดของคำขอ POST ที่ล้มเหลว |
ทำความเข้าใจคำขอ POST ของ curl และเมธอด HTTP
คำขอ POST ของ curl คือคำขอ HTTP POST ที่ส่งด้วยเมธอด POST จากบรรทัดคำสั่ง เครื่องมือ curl เองอธิบายหน้าที่ของมันว่า "ถ่ายโอนข้อมูล" ผ่านโปรโตคอลมากกว่าสองโหล ซึ่ง HTTP เป็นเพียงหนึ่งในนั้น POST หมายถึง: นี่คือข้อมูล ทำอะไรบางอย่างกับมัน ข้อมูลหลักจะอยู่ในส่วนเนื้อหาของคำขอ ไม่ใช่ใน URL คุณสมบัตินี้เองที่ทำให้ POST จัดการกับการสร้างทรัพยากร การส่งแบบฟอร์ม และสิ่งใดก็ตามที่เกี่ยวข้องกับข้อมูลประจำตัว GET จะเก็บข้อมูลไว้ในสตริงคำค้นหา ซึ่งมองเห็นได้โดยพร็อกซีทุกตัวและประวัติการเข้าชมของเบราว์เซอร์ทุกตัว แต่ POST ไม่ทำเช่นนั้น
บทช่วยสอนส่วนใหญ่จะมองข้ามรายละเอียดเล็กๆ แต่มีประโยชน์อย่างหนึ่ง นั่นคือ การใช้ `-d` จะทำให้ curl สลับไปใช้ POST โดยอัตโนมัติ ส่วน `-X POST` ซึ่งระบุวิธีการร้องขอแบบกำหนดเองนั้นเป็นตัวเลือกเสริม แต่ตัวอย่างหลายๆ ตัวอย่างก็ยังคงใช้ตัวเลือกนี้อยู่ เพราะการอ่าน `-X POST` ข้างๆ เพย์โหลดจะทำให้เข้าใจเจตนาได้ในทันที
คำสั่ง PUT และ POST มักถูกเข้าใจผิดกันบ่อยครั้ง จึงควรชี้แจงให้ชัดเจน PUT ใช้สำหรับแทนที่ทรัพยากร ณ ตำแหน่งที่ทราบ ส่วน POST ใช้สำหรับสร้างทรัพยากรใหม่ หรือส่งข้อมูลเพื่อประมวลผลที่ปลายทางทั่วไป

ไวยากรณ์พื้นฐานของ curl สำหรับ POST และแฟล็ก -d ในการใช้งานจริง
คำสั่ง curl POST ขั้นต่ำต้องมีหนึ่งบรรทัด:
```
curl -d "username=arya&age=16" https://api.example.com/users
```
แค่นั้นเองครับ คำขอ POST, เนื้อหาแบบ form-urlencoded, ไม่มีอะไรซับซ้อน `-d` ทำหน้าที่สามอย่าง: มันใส่ payload ลงใน body ของคำขอ เปลี่ยนวิธีการร้องขอเป็น POST และเพิ่ม `Content-Type: application/x-www-form-urlencoded` เป็น header เริ่มต้น ผมมักจะวางแบบที่ละเอียดกว่าเล็กน้อยอยู่แล้ว เพราะการใช้ POST นั้นอ่านง่ายกว่าในการตรวจสอบโค้ด:
```
curl -X POST -d "username=arya&age=16" https://api.example.com/users
```
ขนาดไบต์ที่ส่งผ่านสายก็เหมือนกัน พารามิเตอร์คำขอเหมือนกัน ใช้แบบใดก็ได้ที่ทีมของคุณคิดว่าสแกนได้ง่ายกว่า แฟล็ก `-d` เป็นเครื่องมือหลักที่ใช้ส่งข้อมูลไปยังเซิร์ฟเวอร์จากบรรทัดคำสั่ง และจัดการได้ถึง 90 เปอร์เซ็นต์ของสิ่งที่นักพัฒนาแบ็กเอนด์ใช้กับ curl: การเรียกใช้เชลล์ การทดสอบเว็บฮุค เป้าหมายใน Makefile ขั้นตอนใน GitHub Actions
ตัวเลือก `--d` สามแบบที่ใกล้เคียงกัน ได้แก่ `--data-binary` ซึ่งจะคงข้อมูลไบต์ของคุณไว้เหมือนเดิม ในขณะที่ `-d` แบบธรรมดาจะตัดบรรทัดใหม่และทำให้ข้อมูลไบนารีเสียหาย `--data-urlencode` จะเข้ารหัสแบบเปอร์เซ็นต์ให้คุณ เช่น `--data-urlencode "name=I am Daniel"` จะกลายเป็น `name=I%20am%20Daniel` `--data-raw` เป็นทางออกเมื่อค่าเริ่มต้นด้วย `@` และ curl ไม่ควรอ่านไฟล์ การใช้แฟล็ก `-d` หลายตัวจะเชื่อมต่อกันด้วย `&` เหมาะสำหรับแบบฟอร์ม แต่ไม่เหมาะสำหรับ JSON
ข้อควรระวังสุดท้าย: การใช้เครื่องหมายอัญประกาศเดี่ยว เครื่องหมายอัญประกาศเดี่ยวรอบข้อมูลจะทำให้เชลล์ไม่ตีความเครื่องหมาย `$` หรือเครื่องหมายแบ็กสแลช หากลืมใช้เครื่องหมายนี้ คุณอาจต้องมานั่งถามตอนตีสองว่าทำไมข้อมูล POST ของคุณหายไปครึ่งหนึ่ง
รายละเอียดเหล่านี้มีความสำคัญ เพราะ curl เองเป็นหนึ่งในไคลเอ็นต์ HTTP ที่ได้รับการทดสอบอย่างหนักที่สุดในโลก รายงานย้อนหลังของ Stenberg ในเดือนธันวาคม 2025 ระบุว่ามีการออกเวอร์ชันใหม่ 8 เวอร์ชันในปีนั้น มี CVE 9 รายการ ซึ่งทั้งหมดจัดอยู่ในระดับต่ำหรือปานกลาง มีกรณีทดสอบที่ใช้งานอยู่ 2,179 กรณี มากกว่าเมื่อสิบสองเดือนก่อน 232 กรณี เวอร์ชัน 8.11.1 ในเดือนธันวาคม 2024 ได้แก้ไข CVE-2024-11053 (การรั่วไหลของข้อมูลประจำตัว netrc และการเปลี่ยนเส้นทาง) เวอร์ชันเสถียรปัจจุบัน ณ ปลายเดือนเมษายน 2026 คือ curl 8.20.0 ผู้ที่ยังใช้เวอร์ชันต่ำกว่า 7.82.0 จะยังไม่มีแฟล็ก `--json` และต้องใช้รูปแบบสามแฟล็กแบบเก่าแทน
การส่งข้อมูล JSON ด้วย curl โดยใช้ --json หรือ -H
JSON คือภาษากลางของ REST API ในปี 2026 มีสองวิธีในการส่ง JSON ด้วย curl การเลือกใช้วิธีใดนั้นขึ้นอยู่กับเวอร์ชันของ curl ที่ติดตั้งอยู่ในเครื่อง
รูปแบบสามธงแบบคลาสสิก ใช้งานได้ทุกที่ตั้งแต่ CentOS 6 ขึ้นไป:
```
curl -X POST \
-H "Content-Type: application/json" \
-d '{"title":"Tea","quantity":2}' \
https://api.example.com/orders
```
ระบบชวเลขสมัยใหม่ มีให้ใช้งานตั้งแต่ curl เวอร์ชัน 7.82.0 (มีนาคม 2022):
```
curl --json '{"title":"Tea","quantity":2}' https://api.example.com/orders
```
แฟล็ก `--json` ทำหน้าที่สามอย่าง คือ ตั้งค่า `Content-Type: application/json` ตั้งค่า `Accept: application/json` และส่งเนื้อหา นอกจากนี้ยังสามารถรวมข้อมูลได้ด้วย กล่าวคือ หากใช้ `--json` มากกว่าหนึ่งครั้ง ข้อมูลจะถูกรวมเข้าด้วยกัน มีประโยชน์เมื่อส่งข้อมูล JSON เป็นส่วนๆ ไปยังเอนด์พอยต์แบบสตรีมมิ่ง
สำหรับข้อมูล JSON ที่จัดเก็บไว้ในไฟล์ ให้ใส่เครื่องหมาย `@` นำหน้าพาธของไฟล์ การโพสต์ข้อมูลจากไฟล์จะกลายเป็นรูปแบบมาตรฐานเมื่ออ็อบเจ็กต์ JSON มีขนาดใหญ่เกินกว่าจะวางลงในบรรทัดเดียว หรือเมื่อมันถูกจัดเก็บไว้ในระบบควบคุมเวอร์ชัน หรือเมื่อสคริปต์อื่นสร้างขึ้นมา:
```
curl -X POST -H "Content-Type: application/json" -d @order.json https://api.example.com/orders
curl --json @order.json https://api.example.com/orders
```
รูปแบบที่สองอ่านข้อมูลจากไฟล์ชื่อ `order.json` และส่งไปพร้อมกับส่วนหัวที่ถูกต้องทั้งหมด สำหรับเนื้อหา JSON ขนาดใหญ่หรืออาจเป็นข้อมูลไบนารี `--data-binary @file.json` เป็นตัวเลือกที่ปลอดภัยกว่า มันจะไม่ตัดบรรทัดใหม่ ไม่ตีความอักขระพิเศษ และส่งข้อมูลไบนารีดิบไปยังปลายทางที่คาดหวังไบต์แทนที่จะเป็นฟิลด์แบบฟอร์ม รูปแบบที่สามอ่านข้อมูลจาก stdin ผ่าน `-d @-` มีประโยชน์เมื่อส่งเอาต์พุตจากคำสั่งอื่นไปยัง curl POST โดยตรง
ตารางด้านล่างแสดงความสัมพันธ์ระหว่างรูปแบบ JSON ทั่วไปทั้งสี่แบบกับเอนด์พอยต์เดียว:
| ลวดลาย | สั่งการ | ควรใช้เมื่อใด |
|---|---|---|
| แบบอินไลน์ คลาสสิก | `-X POST -H "Content-Type: application/json" -d '{"k":"v"}'` | รองรับการใช้งานสูงสุดกับ curl ทุกเวอร์ชัน |
| แบบอินไลน์ ทันสมัย | `--json '{"k":"v"}'` | curl เวอร์ชัน 7.82.0 หรือใหม่กว่า ใช้ไวยากรณ์ที่สะอาดที่สุด |
| จากไฟล์ ปลอดภัย | `-X POST -H "..." -d @payload.json` | ข้อมูลที่ส่งไปจะถูกเก็บไว้ในระบบควบคุมเวอร์ชัน |
| จากไฟล์ ปลอดภัยต่อไฟล์ไบนารี | `-X POST -H "..." --data-binary @payload.json` | ไฟล์ขนาดใหญ่, เพย์โหลดที่มีการขึ้นบรรทัดใหม่ |
เรื่องนี้สำคัญกว่าแต่ก่อนมาก ผู้ให้บริการ LLM รายใหญ่ทุกราย ไม่ว่าจะเป็น OpenAI, Anthropic, Mistral หรือ Google ต่างก็เปิดเอกสาร API ด้วยตัวอย่างการใช้ curl POST โดยใช้รูปแบบนี้เป๊ะๆ ปริมาณการใช้งานที่ขับเคลื่อนด้วย AI เพิ่มขึ้น 73% เมื่อเทียบกับปริมาณการเรียกใช้ API โดยรวมในปี 2024 (Postman) ปัจจุบัน curl กลายเป็นแหล่งอ้างอิงหลักสำหรับคำถามที่ว่า "ฉันจะเรียกใช้เอนด์พอยต์นี้ได้อย่างไร"

Content-Type, ส่วนหัว และสิ่งที่ curl สมมติขึ้น
ข้อความตอบกลับ "415 Unsupported Media Type" ส่วนใหญ่เกิดจากส่วนหัวที่ขาดหายไปเพียงส่วนเดียว หากใช้ `-d` curl จะเพิ่มส่วนหัว `Content-Type: application/x-www-form-urlencoded` ลงในคำขอของคุณโดยไม่มีการแจ้งเตือนใดๆ แต่ถ้าส่งเนื้อหา JSON โดยไม่มี `-H "Content-Type: application/json"` หรือ `--json` คุณจะได้รับข้อความปฏิเสธ 415 กลับมาโดยไม่มีคำเตือนใดๆ
ข้อมูลเมตาอื่นๆ จะถูกส่งไปพร้อมกับเนื้อหาด้วย เช่น Content-Length, ส่วนหัว Authorization, X-Request-Id สำหรับการติดตาม การจัดการข้อมูลเมตาเหล่านี้ให้ถูกต้องเป็นครึ่งหนึ่งของการผสานรวม API ใดๆ ส่วนที่ง่ายกว่าคือตัวอ็อบเจ็กต์ JSON เอง
`-H` เพิ่มส่วนหัวแบบกำหนดเอง ทำซ้ำได้ตามต้องการ ชื่อส่วนหัวไม่คำนึงถึงตัวพิมพ์ใหญ่เล็ก แต่ค่าจะคำนึงถึง วิธีที่เร็วที่สุดในการแก้ไขข้อผิดพลาดในการตั้งค่า POST ที่ไม่ถูกต้องคือ เรียกใช้ด้วย `-v` หนึ่งครั้ง อ่านบรรทัดคำขอ แล้วเปรียบเทียบกับเอกสาร API โดยส่วนใหญ่แล้ว ข้อผิดพลาดจะปรากฏขึ้นภายในไม่กี่วินาที
มีข้อสังเกตเพิ่มเติมอีกสองข้อ ค่า Content-Length จะถูกตั้งค่าโดยอัตโนมัติโดย curl จากขนาดของ body คุณแทบจะไม่ต้องแก้ไขค่านี้เลย `Accept: application/json` คือสิ่งที่บอกให้เซิร์ฟเวอร์ตอบกลับในรูปแบบ JSON แทนที่จะเป็น HTML หากต้องการใช้รูปแบบนี้ ให้เพิ่ม `-H` อีกตัว หรือใช้ `--json` ซึ่งจะตั้งค่า Content-Type และ Accept ไปพร้อมกัน
ส่งข้อมูลฟอร์มและอัปโหลดไฟล์ด้วย curl POST -F
สำหรับข้อมูลฟอร์มแบบ HTML ที่มีไฟล์ ตัวเลือกที่ถูกต้องคือ `-F` ซึ่งจะสร้างคำขอแบบ `multipart/form-data` ประเภทเนื้อหาจะแตกต่างจากแบบ form-urlencoded ที่ `-d` เป็นค่าเริ่มต้น แนวคิดจึงแตกต่างกัน บทความแนะนำสั้นๆ มักจะสับสนระหว่างสองอย่างนี้จนทำให้เกิดข้อผิดพลาดขึ้นได้
กด `-F` ครั้งละหนึ่งช่อง ช่องข้อมูลแบบฟอร์มธรรมดา:
```
curl -F "name=Arya" https://api.example.com/submit
```
การอัปโหลดไฟล์:
```
curl -F "file=@/path/to/image.png" https://api.example.com/upload
```
คำนำหน้า `@` บอกให้ curl อ่านไฟล์จากดิสก์และรวมเนื้อหาไว้ในส่วนเนื้อหาของคำขอ curl จะตรวจจับประเภท MIME จากชื่อไฟล์โดยอัตโนมัติ หากต้องการ คุณสามารถกำหนดประเภท MIME เองได้
```
curl -F "[email protected];type=image/png" https://api.example.com/upload
```
การใช้แฟล็ก `-F` หลายตัวจะรวมฟิลด์หรือไฟล์หลายรายการไว้ในคำขอเดียว:
```
curl -F "title=Holiday" -F "[email protected]" -F "[email protected]" https://api.example.com/album
```
สำหรับการส่งเนื้อหาไฟล์ดิบโดยไม่ใช้ตัวห่อหุ้มแบบ multipart ซึ่งเป็นความต้องการทั่วไปเมื่อส่งไฟล์ JSON หรือข้อมูลไบนารีไปยังเอนด์พอยต์แบบสตรีมมิ่ง ให้ใช้ `--data-binary @file.bin` แทน วิธีนี้จะส่งไบต์ของไฟล์เป็นเนื้อหาคำขอโดยตรง พร้อมกับ Content-Type ที่คุณกำหนดไว้อย่างชัดเจน
การตรวจสอบสิทธิ์ใน curl POST: การตรวจสอบสิทธิ์แบบพื้นฐาน, การตรวจสอบสิทธิ์แบบ Bearer, คีย์ API
รูปแบบการตรวจสอบสิทธิ์สามแบบครอบคลุม API REST เกือบทั้งหมดในปี 2026 การตรวจสอบสิทธิ์แบบพื้นฐาน (ชื่อผู้ใช้และรหัสผ่าน เข้ารหัสแบบ base64 ในส่วนหัว):
```
curl -u "myuser:mypass" -X POST -d "..." https://api.example.com/login
```
โทเค็น Bearer ซึ่งใช้โดย API สมัยใหม่ส่วนใหญ่ รวมถึงข้อมูลประจำตัวที่ออกโดย OAuth ทั้งหมด จะใช้ส่วนหัว Authorization แบบกำหนดเอง:
```
curl -H "Authorization: Bearer $TOKEN" --json '{"q":"hello"}' https://api.example.com/query
```
โดยทั่วไปแล้ว คีย์ API จะอยู่ในส่วนหัวเฉพาะของแต่ละบริการ:
```
curl -H "X-API-Key: $PLISIO_KEY" --json @invoice.json https://api.plisio.net/api/v1/invoices/new
```
ข้อมูลรับรองจากตัวแปรสภาพแวดล้อมหรือตัวจัดการความลับ ไม่ควรพิมพ์โดยตรงในสคริปต์ ทำไม? รายงาน State of Secrets Sprawl ปี 2025 ของ GitGuardian พบว่ามีข้อมูลลับใหม่ 23.8 ล้านรายการรั่วไหลไปยัง GitHub สาธารณะในปี 2024 ซึ่งเพิ่มขึ้น 25% จากปี 2023 มากกว่า 90% ของข้อมูลลับเหล่านั้นยังคงใช้งานได้หลังจากถูกเปิดเผยไปแล้วห้าวัน การพิมพ์ข้อมูลรับรองโดยตรงในสคริปต์ curl เป็นแหล่งที่มาหลักของการรั่วไหลเหล่านี้ ส่วนความปลอดภัยด้านล่างจะอธิบายขั้นตอนการทำงาน
ตัวอย่างการใช้งานจริงของคำสั่ง curl POST: API การชำระเงินของ Plisio
เอกสารอ้างอิงที่ไม่มีตัวอย่างจริงก็เป็นเพียงทฤษฎีเท่านั้น คำสั่ง curl POST ด้านล่างนี้สร้างใบแจ้งหนี้การชำระเงินด้วยคริปโตผ่าน REST API ของ Plisio Plisio คิดค่าธรรมเนียมคงที่ 0.5% ในขณะที่ผู้ประมวลผลบัตรเครดิตโดยทั่วไปคิดค่าธรรมเนียม 2-4% Plisio รองรับคริปโตเคอร์เรนซีมากกว่า 30 สกุล และมีการเชื่อมต่อกับแพลตฟอร์มอีคอมเมิร์ซถึง 19 แพลตฟอร์ม
เหตุใด API คริปโตจึงเหมาะที่จะใช้เป็นเป้าหมายฝึกฝน Stablecoin มีปริมาณการซื้อขายจริงประมาณ 28 ล้านล้านดอลลาร์ในปี 2025 Chainalysis คาดการณ์การเติบโตที่ 133% ต่อปีตั้งแต่ปี 2023 ตลาดเกตเวย์การชำระเงินคริปโตมีมูลค่าเกือบ 2 พันล้านดอลลาร์ในปี 2025 และคาดว่าจะสูงถึง 2.39 พันล้านดอลลาร์ในปี 2026 (ตามข้อมูลจาก The Business Research Company) BitPay, Coinbase Commerce, Plisio: เลือกอันไหนก็ได้ ขั้นตอนแรกของการผสานรวมกับเกตเวย์สมัยใหม่ใดๆ ก็ตาม มักจะเป็นการใช้คำสั่ง curl POST เสมอ
คำสั่งขั้นต่ำในการสร้างใบแจ้งหนี้ใหม่:
```
curl -X POST https://api.plisio.net/api/v1/invoices/new \
-H "Content-Type: application/json" \
-H "การอนุญาต: ผู้ถือ $PLISIO_API_KEY" \
-d '{
"source_currency": "USD",
"source_amount": 49.99,
"order_number": "INV-1042",
"currency": "BTC",
"email": "[email protected]",
"order_name": "Annual subscription"
}'
```
การเรียกใช้งานสำเร็จจะส่งคืน HTTP 201 เนื้อหาการตอบกลับเป็นออบเจ็กต์ JSON ซึ่งประกอบด้วยรหัสใบแจ้งหนี้ที่สร้างขึ้น URL ใบแจ้งหนี้ที่ลูกค้าใช้ชำระเงิน ที่อยู่กระเป๋าเงินปลายทาง และเวลาหมดอายุ นำไปประมวลผลผ่าน `jq` เพื่อดึงฟิลด์ที่คุณต้องการต่อไป:
```
... | jq '.data.invoice_url'
```
นั่นคือรูปแบบทั้งหมด เปลี่ยนปลายทาง เปลี่ยนเพย์โหลด แล้วโครงสร้างก็จะยังคงเหมือนเดิม ไม่ว่าจะเป็นการชำระเงินผ่าน BitPay, Coinbase Commerce หรือ Stripe แฟล็กต่างๆ ไม่เปลี่ยนแปลง มีเพียงข้อมูล JSON เท่านั้นที่เปลี่ยนไป
การดีบักคำขอ POST ของ curl: -v, --trace, errors
การส่งคำขอ POST ที่ล้มเหลวเป็นปริศนาในการแก้ไขปัญหา การลองใหม่โดยไม่รู้ผลลัพธ์เป็นวิธีที่แย่ที่สุด ตัวเลือกสี่อย่างในบรรทัดคำสั่งครอบคลุมสิ่งที่คุณต้องการส่วนใหญ่แล้ว
`-v` จะพิมพ์บรรทัดคำขอ ส่วนหัวคำขอทั้งหมด และสถานะการตอบกลับ นี่คือตัวเลือกแรกที่คุณควรเลือกใช้ `--trace-ascii -` เป็นตัวเลือกที่ทรงพลังกว่า: มันจะแสดงการสนทนาทั้งหมด รวมถึงเนื้อหาของคำขอ POST ไปยังเอาต์พุตมาตรฐาน ใช้ `curl -i` เพื่อแทรกส่วนหัวการตอบกลับไว้เหนือเนื้อหา และ `-w "%{http_code}\n"` จะแสดงเฉพาะรหัสสถานะ HTTP ซึ่งมีประโยชน์เมื่อเขียนสคริปต์ตรวจสอบ CI กับ API
เกี่ยวกับรหัสสถานะที่คุณจะเห็นบ่อยที่สุด: 400: เซิร์ฟเวอร์ประมวลผลคำขอของคุณแล้ว แต่ปฏิเสธข้อมูลที่ส่งมา 401: ส่วนหัวการตรวจสอบสิทธิ์หายไปหรือไม่ถูกต้อง 415: ประเภทเนื้อหาไม่ถูกต้อง 500: เซิร์ฟเวอร์ล่มเนื่องจากข้อมูลที่คุณป้อนเข้า แต่ละรหัสจะตัดเลเยอร์เฉพาะออกไป ซึ่งมีประสิทธิภาพครึ่งหนึ่งของการใช้คำสั่ง `-v` ในความล้มเหลวครั้งแรก
ความปลอดภัยของ curl POST: คีย์ API, ข้อมูลลับ และการรั่วไหล
เอกสารอ้างอิงทุกฉบับข้ามส่วนนี้ไป แต่รายงานการวิเคราะห์หลังเกิดเหตุการณ์ทุกฉบับกลับกล่าวถึงส่วนนี้ ธันวาคม 2024: การละเมิดข้อมูลของกระทรวงการคลังสหรัฐฯ ถูกสืบย้อนไปถึงคีย์ API ของ BeyondTrust ที่รั่วไหล ซึ่งเป็นข้อมูลประจำตัวประเภทเดียวกับที่อยู่ในส่วนหัว `-H "Authorization: Bearer ..."` ในสคริปต์ที่ใช้งานจริง
วิธีการป้องกันนี้ดูไม่หวือหวา อ่านโทเค็นจากตัวแปรสภาพแวดล้อม จัดเก็บไว้ในตัวจัดการความลับ เช่น AWS Secrets Manager, HashiCorp Vault หรือ 1Password CLI ตั้งค่า pre-commit hook ให้ทำงานอยู่เสมอ เช่น `gitleaks` หรือ `trufflehog` หมุนเวียนโทเค็นใดๆ ก็ตามที่เคยอยู่ในประวัติคำสั่ง shell ทั้งหมดนี้ดูไม่น่าตื่นเต้น แต่ใช้งานได้จริง การนำไปใช้กับคำขอ curl POST ทุกครั้งที่คุณส่งออกไป คือนิสัยที่สำคัญที่สุดที่นักพัฒนาแบ็กเอนด์ควรสร้างขึ้นในปี 2026