3 คะแนน โดย GN⁺ 2024-01-30 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

การใช้ --libcurl

  • แนะนำให้ใช้ libcurl: แนะนำให้ผู้ใช้ลองใช้เครื่องมือบรรทัดคำสั่ง curl เพื่อทดสอบการรับส่งข้อมูลที่ต้องการก่อน และเมื่อทำงานได้ใกล้เคียงตามต้องการแล้ว ให้รันอีกครั้งโดยเพิ่มตัวเลือก --libcurl [ชื่อไฟล์] ในบรรทัดคำสั่ง
  • การสร้างโค้ด: ตัวเลือกบรรทัดคำสั่ง --libcurl จะสร้างโปรแกรมภาษา C โดยใช้ชื่อไฟล์ที่ระบุ โปรแกรม C นี้จะใช้ libcurl เพื่อทำการรับส่งข้อมูลแบบเดียวกับที่เครื่องมือบรรทัดคำสั่ง curl ได้ทำไว้
  • ข้อยกเว้นและความแตกต่าง: แม้จะไม่ตรงกันแบบ 100% เสมอไป แต่ก็สามารถให้แรงบันดาลใจที่ยอดเยี่ยมเกี่ยวกับตัวเลือก libcurl และอาร์กิวเมนต์เพิ่มเติมที่ต้องการใช้งาน

โค้ดตัวอย่าง

  • ตัวอย่างการรัน: เมื่อรันคำสั่ง curl http://example.com --libcurl example.c จะมีการสร้างไฟล์ example.c ขึ้นในไดเรกทอรีปัจจุบัน
  • โค้ดที่สร้างขึ้น: โค้ดที่สร้างขึ้นจะมีการตั้งค่าตัวเลือกต่าง ๆ ด้วย curl_easy_setopt() และบางตัวเลือกอาจสร้างออกมาเป็นซอร์สได้ไม่ง่ายนัก ทำให้ผู้ใช้ต้องนำไปเขียนเองหรือเลือกที่จะไม่ใช้

ความเห็นของ GN⁺

  • ประโยชน์ของ libcurl: ฟีเจอร์นี้ช่วยให้นักพัฒนาสามารถแปลงคำสั่ง curl ที่ทำงานได้บนบรรทัดคำสั่งให้เป็นโปรแกรมภาษา C ได้อย่างง่ายดาย จึงช่วยเร่งการพัฒนาแอปพลิเคชันที่ใช้ libcurl
  • ข้อดีของการสร้างโค้ด: โค้ดที่สร้างขึ้นโดยอัตโนมัติสามารถช่วยให้นักพัฒนาเข้าใจและนำ libcurl API ไปใช้ได้รวดเร็วยิ่งขึ้น
  • คุณค่าในฐานะเครื่องมือการเรียนรู้: อาจเป็นสื่อการเรียนรู้ที่ดีสำหรับวิศวกรซอฟต์แวร์ระดับเริ่มต้น โดยช่วยให้เห็นตัวอย่างการใช้ตัวเลือกของ libcurl และการประยุกต์ใช้จริงของการเขียนโปรแกรมเครือข่าย

