3 điểm bởi GN⁺ 2024-01-30 | 1 bình luận | Chia sẻ qua WhatsApp

Sử dụng --libcurl

  • Khuyến nghị dùng libcurl: Người dùng được khuyến nghị trước tiên hãy dùng công cụ dòng lệnh curl để thử kiểu truyền tải mong muốn, và khi nó đã hoạt động gần đúng như ý thì chạy lại với tùy chọn --libcurl [tên_tệp] được thêm vào dòng lệnh.
  • Tạo mã: Tùy chọn dòng lệnh --libcurl sẽ tạo ra một chương trình C với tên tệp được cung cấp. Chương trình C này sử dụng libcurl để thực hiện việc truyền tải mà công cụ dòng lệnh curl đã thực hiện.
  • Ngoại lệ và khác biệt: Kết quả không phải lúc nào cũng khớp 100%, nhưng nó có thể mang lại nguồn cảm hứng rất tốt về các tùy chọn libcurl và các đối số bổ sung mà bạn muốn sử dụng.

Mã ví dụ

  • Ví dụ chạy: Khi chạy lệnh curl http://example.com --libcurl example.c, tệp example.c sẽ được tạo trong thư mục hiện tại.
  • Mã được tạo: Mã được sinh ra bao gồm nhiều thiết lập tùy chọn bằng curl_easy_setopt(), và một số tùy chọn không thể dễ dàng được tạo trực tiếp từ mã nguồn nên người dùng có thể phải tự triển khai hoặc không sử dụng.

Ý kiến của GN⁺

  • Tính hữu ích của libcurl: Tính năng này giúp các nhà phát triển dễ dàng chuyển một lệnh curl đang hoạt động trên dòng lệnh thành chương trình C, qua đó tăng tốc việc phát triển ứng dụng sử dụng libcurl.
  • Ưu điểm của việc tạo mã: Mã được tạo tự động có thể giúp nhà phát triển hiểu và áp dụng API của libcurl nhanh hơn.
  • Giá trị như một công cụ học tập: Đây có thể là tài liệu học tập tốt cho các kỹ sư phần mềm mới vào nghề để thấy các tùy chọn libcurl và những ví dụ áp dụng thực tế của lập trình mạng.

