ตัวแปลง cURL เป็นโค้ด
อินพุตคำสั่ง cURL
วางคำสั่ง cURL ระบบจะแยกวิเคราะห์ URL, เมธอด, ส่วนหัว และเนื้อหาคำขอโดยอัตโนมัติ แล้วสร้างโค้ดที่รันได้ใน 11 ภาษา/ไลบรารี (JavaScript fetch, Axios, Node fetch, Python requests/httpx, Go net/http, PHP cURL, Java OkHttp, C# HttpClient, PowerShell Invoke-RestMethod, wget)
คำขอที่แยกวิเคราะห์แล้ว
โค้ดที่สร้าง
วางคำสั่ง curl รับโค้ดคำขอ HTTP ที่รันได้ใน 11 ภาษาในพริบตา
คำแนะนำที่เกี่ยวข้อง
กรณีการใช้งาน
- ในแผง Network ของ Chrome DevTools คลิกขวาที่คำขอแล้วเลือก「Copy as cURL」จากนั้นวางลงในเครื่องมือนี้เพื่อแปลงเป็นโค้ดภาษาที่โปรเจกต์ใช้โดยตรง เร็วกว่าการเขียนคำขอด้วยตนเอง 10 เท่า
- เมื่อเรียกใช้ API ของบุคคลที่สาม เอกสารให้ตัวอย่าง curl แปลงเป็นโค้ด Python requests/Java OkHttp/C# HttpClient อย่างรวดเร็วเพื่อฝังในโปรเจกต์
- เมื่อดีบั๊กอินเทอร์เฟซในสภาพแวดล้อมการผลิต คัดลอกคำสั่ง curl จากเครื่องมือดักจับแพ็กเกจ (Charles/mitmproxy/Wireshark) แล้วแปลงเป็นโค้ด unit test เพื่อตรวจสอบโดยตรง
- เมื่อเขียนเอกสาร API สลับไปมาระหว่างตัวอย่างหลายภาษาอย่างรวดเร็ว เพื่อให้โค้ดตัวอย่างที่รันได้สำเร็จแก่ผู้อ่านในสแตกเทคโนโลยีต่างๆ
- เมื่อตรวจสอบปัญหาคำขอออนไลน์ ใช้ curl ทำซ้ำปัญหาแล้วแปลงเป็นรูปแบบโค้ดส่งให้เพื่อนร่วมงานหรือสร้าง Issue เพื่อให้ผู้อื่นทำซ้ำได้โดยตรง
- เมื่อพัฒนาข้ามภาษา (เช่น ย้ายจาก Python ไปโปรเจกต์ Go) แปลงคำขอ curl ที่มีอยู่เป็นโค้ดเรียก HTTP client ภาษาใหม่อย่างรวดเร็ว ประหยัดเวลาในการค้นเอกสาร
- ในสคริปต์ Shell แปลงคำสั่ง curl เป็น PowerShell Invoke-RestMethod ให้เพื่อนร่วมงานฝั่ง Windows หรือแปลงในทางกลับกัน
- เรียนรู้โปรโตคอล HTTP: เปรียบเทียบโค้ดที่ใช้คำขอเดียวกันในภาษาต่างๆ เพื่อทำความเข้าใจความแตกต่าง API ของไลบรารี HTTP client แต่ละตัว
- แปลง curl -X POST -d 'json' เป็นโค้ดที่มี Content-Type และ JSON serialization ที่ถูกต้องอย่างรวดเร็ว หลีกเลี่ยงข้อผิดพลาดจากการต่อสตริงด้วยตนเอง
- เมื่อต้องเรียก API ในสคริปต์ CI/CD แปลงคำสั่ง curl ที่ดีบั๊กในเครื่องเป็นโค้ดภาษาสคริปต์ที่เกี่ยวข้องเพื่อฝังใน pipeline
วิธีการใช้งาน
- รับคำสั่ง curl: ในแผง DevTools Network ของเบราว์เซอร์ คลิกขวาที่คำขอ → Copy → Copy as cURL (bash); หรือส่งออก cURL จากเครื่องมือดักจับแพ็กเกจเช่น Postman/Charles/mitmproxy; หรือเขียนคำสั่ง curl ด้วยตนเอง
- วางลงในช่องป้อนข้อมูล: วางคำสั่ง curl ลงในพื้นที่ป้อนข้อมูลด้านบน รองรับคำสั่งบรรทัดเดียว/หลายบรรทัด (แบ็กสแลชต่อบรรทัด) ลบการขึ้นบรรทัดใหม่โดยอัตโนมัติ
- คลิกปุ่มตัวอย่างเพื่ออ้างอิง: หากไม่คุ้นเคยกับรูปแบบ สามารถคลิก「ตัวอย่าง 1/2/3」เพื่อโหลดคำสั่ง curl ที่ตั้งไว้ล่วงหน้าและดูผลลัพธ์
- ดูผลการแยกวิเคราะห์: พื้นที่ผลการแยกวิเคราะห์จะแสดง URL, จำนวน Header, จำนวนตัวอักษรของ Body และป้ายสถานะเช่น การบีบอัด/การเปลี่ยนเส้นทาง/ข้ามใบรับรอง/Basic Auth หากมีปัญหาจะแสดงคำเตือนสีส้ม
- ปรับ method หากจำเป็น: หาก method ที่จดจำอัตโนมัติไม่ถูกต้อง (เช่น curl ไม่ได้เติม -X POST แต่ควรเป็น POST) ให้เปลี่ยน HTTP method ในดรอปดาวน์ด้วยตนเอง
- เลือกภาษาเป้าหมาย: ในพื้นที่โค้ดเป้าหมาย คลิกปุ่มภาษาที่ต้องการ (fetch/Axios/Python requests/Go/PHP/Java/C#/PowerShell/wget ฯลฯ)
- คัดลอกโค้ด: คลิกปุ่ม「คัดลอกโค้ด」วางลงในโปรเจกต์/เทอร์มินัลแล้วรันได้
คุณสมบัติ
- 11 ภาษา/ไลบรารีเป้าหมาย: ครอบคลุมฟรอนต์เอนด์ (JS fetch/Axios), Node.js (node-fetch), Python (requests/httpx), Go (net/http), PHP (cURL), Java (OkHttp), C# (HttpClient), PowerShell (Invoke-RestMethod), บรรทัดคำสั่ง (wget) ครอบคลุมสแตกเทคโนโลยีหลักทั้งหมด
- แยกวิเคราะห์คำสั่ง curl อย่างชาญฉลาด: จดจำ URL, HTTP method, ส่วนหัว, เนื้อหาคำขอโดยอัตโนมัติ รองรับอัญประกาศเดี่ยว/คู่, การหลีกเลี่ยงด้วยแบ็กสแลช, การต่อคำสั่งหลายบรรทัด (แบ็กสแลชขึ้นบรรทัดใหม่)
- รองรับพารามิเตอร์ curl ที่ใช้บ่อยครบถ้วน: -X/--request ระบุ method, -H/--header ส่วนหัว, -d/--data/-F ฟอร์ม/เนื้อหา JSON, -u/--user Basic Auth, -A/--user-agent UA, -b/--cookie Cookie, -e/--referer Referer, -L/--location ติดตามการเปลี่ยนเส้นทาง, --compressed แตกไฟล์อัตโนมัติ, -k/--insecure ข้ามการตรวจสอบใบรับรอง, -I/--head คำขอ HEAD
- จดจำเนื้อหา JSON อย่างชาญฉลาด: เมื่อตรวจพบ Content-Type เป็น application/json จะใช้ JSON.parse/JSON.stringify/requests(json=)/json= ทำซีเรียไลซ์โดยอัตโนมัติ โค้ดที่สร้างใช้อ็อบเจ็กต์โดยตรงแทนสตริง สอดคล้องกับหลักการของแต่ละภาษา
- แปลง Basic Auth โดยอัตโนมัติ: เมื่อจดจำ -u user:pass จะสร้างส่วนหัว Authorization: Basic <base64> โดยอัตโนมัติ ใช้กลไก auth ดั้งเดิมของภาษาเป้าหมาย (Python auth=, OkHttp credentials, C# credentials ฯลฯ)
- ป้ายสถานะความปลอดภัย: ตรวจพบพารามิเตอร์ --compressed/-L/-k/-u โดยอัตโนมัติ แสดงด้วยป้ายสัญลักษณ์ที่เด่นชัดในผลการแยกวิเคราะห์
- เปลี่ยน HTTP method ด้วยตนเองได้: หลังจากแยกวิเคราะห์ method ของ curl แล้ว ผู้ใช้สามารถเปลี่ยน method ในดรอปดาวน์ได้ด้วยตนเอง (7 วิธี เช่น GET/POST/PUT) และเห็นโค้ดที่เกี่ยวข้องทันที
- การหลีกเลี่ยงสตริงปลอดภัย: เมื่อสร้างโค้ดแต่ละภาษา ใช้สตริงลิเทอรัลดั้งเดิมของภาษา (Python triple quote/แบ็กสแลช, Go backtick raw string, C# @"", PHP single quote, Java double quote escape) เพื่อหลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์เมื่อรันโค้ด
- คำเตือนข้อผิดพลาดในการแยกวิเคราะห์: เมื่อป้อนคำสั่ง curl ที่ไม่ถูกต้อง (เช่น ขาด URL, ไม่ได้ขึ้นต้นด้วย curl, POST ไม่มี body ฯลฯ) จะแสดงป้ายเตือนสีส้มพร้อมรายละเอียดปัญหา
- โหลดตัวอย่าง 3 แบบในคลิกเดียว: มีตัวอย่างทั่วไป 3 แบบคือ GET+Token Auth, POST+JSON, Basic Auth+ติดตามการเปลี่ยนเส้นทาง เพื่อดูความสามารถของเครื่องมือได้อย่างรวดเร็ว
- ล้างข้อมูลในคลิกเดียว: ปุ่ม Clear รีเซ็ตอย่างรวดเร็ว วางคำสั่งใหม่โดยไม่มีข้อมูลค้าง
- ประมวลผลในเครื่องทั้งหมด: คำสั่ง curl และเนื้อหาคำขอทั้งหมดถูกแยกวิเคราะห์และแปลงในเบราว์เซอร์ในเครื่อง ไม่อัปโหลดไปยังเซิร์ฟเวอร์ใดๆ Token/รหัสผ่านที่ละเอียดอ่อนจะไม่รั่วไหล
- คัดลอกโค้ดในคลิกเดียว: หลังจากสร้างโค้ดแล้ว คลิกปุ่ม Copy เพื่อคัดลอกไปยังคลิปบอร์ด วางลงในโปรเจกต์แล้วรันได้ทันที
- รองรับโหมด HTTPS ไม่ปลอดภัย: พารามิเตอร์ -k/--insecure สร้างการตั้งค่าข้ามการตรวจสอบใบรับรอง TLS ที่เกี่ยวข้องในแต่ละภาษา เช่น Node/Go/Python/PHP/C#/PowerShell (wget ใช้ --no-check-certificate, C# แจ้ง ServicePointManager, Node ตั้งค่า NODE_TLS_REJECT_UNAUTHORIZED)
คำถามที่พบบ่อย
เครื่องมือแปลง cURL เป็นโค้ดมีประโยชน์อย่างไร?ทำไมไม่ใช้คำสั่ง curl โดยตรง?
การเรียกใช้คำสั่ง curl โดยตรงในโค้ด (เช่น shell_exec, subprocess.run) ต้องเริ่มโพรเซสลูก ซึ่งไม่ปลอดภัยและยากต่อการจัดการข้อผิดพลาด รับส่วนหัวการตอบกลับ แปลงประเภท โค้ดการผลิตควรใช้ HTTP client ดั้งเดิมของภาษาโปรแกรม (Python requests, Java OkHttp, JS fetch ฯลฯ) คุณค่าของ curl-to-code คือการแปลคำสั่ง curl ที่คุณคัดลอกจาก DevTools/เครื่องมือดักจับแพ็กเกจเป็นโค้ด HTTP client ของภาษาที่เกี่ยวข้องโดยอัตโนมัติ ประหยัดแรงงานเชิงกลเช่น ค้นเอกสาร API, หลีกเลี่ยงอัญประกาศด้วยตนเอง, จัดการ JSON/การยืนยันตัวตน ฯลฯ เพียงคัดลอกวางก็รันได้
รองรับภาษา/ไลบรารีเป้าหมายใดบ้าง?
ปัจจุบันรองรับ 11 เป้าหมาย: JavaScript fetch (ดั้งเดิมของเบราว์เซอร์), Axios (ไลบรารี HTTP ทั่วไป Node/เบราว์เซอร์), Node.js node-fetch, Python requests (ไลบรารี HTTP ที่ได้รับความนิยมมากที่สุดของ Python), Python httpx (ไลบรารี HTTP รุ่นใหม่ที่รองรับ HTTP/2 และอะซิงโครนัส), Go net/http (ไลบรารีมาตรฐานของ Go), ส่วนขยาย PHP cURL, Java OkHttp (ไลบรารีประสิทธิภาพสูงสำหรับ Android/แบ็กเอนด์), C# HttpClient (ไคลเอนต์ HTTP มาตรฐาน .NET), PowerShell Invoke-RestMethod (ใช้บ่อยในสคริปต์อัตโนมัติ Windows), wget (เครื่องมือดาวน์โหลดบรรทัดคำสั่ง) หากภาษาที่คุณต้องการไม่อยู่ในรายการ (เช่น Ruby, Rust reqwest, Dart http, Swift URLSession ฯลฯ) สามารถติชมได้ที่หน้าเว็บ เราจะพิจารณาเพิ่มตามความต้องการ
จะคัดลอกคำสั่ง curl จาก Chrome DevTools ได้อย่างไร?
ขั้นตอน: 1. เปิด Chrome/Edge กด F12 เพื่อเปิด DevTools; 2. สลับไปที่แผง Network; 3. รีเฟรชหน้าหรือเรียกใช้คำขอเป้าหมาย; 4. ค้นหาคำขอเป้าหมายในรายการคำขอ (สามารถกรองด้วย XHR/JS); 5. คลิกขวาที่คำขอนั้น → Copy → เลือก「Copy as cURL (bash)」(แนะนำเวอร์ชัน bash เนื่องจากเข้ากันได้ดีที่สุด); 6. วางลงในช่องป้อนข้อมูลของเครื่องมือนี้ ระวังอย่าเลือก Copy as fetch (นั่นคือโค้ด JS ไม่ใช่ curl) การทำงานของ Firefox/Safari คล้ายกัน มีตัวเลือก Copy as cURL ทั้งหมด
การจัดการอัญประกาศในคำสั่ง curl ยุ่งยาก รองรับรูปแบบใดบ้าง?
เครื่องมือรองรับอัญประกาศเดี่ยว, อัญประกาศคู่, การหลีกเลี่ยงแบ็กสแลชในรูปแบบ bash; อัญประกาศคู่+การหลีกเลี่ยง ^ ของ Windows cmd; การหลีกเลี่ยงแบ็กติกของ PowerShell สามารถจดจำได้เกือบทั้งหมด แนะนำให้ใช้รูปแบบ bash (ห่อด้วยอัญประกาศเดี่ยว) คำสั่งหลายบรรทัด (แบ็กสแลช \ ต่อบรรทัด) ก็รองรับการวางเช่นกัน เครื่องมือจะลบการขึ้นบรรทัดใหม่และอักขระต่อบรรทัดโดยอัตโนมัติ หากคำสั่ง curl ของคุณซับซ้อนเป็นพิเศษ (มีตัวแปร shell, การแทนที่คำสั่ง $(...), ไปป์ | ฯลฯ) แนะนำให้เรียกใช้คำสั่ง echo ในเทอร์มินัลเพื่อพิมพ์ curl จริงหลังจากขยายแล้วจึงคัดลอก หรือทำให้ง่ายขึ้นด้วยตนเองก่อน (แทนที่ตัวแปรด้วยค่าจริง)
ทำไมเมื่อใช้ -d ส่ง JSON ใน curl เซิร์ฟเวอร์จึงได้รับข้อมูลอ่านไม่ออก/400?
นี่เป็นหนึ่งในข้อผิดพลาด curl ที่พบบ่อยที่สุด ตัวเลือก -d/--data ของ curl มี Content-Type เริ่มต้นเป็น application/x-www-form-urlencoded (รูปแบบฟอร์ม) ไม่ใช่ application/json หากคุณใช้ curl -d '{"name":"demo"}' url โดยตรง เซิร์ฟเวอร์จะแยกวิเคราะห์ตามฟอร์ม (แยกวิเคราะห์ล้มเหลวหรือได้ข้อมูลว่าง) ต้องเติมส่วนหัว -H "Content-Type: application/json" อย่างชัดเจนจึงจะส่ง JSON ได้อย่างถูกต้อง เครื่องมือนี้จะให้คำเตือนสีส้มเมื่อตรวจพบ body แต่ไม่มี Content-Type
โค้ดที่สร้างสามารถคัดลอกไปรันได้โดยตรงหรือไม่?ต้องติดตั้ง dependency อะไรบ้าง?
โค้ดของภาษาส่วนใหญ่สามารถรันได้โดยตรงโดยใช้ไลบรารีมาตรฐาน (fetch/Go net/http/PHP cURL/C# HttpClient/PowerShell/wget เป็นในตัว) ไม่ต้องติดตั้งเพิ่มเติม อื่นๆ ต้องใช้ไลบรารีบุคคลที่สาม: Axios (ต้อง npm install axios), node-fetch (ต้อง npm install node-fetch, Node 18+ มี fetch ในตัวไม่ต้องติดตั้ง), Python requests (pip install requests), Python httpx (pip install httpx), Java OkHttp (ต้องเพิ่ม dependency okhttp3 ด้วย Maven/Gradle) โค้ดจะพิมพ์รหัสสถานะและข้อความการตอบกลับตามค่าเริ่มต้น คุณสามารถแก้ไขตรรกะการประมวลผลตามความจำเป็น
รองรับการอัปโหลดไฟล์ multipart/form-data (พารามิเตอร์ -F) หรือไม่?
รองรับพื้นฐาน: พารามิเตอร์ -F จะถูกจดจำว่าเป็นเนื้อหาคำขอ (body) แต่โค้ดที่สร้างในปัจจุบันจะประมวลผล @file เป็นสตริงตามตัวอักษรแทนที่จะเป็นการอัปโหลดไฟล์จริง การอัปโหลดไฟล์ต้องอ่านเนื้อหาไฟล์ในเครื่อง แต่ละภาษามีวิธีการจัดการที่แตกต่างกันมาก (JS ใช้ FormData/FormData.append, Python ใช้พารามิเตอร์ files=, Go ใช้ multipart.Writer) แนะนำให้อ้างอิงเอกสารการอัปโหลดไฟล์ของไลบรารีที่เกี่ยวข้องเพื่อปรับแก้บนพื้นฐานของโค้ดที่เครื่องมือสร้างขึ้น เวอร์ชันถัดไปจะปรับปรุงการรองรับ multipart
จะอัปโหลดคำสั่ง curl และข้อมูลที่ละเอียดอ่อนของฉันหรือไม่?
ไม่เลย กระบวนการแยกวิเคราะห์และสร้างโค้ดทั้งหมดเสร็จสมบูรณ์ 100% ในเบราว์เซอร์ของคุณในเครื่อง (JavaScript ล้วนๆ ฝั่งฟรอนต์เอนด์) คำสั่ง curl, Token/Cookie/รหัสผ่านในส่วนหัวคำขอ, ข้อมูลในเนื้อหาคำขอจะไม่ถูกส่งไปยังเซิร์ฟเวอร์ใดๆ คุณสามารถตัดการเชื่อมต่อเครือข่ายเพื่อใช้เครื่องมือนี้ได้ ไม่ต้องกังวลเกี่ยวกับการรั่วไหลของข้อมูลที่ละเอียดอ่อน
จะจัดการ -k/--insecure ข้ามการตรวจสอบใบรับรองในโค้ดแต่ละภาษาได้อย่างไร?
เมื่อตรวจพบพารามิเตอร์ -k เครื่องมือนี้จะสร้างการตั้งค่าข้ามการตรวจสอบใบรับรองที่เกี่ยวข้องสำหรับแต่ละภาษาเป้าหมาย: Python requests/httpx ใช้ verify=False; Node.js ตั้งค่า process.env.NODE_TLS_REJECT_UNAUTHORIZED='0'; Go สร้าง tls.Config{InsecureSkipVerify: true} แบบกำหนดเอง; PHP ตั้งค่า CURLOPT_SSL_VERIFYPEER=false และ CURLOPT_SSL_VERIFYHOST=0; Java OkHttp ต้องกำหนด TrustManager เอง (มีข้อคิดเห็นเตือนในโค้ด เนื่องจากโค้ดค่อนข้างยาว); C# สามารถกำหนด ServerCertificateCustomValidationCallback เอง; PowerShell ใช้ -SkipCertificateCheck (PS6+); wget ใช้ --no-check-certificate; fetch ของเบราว์เซอร์ไม่สามารถข้ามใบรับรองได้ (ข้อจำกัดความปลอดภัยของเบราว์เซอร์ มีข้อคิดเห็นอธิบายในโค้ด) หมายเหตุ: การตั้งค่าเหล่านี้มีไว้สำหรับการทดสอบพัฒนาในเครื่องเท่านั้น อย่าปิดใช้งานการตรวจสอบใบรับรองในสภาพแวดล้อมการผลิตอย่างแน่นอน
ทำไมโค้ด Go ที่สร้างจึงไม่ติดตามการเปลี่ยนเส้นทาง?เติม -L แล้วควรจะติดตามนะ?
พฤติกรรมเริ่มต้นของ net/http ของ Go คือไม่ติดตามการเปลี่ยนเส้นทาง (สอดคล้องกับพฤติกรรมเริ่มต้นของ curl ซึ่ง curl ต้องเติม -L อย่างชัดเจนจึงจะติดตาม) เมื่อเครื่องมือตรวจพบพารามิเตอร์ -L จะสร้าง client ว่างเปล่า (http.Client{} มีค่าเริ่มต้น CheckRedirect เป็น nil คือติดตามการเปลี่ยนเส้นทาง 10 ครั้ง); หากไม่เติม -L จะสร้าง client ที่ CheckRedirect ส่งคืน http.ErrUseLastResponse คือไม่ติดตามการเปลี่ยนเส้นทาง (สอดคล้องกับพฤติกรรมเมื่อ curl ไม่เติม -L) หากคุณต้องการให้ Go ติดตามการเปลี่ยนเส้นทางเสมอ สามารถใช้ http.DefaultClient หรือกำหนด Client{Timeout: ...} เองในโค้ดได้โดยตรง
จะจัดการคำขอที่ต้องเข้าสู่ระบบ/มี Cookie ได้อย่างไร?
มีสองวิธี: ①คัดลอก curl โดยตรงจาก DevTools ของเบราว์เซอร์ที่เข้าสู่ระบบแล้ว (แนะนำ): คลิกขวาที่คำขอ→Copy as cURL ด้วยวิธีนี้ cookie/header จะรวมอยู่โดยอัตโนมัติ วางและแปลงแล้วรันได้โดยตรง; ②ระบุค่า Cookie ด้วยตนเองใน curl ด้วย -b/--cookie (-b 'sessionid=abc; token=xyz'), ระบุ Basic Auth ด้วย -u/--user, ระบุ Bearer Token ด้วย -H "Authorization: Bearer xxx" เครื่องมือจะแปลงส่วนหัวเหล่านี้ตามเดิม หมายเหตุ: Cookie ที่คัดลอกจากเบราว์เซอร์มีอายุการใช้งาน อาจหมดอายุหลังจากผ่านไปสองสามชั่วโมงและต้องคัดลอกใหม่
ทำไมเนื้อหา JSON ใน Python requests จึงใช้พารามิเตอร์ json= แทน data=?
พารามิเตอร์ data ของไลบรารี Python requests จะเข้ารหัส dict ตาม application/x-www-form-urlencoded, ส่งสตริงตามเดิม ในขณะที่พารามิเตอร์ json จะซีเรียไลซ์ dict/รายการเป็นสตริง JSON อัตโนมัติ และตั้งค่าส่วนหัว Content-Type: application/json อัตโนมัติ (หากคุณไม่ได้ตั้งค่าด้วยตนเอง) เมื่อเครื่องมือนี้ตรวจพบ Content-Type มี application/json และ body เป็น JSON ที่ถูกต้อง จะแยกวิเคราะห์ JSON เป็น Python dict และใช้พารามิเตอร์ json= โดยอัตโนมัติ ทำให้โค้ดกระชับขึ้น ไม่ต้อง json.dumps ด้วยตนเอง และจะไม่ลืมส่วนหัว Content-Type body ที่ไม่ใช่ JSON (ฟอร์ม/XML/ข้อความธรรมดา) ใช้พารามิเตอร์ data= เพื่อส่งสตริงดั้งเดิม
คำสั่ง curl ยาวและมีส่วนหัวมาก จะทำอย่างไรเมื่อโค้ดที่สร้างมีส่วนหัวทั้งหมดติดมาด้วย?
คำสั่ง curl ที่คัดลอกจาก DevTools จะมีส่วนหัวจำนวนมากที่เบราว์เซอร์เพิ่มอัตโนมัติ (Host, Connection, Accept, Accept-Encoding, Accept-Language, Sec-Fetch-*, sec-ch-ua, Upgrade-Insecure-Requests ฯลฯ) ส่วนหัวเหล่านี้ส่วนใหญ่ในโค้ดไม่จำเป็นต้องตั้งค่าอย่างชัดเจน (HTTP client จะเพิ่มค่าเริ่มต้นที่เหมาะสมอัตโนมัติ เช่น Accept-Encoding, Connection, Host, Content-Length ฯลฯ) แนะนำให้ลบส่วนหัวที่ไม่จำเป็นด้วยตนเองหลังจากคัดลอกโค้ดที่สร้างขึ้น เก็บไว้อย่างน้อย: Content-Type, Authorization, Cookie (หากจำเป็น), ส่วนหัวธุรกิจที่กำหนดเอง ส่วนหัวที่มากเกินไปไม่เพียงแต่ทำให้โค้ดดูยุ่งเหยิง แต่ยังอาจทำให้พฤติกรรมผิดปกติ (เช่น ตั้งค่า Accept-Encoding อย่างชัดเจนแต่ไคลเอนต์จะไม่แตกไฟล์อัตโนมัติ)
รองรับพารามิเตอร์ HTTPS พรอกซี (-x/--proxy) หรือไม่?
ปัจจุบันพารามิเตอร์ HTTP พรอกซี (-x/--proxy) ยังไม่ได้รับการแปลงอัตโนมัติ การกำหนดค่าพรอกซีในแต่ละภาษามีความแตกต่างกันมาก (JS fetch ไม่มีการรองรับพรอกซีดั้งเดิมต้องใช้ Agent, Python ใช้พารามิเตอร์ proxies=, Go ผ่าน Transport.Proxy, PHP ใช้ CURLOPT_PROXY, C# ใช้ WebProxy, Java ใช้ OkHttpClient.Builder().proxy()) ส่วนหัวพรอกซี (การยืนยันตัวตนของพรอกซีเอง) ก็ต้องได้รับการจัดการแยกต่างหาก พารามิเตอร์ที่เกี่ยวข้องกับพรอกซีในเวอร์ชันปัจจุบันจะถูกละเลย คุณสามารถเพิ่มการตั้งค่าพรอกซีด้วยตนเองบนพื้นฐานของโค้ดที่สร้างขึ้น เวอร์ชันถัดไปจะปรับปรุงการรองรับพรอกซี
เมื่อเปรียบเทียบกับเครื่องมือออนไลน์เช่น curlconverter.com มีความแตกต่างอย่างไร?
เมื่อเปรียบเทียบกับเครื่องมือชื่อดังเช่น curlconverter.com จุดแข็งของ curl-to-code ของ GeekFormat คือ: ①ประมวลผลในเครื่องทั้งหมด (ตรรกะการประมวลผลของ curlconverter อยู่ที่ฝั่งเซิร์ฟเวอร์หรือไคลเอนต์) ไม่อัปโหลดข้อมูลจึงปลอดภัยกว่า; ②อินเทอร์เฟซภาษาไทยและคำอธิบายภาษาไทย เป็นมิตรกับนักพัฒนาไทย; ③โค้ดที่สร้างสอดคล้องกับการใช้งานจริงในการผลิตมากขึ้น (เช่น Python requests ใช้พารามิเตอร์ json= สำหรับ JSON body แทน data=, พฤติกรรมเริ่มต้นของ Go สอดคล้องกับ curl, C# จัดการ Content-Type อย่างถูกต้องโดยไม่ฮาร์ดโค้ด application/json); ④มีเอกสารเชิงลึก, FAQ, ตารางเปรียบเทียบ, การแก้ไขปัญหา ไม่เพียงแต่สร้างโค้ดแต่ยังช่วยให้คุณเข้าใจว่าทำไมถึงเขียนแบบนั้น; ⑤ฟรีไม่มีโฆษณา ไม่ต้องลงทะเบียนเข้าสู่ระบบ ไม่ต้องใช้เครือข่ายใดๆ ก็สามารถใช้งานได้
การแก้ไขปัญหา
หลังจากวางคำสั่ง curl แล้วแจ้ง「ไม่พบ URL」
ขาดคำสั่ง curl ก่อน URL (วางส่วนหัว HTTP มาโดยตรง) URL ถูกขึ้นบรรทัดใหม่แต่ไม่ได้ใช้แบ็กสแลชต่อบรรทัด เครื่องมือไม่สามารถจดจำ URL ที่ต่อหลายบรรทัดได้ URL มีอักขระพิเศษ (& ฯลฯ) ถูก shell ตัด URL อยู่ในอัญประกาศเดี่ยวแต่มีอัญประกาศเดี่ยวซ้อนกันโดยไม่ได้หลีกเลี่ยง
โค้ด Python requests ที่สร้างขึ้นรันแล้วส่งคืน 401/403
Cookie/Token หมดอายุ: เมื่อคัดลอก curl จาก DevTools Cookie จะมีผลในขณะนั้น แต่จะหมดอายุเมื่อเวลาผ่านไป ขาด User-Agent: API บางตัวตรวจสอบ User-Agent curl ที่คัดลอกจากเบราว์เซอร์จะมี UA ของเบราว์เซอร์ แต่โค้ดที่สร้างอาจเก็บไว้หรือสูญเสีย ขาดส่วนหัว Referer/Origin: การตรวจสอบป้องกันการลิงก์โดยตรง/CSRF บางตัวจะตรวจสอบส่วนหัวเหล่านี้ ไม่ได้ส่ง sessionid อย่างถูกต้อง: บางไซต์ต้องเข้าสู่ระบบเพื่อรับ Cookie ก่อนจึงจะส่งคำขอ
ส่งข้อมูล POST JSON แต่เซิร์ฟเวอร์ไม่ได้รับ
ขาดส่วนหัว Content-Type: application/json: ค่าเริ่มต้น Content-Type ของ curl -d คือ application/x-www-form-urlencoded ไม่ใช่ JSON อัญประกาศคู่ในสตริง JSON ไม่ได้หลีกเลี่ยง: Shell ต่างๆ (bash/cmd/PowerShell) จัดการอัญประกาศต่างกัน การคัดลอกผิดรูปแบบจะทำให้ JSON ไม่สมบูรณ์ JSON ในโค้ดที่สร้างถูกหลีกเลี่ยงสองครั้ง (อ็อบเจ็กต์ถูก JSON.stringify อีกครั้ง) มีตัวอักษรภาษาไทยใน Body แต่ไม่ได้เข้ารหัส
หลังจากรันโค้ดที่สร้างแล้วเกิดข้อผิดพลาดใบรับรอง SSL/TLS
ไซต์ HTTPS เป้าหมายใช้ใบรับรอง self-signed: curl เติม -k แล้วแต่โค้ดไม่ทำงาน (ตรวจสอบว่าสร้างการตั้งค่าข้ามใบรับรองแล้วหรือไม่) ไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม Node.js: เมื่อตรวจพบ -k จะสร้าง process.env.NODE_TLS_REJECT_UNAUTHORIZED='0' ต้องวางไว้ก่อนการเรียก fetch SSL Inspection (ใบรับรองคนกลาง) ของพรอกซีบริษัท: ต้องเพิ่มใบรับรองรากของบริษัทลงใน trust store แทนที่จะปิดใช้งานการตรวจสอบ verify=False ของ Python ใช้ได้กับ requests เท่านั้น urllib3 ชั้นล่างจะยังแจ้ง InsecureRequestWarning
ผลลัพธ์การตอบกลับของโค้ดที่สร้างแตกต่างจาก curl
ส่วนหัวที่เพิ่มอัตโนมัติหายไป: เบราว์เซอร์จะเพิ่มส่วนหัวเช่น Host/Connection/Accept/Accept-Encoding/Accept-Language/Sec-Fetch-* อัตโนมัติ การเก็บหรือไม่เก็บส่วนหัวเหล่านี้จะส่งผลต่อการตอบกลับ การจัดการการเปลี่ยนเส้นทางไม่สอดคล้องกัน: fetch ติดตามการเปลี่ยนเส้นทางตามค่าเริ่มต้น Go ไม่ติดตามตามค่าเริ่มต้น เครื่องมือนี้จะสร้างการตั้งค่าที่เกี่ยวข้องตามพารามิเตอร์ -L ความแตกต่างในการแตกไฟล์บีบอัด: เมื่อ --compressed ไลบรารีบางตัวต้องกำหนดค่าการแตกไฟล์อัตโนมัติอย่างชัดเจน HTTP/2 เทียบกับ HTTP/1.1: curl เจรจา HTTP/2 ตามค่าเริ่มต้น เซิร์ฟเวอร์เก่าบางตัวไวต่อเวอร์ชัน HTTP Cookie Jar: curl -b ส่ง Cookie ด้วยตนเองทุกครั้ง ไลบรารีบางตัวจะจัดการ Cookie อัตโนมัติทำให้ Cookie เปลี่ยนแปลงในการร้องขอหลายรอบ
คำสั่ง curl ที่คัดลอกมายาวเกินไปทำให้การวางถูกตัด/ผิดพลาด
ส่วนหัวคำขอมากเกินไป (เช่น เบราว์เซอร์เพิ่มส่วนหัวหลายสิบตัวอัตโนมัติ): ลบส่วนหัวที่ไม่จำเป็นด้วยตนเอง (ส่วนหัวที่ไม่จำเป็นเช่น sec-ch-ua, sec-fetch-*, Accept, Accept-Language ฯลฯ) ไฟล์ที่เข้ารหัส Base64/Body ใหญ่ทำให้คำสั่งยาวเกินไป: ใช้ --data-binary @file เพื่ออ่าน body จากไฟล์แทน ข้อจำกัดความยาวบรรทัดคำสั่ง Windows cmd (8191 ตัวอักษร): ใช้ PowerShell หรือคัดลอก curl รูปแบบ bash ภายใต้ WSL แทน ถูกตัดโดยอักขระว่างเมื่อคัดลอก: ตรวจสอบให้แน่ใจว่าคัดลอกจาก DevTools อย่างสมบูรณ์โดยคลิกขวา
อภิธานศัพท์
- cURL / curl
- เครื่องมือบรรทัดคำสั่งโอเพนซอร์สและไลบรารี libcurl สำหรับส่งคำขอโปรโตคอล HTTP/HTTPS/FTP ฯลฯ ผ่าน URL ในบรรทัดคำสั่ง เป็นเครื่องมือที่นักพัฒนาใช้บ่อยที่สุดสำหรับดีบั๊ก API
- HTTP method
- การกระทำของคำขอ HTTP ที่พบบ่อย ได้แก่ GET (อ่าน), POST (สร้าง), PUT (อัปเดตทั้งหมด), PATCH (อัปเดตบางส่วน), DELETE (ลบ), HEAD (รับส่วนหัว), OPTIONS (สอบถามความสามารถของเซิร์ฟเวอร์)
- ส่วนหัวคำขอ (Header)
- คู่คีย์-ค่าเมตาดาต้าในคำขอ HTTP เช่น Content-Type, Authorization, User-Agent, Cookie, Accept ฯลฯ ระบุใน curl ด้วย -H/--header
- เนื้อหาคำขอ (Body)
- ส่วนข้อมูลของคำขอ HTTP ใช้บ่อยใน POST/PUT/PATCH ระบุใน curl ด้วย -d/--data/--data-binary/-F รูปแบบที่พบบ่อย ได้แก่ JSON, form-urlencoded, multipart/form-data
- Content-Type
- ส่วนหัวคำขอ/การตอบกลับที่ระบุประเภทมีเดียของ body application/json หมายถึง JSON, application/x-www-form-urlencoded หมายถึงฟอร์มเข้ารหัส URL, multipart/form-data หมายถึงฟอร์มอัปโหลดไฟล์
- Basic Auth
- การยืนยันตัวตนพื้นฐาน HTTP ส่งชื่อผู้ใช้และรหัสผ่านผ่านส่วนหัว Authorization: Basic base64(user:pass) ระบุใน curl ด้วย -u user:pass
- Bearer Token
- วิธีการยืนยันตัวตนแบบโทเค็น ส่งผ่านส่วนหัว Authorization: Bearer <token> ใช้บ่อยใน JWT/OAuth2
- User-Agent
- ส่วนหัวคำขอที่ระบุประเภทไคลเอนต์ (เบราว์เซอร์/บอท/สคริปต์) curl ส่ง "curl/หมายเลขเวอร์ชัน" ตามค่าเริ่มต้น เว็บไซต์จำนวนมากจะบล็อก UA ที่ไม่ใช่เบราว์เซอร์ มักใช้ -A ระบุ
- Cookie
- คู่คีย์-ค่าที่เซิร์ฟเวอร์ส่งผ่าน Set-Cookie และเบราว์เซอร์ส่งกลับผ่านส่วนหัว Cookie ในคำขอต่อๆ ไป ใช้สำหรับการรักษาเซสชัน curl -b ส่ง Cookie, -c บันทึก Cookie
- Referer
- ส่วนหัวคำขอที่ระบุ URL ของหน้าที่มาของคำขอปัจจุบัน การตรวจสอบป้องกันการลิงก์โดยตรง/CSRF บางตัวจะตรวจสอบ ตั้งค่าด้วย curl -e
- การเปลี่ยนเส้นทาง (3xx)
- เมื่อเซิร์ฟเวอร์ส่งคืนรหัสสถานะ 301/302/303/307/308 จะบอกให้เบราว์เซอร์เปลี่ยนเส้นทางไปยัง URL ใหม่ curl ไม่ติดตามตามค่าเริ่มต้น เติม -L/--location เพื่อติดตาม
- --compressed
- ตัวเลือก curl เพิ่มส่วนหัว Accept-Encoding: deflate, gzip โดยอัตโนมัติและแตกไฟล์การตอบกลับอัตโนมัติ หากไม่ตั้งค่า การตอบกลับอาจเป็นข้อมูลบีบอัดที่อ่านไม่ออก
- -k/--insecure
- ตัวเลือก curl ข้ามการตรวจสอบใบรับรอง HTTPS ใช้สำหรับสภาพแวดล้อมทดสอบใบรับรอง self-signed เท่านั้น ห้ามใช้ในสภาพแวดล้อมการผลิต
- fetch API
- API คำขอ HTTP JavaScript ดั้งเดิมของเบราว์เซอร์ ส่งคืน Promise รองรับในเบราว์เซอร์สมัยใหม่ทั้งหมด
- Axios
- ไลบรารี HTTP client ยอดนิยมที่อาศัย Promise ใช้ได้ทั้งเบราว์เซอร์และ Node.js มี JSON serialization อัตโนมัติ, interceptor, การยกเลิก timeout
- OkHttp
- ไลบรารี HTTP client Java/Android จาก Square มีประสิทธิภาพสูง รองรับ HTTP/2, พูลการเชื่อมต่อ, GZIP โปร่งใส
- HttpClient (.NET)
- ไคลเอนต์ HTTP ที่แนะนำสำหรับ C#/.NET ในเนมสเปซ System.Net.Http เป็น API มาตรฐานของ .NET Core/.NET 5+
- Invoke-RestMethod
- cmdlet คำขอ HTTP ในตัวของ PowerShell 3.0+ แยกวิเคราะห์การตอบกลับ JSON/XML เป็นอ็อบเจ็กต์ PowerShell อัตโนมัติ
ตารางเปรียบเทียบตัวเลือก curl ที่ใช้บ่อยกับ 11 ภาษาเป้าหมาย
| ตัวเลือก curl | หน้าที่ | JS fetch | Axios | Python requests | Go net/http | PHP cURL | Java OkHttp | C# HttpClient | PowerShell | wget |
|---|---|---|---|---|---|---|---|---|---|---|
| -X METHOD | ระบุ HTTP method | method: 'POST' | method: 'post' | requests.request('POST') | http.NewRequest('POST') | CURLOPT_CUSTOMREQUEST | .method() | HttpMethod.Post | -Method POST | --method=POST |
| -H 'K: V' | เพิ่มส่วนหัว | headers: {} | headers: {} | headers={} | req.Header.Set | CURLOPT_HTTPHEADER | .addHeader() | .Headers.TryAddWithoutValidation | $headers=@{} | --header= |
| -d 'data' | เนื้อหาคำขอ | body: data | data: data | data=/json= | strings.NewReader | CURLOPT_POSTFIELDS | RequestBody.create | new StringContent | -Body | --body-data= |
| -u user:pass | Basic Auth | ส่วนหัว Authorization | auth:{} | auth=(u,p) | req.SetBasicAuth | CURLOPT_USERPWD | Credentials.basic | new NetworkCredential | แปลงเป็น Header อัตโนมัติ | --user/--password |
| -L | ติดตามการเปลี่ยนเส้นทาง | redirect:'follow' | maxRedirects: N | allow_redirects=True | ค่าเริ่มต้น CheckRedirect | CURLOPT_FOLLOWLOCATION | .followRedirects | AllowAutoRedirect=true | ติดตามตามค่าเริ่มต้น | -L |
| -k | ข้ามการตรวจสอบใบรับรอง | เบราว์เซอร์ไม่รองรับ | httpsAgent | verify=False | TLSClientConfig | CURLOPT_SSL_VERIFYPEER=false | ต้องกำหนด TrustManager เอง | ServerCertificateCustomValidationCallback | -SkipCertificateCheck | --no-check-certificate |
| --compressed | ยอมรับการบีบอัด | รองรับตามค่าเริ่มต้น | แตกไฟล์อัตโนมัติ | แตกไฟล์อัตโนมัติ | ต้อง gzip ด้วยตนเอง | แตกไฟล์อัตโนมัติ | รองรับตามค่าเริ่มต้น | AutomaticDecompression | -TransferEncoding | ไม่แตกไฟล์ตามค่าเริ่มต้น |
| -A UA | User-Agent | ส่วนหัว User-Agent | headers | headers={} | req.Header.Set | CURLOPT_USERAGENT | .header() | ค่าเริ่มต้น | -UserAgent | --user-agent= |
| -b cookie | Cookie | ส่วนหัว Cookie | headers/withCredentials | cookies={} | req.Header.Set | CURLOPT_COOKIE | .header() | CookieContainer | -WebSession | --header= |
| -m SECS | timeout | AbortController | timeout:N | timeout=N | http.Client.Timeout | CURLOPT_TIMEOUT | .callTimeout | client.Timeout | -TimeoutSec | --timeout= |
ค่าที่พบบ่อยของ Content-Type และวิธีใช้ curl
| Content-Type | วัตถุประสงค์ | ตัวอย่าง curl | หมายเหตุ |
|---|---|---|---|
| application/json | ส่งข้อมูล JSON | curl -H 'Content-Type: application/json' -d '{"a":1}' | ประเภท API ที่ใช้บ่อยที่สุด -d จะไม่ตั้งค่าส่วนหัวนี้ตามค่าเริ่มต้น ต้องระบุ -H อย่างชัดเจน |
| application/x-www-form-urlencoded | ฟอร์มเข้ารหัส URL | curl -d 'name=a&age=1' | เมื่อ -d ไม่เติม -H จะเป็นประเภทนี้ตามค่าเริ่มต้น |
| multipart/form-data | อัปโหลดไฟล์ | curl -F 'file=@a.png' -F 'name=a' | -F ตั้งค่า Content-Type และ boundary นี้โดยอัตโนมัติ |
| text/plain | ข้อความธรรมดา | curl -H 'Content-Type: text/plain' -d 'hello' | ข้อความธรรมดา ใช้น้อยใน API |
| application/octet-stream | ข้อมูลไบนารี | curl --data-binary @file.bin | ใช้ --data-binary ส่งไบนารีดั้งเดิม |
| application/xml | ข้อมูล XML | curl -H 'Content-Type: application/xml' -d '<x/>' | ใช้ใน SOAP/API องค์กรเก่า |
การเปรียบเทียบสามรูปแบบของ Chrome DevTools Copy as cURL
| รูปแบบ | รูปแบบอัญประกาศ | อักขระหลีก | สถานการณ์ที่เหมาะสม |
|---|---|---|---|
| Copy as cURL (bash) | อัญประกาศเดี่ยว '...' | หลีกเลี่ยงอัญประกาศเดี่ยวด้วย \' | Linux/macOS/WSL/Git Bash แนะนำให้วางในเครื่องมือนี้ |
| Copy as cURL (cmd) | อัญประกาศคู่ "..." | หลีกเลี่ยงอักขระพิเศษด้วย ^ | พร้อมท์คำสั่ง Windows cmd.exe |
| Copy as cURL (PowerShell) | อัญประกาศคู่/แบ็กติก | หลีกเลี่ยงด้วย ` | Windows PowerShell 5/7 |
| Copy as fetch | JS template string | ไม่ต้องหลีกเลี่ยง | รันโดยตรงใน Console ของเบราว์เซอร์ |
- เครื่องมือสร้าง Authentication Header
- เครื่องมือวิเคราะห์ Cache-Control
- เครื่องมือวิเคราะห์ Content-Disposition
- เครื่องมือสร้าง CORS Header
- เครื่องมือตรวจสอบ CORS
- CSP Builder
- ตัวแปลง cURL เป็นโค้ด
- ตรวจสอบการแพร่กระจาย DNS ทั่วโลก
- ค้นหา DNS
- Forwarded Header Parser
- เครื่องมือสร้าง Hreflang Tag
- HSTS Analyzer
- ตัวแยกวิเคราะห์คุกกี้ HTTP
- HTTP Headers Checker
- HTTP Request Runner
- ค้นหารหัสสถานะ HTTP
- ค้นหา IP
- ตัวแปลง IPv4
- เครื่องมือขยายช่วง IPv4
- เครื่องมือจัดการที่อยู่ IPv6
- ตัวแยกวิเคราะห์ส่วนหัว Link
- ค้นหา MX Record
- ตรวจสอบพอร์ต
- สร้างพารามิเตอร์ URL
- ตัวแยกวิเคราะห์ส่วนหัว Rate Limit
- เครื่องมือตรวจสอบห่วงโซ่การเปลี่ยนเส้นทาง
- เครื่องมือสร้าง Robots.txt
- ตรวจสอบ Robots.txt
- ตรวจสอบส่วนหัวความปลอดภัย
- สร้าง Security.txt
- ตัวแยกวิเคราะห์ Set-Cookie
- ตรวจสอบเครือข่ายเว็บไซต์
- เครื่องมือสร้าง Sitemap
- ตรวจสอบ Sitemap
- ตัวตรวจสอบใบรับรอง SSL
- เครื่องคำนวณซับเน็ต
- ตัวแยกวิเคราะห์ URL
- ตัวแยกวิเคราะห์ User-Agent
- ตัวสร้างลิงก์ UTM
- ทดสอบ WebSocket
- What Is My IP?
- ค้นหา WHOIS