1 ความคิดเห็น

 
GN⁺ 2024-01-30
ความคิดเห็นจาก Hacker News
  • รูปแบบการใช้งานที่ดีมากคือ หา request ที่ต้องการในแท็บ Network ของเครื่องมือสำหรับนักพัฒนาในเบราว์เซอร์ แล้วคัดลอกด้วย “copy as curl” จากนั้นใช้เครื่องมืออย่าง https://curlconverter.com/ แปลงเป็นโค้ด request ของภาษาที่ใช้อยู่
    ในแง่หนึ่ง curl ถูกใช้เหมือน intermediate representation ที่แปลต่อไปเป็นอะไรก็ได้

    • ผู้ใช้ R สามารถแปลงคำสั่ง “copy as curl” เป็นโค้ด request ได้ด้วยฟังก์ชัน curl_translate ในแพ็กเกจ httr2 ซึ่งเป็นการเขียน httr ใหม่เมื่อไม่นานมานี้
      https://httr2.r-lib.org/reference/curl_translate.html
    • curlconverter.com ดูดีถึงขั้นควรบุ๊กมาร์กทันที
      “copy as curl” ของเบราว์เซอร์จะดึง header ด้านการยืนยันตัวตนและ encoding มาในสถานะที่ทำงานได้แน่นอน จึงสะดวกกว่าการมานั่งปรับคำสั่ง curl หลายบรรทัดเองมาก
    • ตอนแก้ปัญหา API endpoint ทำได้ง่ายขึ้นมาก
      จะเปลี่ยน request parameter แล้วยิงไปยัง local instance ก็ได้ หรือ pipe เข้า jq เพื่อจัดรูปแบบ output ก็ได้
    • เป็นข้อสังเกตที่ตรงจริง ๆ ว่าเวลา endpoint ใช้ไม่ได้ ขั้นแรกมักกลายเป็น “ใช้ curl แล้วได้ไหม?
    • ตัว HTTP เองไม่ได้ต้องการ intermediate representation แต่ด้วย ความแพร่หลายของ cURL ทำให้ในทางปฏิบัติมันทำหน้าที่แบบนั้น
      เพราะถูกใช้กว้างขวางมาก จึงมีทั้งเครื่องมือที่ export request ออกมาเป็น cURL และเครื่องมือที่ import cURL เข้าไป
  • การที่ command-line interface มี flag สำหรับพ่น source code ของโปรแกรม ที่ทำงานเหมือนคำสั่งปัจจุบันออกมาได้นั้นค่อนข้างเจ๋ง
    ให้ความรู้สึกเหมือนเปิดฝากระโปรงดูว่าข้างในเกิดอะไรขึ้น ไม่เพียงช่วยให้เข้าใจการทำงานดีขึ้น แต่ยังทำให้แก้ไขหรือขยายให้ตรงกับความต้องการได้ง่ายขึ้นด้วย

    • ใช้เป็นเอกสารของ programming library ได้ยอดเยี่ยมด้วย
      ถ้าใช้ libcurl แล้วต้องการอย่าง range request หรือถ้าใช้ “copy as curl” จากแท็บ Network ของเบราว์เซอร์ ก็สามารถรันบน command line แล้วเติม --libcurl เพื่อดูได้เลยว่าถ้าทำด้วย C library ต้องทำอย่างไรแบบเป๊ะ ๆ
    • ถ้าวิธีแบบนี้นำไปใช้กับ การตั้งค่า Gnome, การตั้งค่าเครือข่าย, GUI สำหรับตั้งค่า firewall และทุกอย่างที่ทำงานผ่านคำสั่ง CLI ได้ก็คงดี
  • วิธีแบบนี้เป็นหนึ่งในเหตุผลที่ มาโคร Visual Basic ของ Microsoft Office ประสบความสำเร็จ
    ผู้ใช้สามารถทำ action ใน Word หรือ Excel ดู macro ที่สร้างขึ้น แล้วแก้โค้ดให้ตรงกับความต้องการได้ เป็นแนวคิดที่เรียบง่ายแต่ทรงพลัง จึงดีใจที่ได้เห็นใน curl ด้วย

    • Microsoft ก็เคยทำเครื่องมือที่มีประโยชน์คล้ายกัน โดยให้ดูโครงสร้างของเอกสาร Office บางไฟล์ และดู โค้ด C# ที่สร้างส่วนประกอบเหล่านั้นได้
      ดูเหมือนไม่ได้อัปเดตมานานแล้ว: https://github.com/dotnet/Open-XML-SDK/releases/tag/v2.5
    • เรื่องแบบนี้น่าจะมี pattern ทั่วไปบางอย่างอยู่
      นึกถึง AREXX ของ Amiga ด้วย
    • ยังนึกถึง XAML/UI ฝั่ง Excel ที่ขนานกับสิ่งที่เคยเห็นใน WPF editor ของ Visual Studio ด้วย
  • หากจะคอมไพล์ ต้องบอกให้ gcc รู้ว่าจะ ลิงก์ libcurl เช่นใส่ -lcurl
    ตัวอย่างเช่น ใช้ curl https://ifconfig.me --libcurl ip_fetcher.c เพื่อสร้างที่อยู่ IP และ ip_fetcher.c จากนั้นคอมไพล์ด้วย gcc -o ip_fetcher ip_fetcher.c -lcurl แล้วรัน ./ip_fetcher ก็จะแสดงที่อยู่ IP
    สำหรับคนที่ไม่ได้เขียน C ทุกวัน ขั้นตอนการลิงก์พื้นฐานแบบนี้ก็เป็นข้อมูลที่มีประโยชน์

    • ถ้าสะดวกใช้ make มากกว่าพิมพ์คำสั่ง cc เอง ก็มีวิธีที่ง่ายกว่า
      หลัง curl https://ifconfig.me --libcurl ip_fetcher.c ให้รัน make LDFLAGS=-lcurl ip_fetcher แล้วตามด้วย ./ip_fetcher
  • ขอโปรโมตเล็กน้อย Hurl เป็นโอเพนซอร์ส CLI ที่ใช้ libcurl เพื่อรันและทดสอบ HTTP request ในรูปแบบ plain text
    มันใช้ความน่าเชื่อถือสูงของ libcurl และฟีเจอร์อย่าง HTTP/3 พร้อมเพิ่มความสามารถ เช่น เชื่อม request ต่อกัน, จับข้อมูลจาก response แล้วส่งต่อไปยัง request ถัดไป, และทดสอบ response ด้วย JSONPath/XPath
    มี syntax sugar สำหรับ request ของ REST/SOAP/GraphQL API ด้วย แต่แกนหลักก็เป็น libcurl ล้วน ๆ และถ้าใช้ verbose option ก็ grep คำสั่ง curl ได้ ผมมีส่วนร่วมในฐานะ maintainer
    https://hurl.dev

  • ถ้าฟีเจอร์แบบนี้ทำได้ใน ffmpeg ก็คงดี

  • Daniel Stenberg ใส่ใจรายละเอียดและประสบการณ์ของนักพัฒนา/ผู้ใช้อย่างพิถีพิถันจริง ๆ
    การขัดเกลาได้ถึงระดับนี้น่าทึ่งมาก

  • จำได้ว่า Daniel Stenberg เคยพูดถึง option นี้ใน วิดีโอความยาว 3 ชั่วโมง ที่ไล่ดู option ส่วนใหญ่ของ command line curl
    https://www.youtube.com/watch?v=V5vZWHP-RqU

  • ชื่อเรื่องที่ส่งควรเป็น ขีดกลางสองตัว (--) ไม่ใช่การผสมระหว่าง em dash แบบเต็มความกว้างกับ hyphen (—-)

    • ถ้าส่งอีเมลถึงผู้ดูแลผ่านลิงก์ Contact ใน footer เขาน่าจะเห็นและแก้ให้ได้
  • นี่หมายความว่า option นี้สร้าง โปรแกรม C ที่คอมไพล์ได้ ซึ่งใช้แทนสคริปต์ที่ wrap การเรียก curl เดิมได้หรือเปล่า?

    • ใช่ เดิมที libcurl ก็ทำได้อยู่แล้ว แต่ที่ผ่านมาต้องเขียน boilerplate code เอง
    • แนวคิดคือสามารถคัดลอกโค้ด C ที่สร้างขึ้นไปแปะในโปรแกรมเดิม หรืออย่างน้อยใช้เป็นเอกสารอ้างอิงเพื่อดูว่าหากต้องการสร้างการเรียก curl นั้นซ้ำ ต้องใช้ libcurl API call อะไรบ้าง
    • ถ้าจะนำไปใช้กับเว็บเพจทั่วไป ฯลฯ ก็น่าจะต้องแก้ parameter บางตัว
      ควรมองว่าเป็นจุดเริ่มต้นที่ช่วยไม่ให้ต้องค้นเอกสารอยู่นานหลายชั่วโมง