1 bình luận

 
GN⁺ 2024-01-30
Ý kiến trên Hacker News
  • Mẫu tìm đúng request mong muốn trong tab Network của công cụ dành cho nhà phát triển trên trình duyệt, sao chép bằng “copy as curl”, rồi chuyển đổi sang mã request của ngôn ngữ đang dùng bằng công cụ như https://curlconverter.com/ là cực kỳ hay
    Ở một khía cạnh nào đó, curl được dùng như một biểu diễn trung gian có thể dịch sang bất cứ đâu

    • Người dùng R có thể dùng hàm curl_translate của gói httr2, bản viết lại gần đây của httr, để chuyển lệnh “copy as curl” thành mã request
      https://httr2.r-lib.org/reference/curl_translate.html
    • curlconverter.com có vẻ hay đến mức đáng để lưu bookmark ngay
      “copy as curl” của trình duyệt lấy ra trạng thái mà các header xác thực và mã hóa chắc chắn đang hoạt động, nên tiện hơn nhiều so với việc tự mò chỉnh một lệnh curl nhiều dòng
    • Việc xử lý sự cố với API endpoint đã trở nên dễ hơn rất nhiều
      Có thể đổi tham số request để bắn sang instance cục bộ, hoặc pipe qua jq để tinh chỉnh định dạng đầu ra
    • Khi endpoint không chạy, việc bước đầu tiên là hỏi “curl có chạy không?” đúng là một nhận xét rất chuẩn
    • Bản thân HTTP không nhất thiết cần một biểu diễn trung gian, nhưng vì tính phổ quát của cURL nên trên thực tế nó hoạt động như vậy
      Vì được dùng quá rộng rãi nên có công cụ xuất request sang cURL, và cũng có công cụ nhập từ cURL
  • Việc giao diện dòng lệnh có một cờ để xuất ra mã nguồn chương trình thực hiện cùng công việc với lệnh hiện tại là khá ngầu
    Nó tạo cảm giác như mở nắp capo để thấy bên trong đang diễn ra chuyện gì, không chỉ giúp hiểu rõ hơn cách nó hoạt động mà còn dễ chỉnh sửa hoặc mở rộng theo nhu cầu

    • Nó cũng là tài liệu tuyệt vời cho thư viện lập trình
      Nếu đang dùng libcurl rồi cần thứ như range request, hoặc đã làm “copy as curl” từ tab Network của trình duyệt, thì chỉ cần chạy nó trên dòng lệnh rồi thêm --libcurl là có thể biết chính xác phải làm thế nào với thư viện C
    • Sẽ rất hay nếu cách này cũng áp dụng cho thiết lập Gnome, thiết lập mạng, GUI cấu hình tường lửa, và mọi thứ có thể vận hành bằng lệnh CLI
  • Cách làm này từng là một trong những lý do macro Visual Basic của Microsoft Office thành công
    Có thể thực hiện thao tác trong Word hoặc Excel, xem macro được tạo ra, rồi sửa mã theo nhu cầu. Đó là một ý tưởng đơn giản nhưng mạnh mẽ, nên thật vui khi thấy nó trong curl

    • Microsoft cũng từng tạo một công cụ hữu ích tương tự, cho phép xem cấu trúc của một tài liệu Office cụ thể và thấy mã C# dùng để tạo ra các thành phần của nó
      Có vẻ đã không được cập nhật từ lâu: https://github.com/dotnet/Open-XML-SDK/releases/tag/v2.5
    • Có vẻ đây là kiểu thứ có thể có một mẫu hình khái quát hơn
      Cũng gợi nhớ đến AREXX của Amiga
    • Nó cũng làm nhớ tới phiên bản song song phía Excel của XAML/UI từng thấy trong trình chỉnh sửa WPF của Visual Studio
  • Để biên dịch thì phải chỉ ra việc liên kết với libcurl, kiểu như thêm -lcurl trong gcc
    Ví dụ, có thể tạo địa chỉ IP và ip_fetcher.c bằng curl https://ifconfig.me --libcurl ip_fetcher.c, rồi biên dịch bằng gcc -o ip_fetcher ip_fetcher.c -lcurl, sau đó chạy ./ip_fetcher để in ra địa chỉ IP
    Với những người không viết mã C hằng ngày, ngay cả bước liên kết cơ bản này cũng là thông tin hữu ích

    • Nếu thấy make tiện hơn là tự gõ lệnh cc, thì còn có cách dễ hơn
      Sau curl https://ifconfig.me --libcurl ip_fetcher.c chỉ cần chạy make LDFLAGS=-lcurl ip_fetcher, rồi ./ip_fetcher
  • Nhân tiện quảng bá một chút, Hurl là CLI mã nguồn mở dùng libcurl để thực thi và kiểm thử các HTTP request bằng văn bản thuần
    Nó tận dụng độ tin cậy cao của libcurl và các tính năng như HTTP/3, đồng thời bổ sung khả năng nối chuỗi request, lấy dữ liệu từ response rồi chuyển sang request tiếp theo, cùng các tính năng kiểm thử response như JSONPath và XPath
    Có thêm cú pháp tiện lợi cho request API REST/SOAP/GraphQL, nhưng cốt lõi vẫn chỉ là libcurl, và nếu bật tùy chọn verbose thì còn có thể grep cả lệnh curl. Tôi có tham gia với tư cách maintainer
    https://hurl.dev

  • Sẽ hay biết mấy nếu ffmpeg cũng làm được kiểu này

  • Daniel Stenberg thực sự rất chăm chút đến chi tiết và trải nghiệm của nhà phát triển lẫn người dùng
    Mức độ trau chuốt này thật đáng kinh ngạc

  • Tôi nhớ chính Daniel Stenberg từng nhắc đến tùy chọn này trong một video dài 3 tiếng nơi ông đi qua hầu hết các tùy chọn dòng lệnh của curl
    https://www.youtube.com/watch?v=V5vZWHP-RqU

  • Tiêu đề bài gửi nên là hai dấu gạch nối (--), không phải tổ hợp dấu gạch ngang dài và gạch nối (—-)

    • Có thể gửi email cho quản trị viên qua liên kết Contact ở footer để họ xem và sửa lại
  • Tùy chọn này có nghĩa là nó có thể tạo ra một chương trình C có thể biên dịch để thay thế script vốn bọc quanh lệnh gọi curl ban đầu sao?

    • Đúng vậy. Vốn dĩ có thể làm việc đó bằng libcurl, nhưng trước giờ phải tự viết mã khung
    • Ý tưởng là có thể sao chép rồi dán mã C được tạo ra vào chương trình hiện có, hoặc ít nhất dùng nó làm tài liệu tham khảo để biết cần những lời gọi API libcurl nào nhằm tái hiện đúng lệnh curl đó
    • Để dùng hữu ích cho các trang web thông thường hay tương tự, nhiều khả năng vẫn phải chỉnh vài tham số
      Đúng hơn nên xem nó là điểm khởi đầu giúp khỏi phải lục tài liệu hàng giờ đồng hồ