Chuyển lệnh cURL sang mã nguồn: fetch, axios, requests và cURL của PHP
Dán một lệnh cURL vào và công cụ đọc ra địa chỉ, phương thức, các tiêu đề cùng phần thân dữ liệu, rồi dựng lại thành bốn đoạn mã tương ứng ở bốn thẻ riêng. Mỗi đoạn có nút sao chép và đã được thụt lề sẵn để dán thẳng vào dự án, phù hợp khi bạn cầm một ví dụ cURL trong tài liệu API và cần đưa nhanh vào mã nguồn.
Tính năng nổi bật
- Đọc lệnh cURL và tách ra địa chỉ, phương thức, danh sách tiêu đề và phần thân dữ liệu
- Sinh đoạn mã dùng hàm fetch sẵn có của trình duyệt, kèm chuỗi xử lý kết quả và bắt lỗi
- Sinh đoạn mã dùng thư viện axios, có sẵn dòng nhập thư viện ở đầu
- Sinh đoạn mã Python dùng thư viện requests, tự đổi dấu nháy kép sang nháy đơn cho đúng thói quen Python
- Sinh đoạn mã PHP dùng bộ hàm cURL với đầy đủ các lệnh đặt tùy chọn
- Tự suy ra phương thức POST khi lệnh có phần thân dữ liệu mà không khai báo phương thức
- Hiểu được lệnh viết nhiều dòng nối bằng dấu gạch chéo ngược, đúng như khi chép từ tài liệu
- Nút sao chép riêng cho từng đoạn mã, và toàn bộ việc phân tích chạy trong trình duyệt
Vì sao cURL trở thành ngôn ngữ chung khi mô tả một lời gọi API
Gần như mọi tài liệu API đều lấy cURL làm ví dụ, và điều đó không phải ngẫu nhiên. Một lệnh cURL mô tả trọn vẹn một yêu cầu HTTP: địa chỉ, phương thức, từng tiêu đề, phần thân, không giấu gì trong thư viện hay khung nền nào. Nó chạy được trên mọi hệ điều hành và không phụ thuộc ngôn ngữ lập trình, nên viết một lần là mọi lập trình viên đọc được. Chính vì thế các công cụ dành cho nhà phát triển trong trình duyệt cũng cho phép sao chép một yêu cầu đã bắt được thành lệnh cURL, và các phần mềm kiểm thử API cũng xuất ra dạng đó. Vấn đề là khi bạn cần đưa nó vào dự án, việc gõ lại từng tiêu đề rất dễ sót, nhất là khi lệnh có năm sáu tiêu đề dài. Công cụ này rút ngắn khâu chép tay ấy. Nó không thay bạn hiểu lệnh, nhưng dựng sẵn bộ khung đúng cú pháp cho bốn môi trường hay dùng nhất, để bạn chỉ còn việc kiểm tra lại và sửa những chỗ đặc thù.
Lợi ích khi sử dụng
- Không phải gõ lại từng tiêu đề nên không sót dòng nào
- Có ngay bốn phiên bản để đối chiếu, tiện khi bạn đọc mã của người khác
- Bộ khung đúng cú pháp giúp người mới với một ngôn ngữ khỏi tra tài liệu từ đầu
- Chạy trong trình duyệt nên lệnh có chứa khóa không đi lên máy chủ nào
- Dùng được trực tiếp với lệnh sao chép từ tab Network của trình duyệt
Cách chuyển một lệnh cURL sang mã nguồn
- 1Chép lệnh cURL từ tài liệu API, từ phần mềm kiểm thử, hoặc bằng cách bấm chuột phải vào một yêu cầu trong tab Network của trình duyệt rồi chọn sao chép dạng cURL.
- 2Sắp lại lệnh sao cho địa chỉ đứng ngay sau chữ curl, vì bộ phân tích lấy phần tử đầu tiên sau chữ curl làm địa chỉ.
- 3Dán vào khung nhập, bốn thẻ mã nguồn hiện ra ngay bên dưới mà không cần bấm nút nào.
- 4Chọn thẻ tương ứng với ngôn ngữ bạn đang dùng và đọc lại đoạn mã, chú ý nhất là phần thân dữ liệu và các tiêu đề.
- 5Bấm sao chép, dán vào dự án rồi bổ sung những gì công cụ chưa dựng như xử lý mã trạng thái lỗi, thời gian chờ và biến môi trường chứa khóa.
Bộ phân tích đọc được gì và cần bạn sắp lệnh thế nào
Bộ phân tích nhận diện bốn thứ. Địa chỉ được lấy từ phần tử đầu tiên đứng sau chữ curl, nên bạn cần đặt địa chỉ ngay sau chữ đó thay vì để các tham số chen vào trước. Nếu lệnh của bạn viết theo kiểu chữ curl rồi tới tham số phương thức rồi mới tới địa chỉ, kết quả sẽ sai vì công cụ nhặt nhầm tham số làm địa chỉ. May là dạng lệnh sao chép từ tab Network của trình duyệt vốn đã đặt địa chỉ lên trước nên dùng được ngay. Phương thức được lấy từ tham số một chữ X viết hoa. Tiêu đề được lấy từ mọi tham số một chữ H viết hoa có nội dung nằm trong dấu nháy, tách theo dấu hai chấm đầu tiên, phần còn lại giữ nguyên nên tiêu đề chứa địa chỉ có dấu hai chấm vẫn đúng. Phần thân được lấy từ tham số một chữ d thường hoặc dạng viết dài. Ngoài ra công cụ tự thay các chỗ xuống dòng nối bằng dấu gạch chéo ngược thành khoảng trắng, nên lệnh nhiều dòng chép từ tài liệu vẫn xử lý được mà không phải gộp lại thủ công.
Chỗ dễ sai nhất là phần thân dữ liệu dạng JSON
Đây là điểm bạn phải kiểm tra bằng mắt sau khi chuyển. Cách viết phổ biến trong tài liệu API là bọc phần thân bằng dấu nháy đơn rồi bên trong là JSON dùng dấu nháy kép. Bộ phân tích trong công cụ tìm cặp dấu nháy quanh phần thân bằng một quy tắc đơn giản, nên khi gặp dấu nháy kép ngay bên trong nó dừng sớm và phần thân bị cắt cụt, đôi khi chỉ còn đúng một ký tự mở ngoặc. Hệ quả là bốn đoạn mã sinh ra vẫn đúng khung nhưng phần thân trống rỗng hoặc vô nghĩa. Cách xử lý nhanh nhất là để công cụ dựng khung rồi bạn tự dán lại phần thân từ lệnh gốc vào đúng chỗ: trong đoạn fetch là giá trị của khóa body, trong đoạn axios là giá trị của khóa data, trong đoạn Python là giá trị của tham số json, còn trong đoạn PHP là chuỗi truyền vào tùy chọn trường gửi đi. Một cách khác là tạm thay dấu nháy kép trong JSON bằng dấu nháy đơn trước khi dán vào, chuyển xong rồi đổi ngược lại trong mã nguồn.
Lệnh chạy được trên máy nhưng đoạn fetch lại bị chặn
Đây là khác biệt quan trọng nhất giữa cURL và mã chạy trong trình duyệt, và nó khiến rất nhiều người mất cả buổi để hiểu. cURL là một chương trình chạy trên máy, nó không có khái niệm nguồn gốc trang web nên không bị chính sách chia sẻ tài nguyên giữa các nguồn ràng buộc. Đoạn mã fetch hay axios chạy trong trình duyệt thì ngược lại: nếu máy chủ đích không trả về tiêu đề cho phép nguồn gốc của bạn, trình duyệt sẽ chặn phản hồi và bạn thấy lỗi dù yêu cầu đã đi tới nơi. Ngoài ra một số tiêu đề bị trình duyệt cấm đặt bằng mã, ví dụ tiêu đề nguồn gốc, tiêu đề trang giới thiệu và tiêu đề nhận diện trình duyệt; lệnh cURL đặt được nhưng đoạn mã tương ứng sẽ bị bỏ qua trong âm thầm. Cookie cũng khác: cURL gửi cookie khi bạn khai báo, còn fetch chỉ gửi cookie cùng nguồn theo mặc định và phải khai báo thêm mới gửi được cookie sang nguồn khác. Vì vậy nếu đích đến là API của bên thứ ba, hai đoạn mã Python và PHP thường là lựa chọn đúng hơn vì chúng chạy ở phía máy chủ.
Những gì cần thêm vào sau khi dán mã
Đoạn mã sinh ra là bộ khung tối thiểu, còn thiếu vài thứ mà bản chạy thật cần có. Thứ nhất là xử lý mã trạng thái lỗi. Hàm fetch không coi mã bốn trăm hay năm trăm là lỗi, chuỗi xử lý vẫn chạy tiếp và bạn nhận về một đối tượng lỗi thay vì dữ liệu, nên phải kiểm tra thuộc tính báo thành công trước khi đọc nội dung. Thư viện requests của Python cũng vậy, cần gọi thêm hàm ném lỗi theo trạng thái. Thứ hai là thời gian chờ. Không đặt thì một máy chủ treo sẽ giữ tiến trình của bạn vô hạn; requests có tham số thời gian chờ, PHP có tùy chọn tương ứng, còn fetch cần dùng cơ chế hủy bằng tín hiệu. Thứ ba là khóa bí mật. Đoạn mã chuyển ra chứa nguyên văn giá trị trong tiêu đề xác thực, đừng để nguyên như vậy trong kho mã nguồn mà hãy chuyển sang biến môi trường. Thứ tư là thử lại khi lỗi mạng, cần thiết với các lời gọi chạy nền ở tầng máy chủ.
Những tham số cURL công cụ chưa xử lý
Công cụ tập trung vào bốn thành phần hay gặp nhất, còn lại thì chưa đọc tới, và biết trước danh sách này giúp bạn khỏi mất công dò. Tham số xác thực cơ bản dạng tên người dùng và mật khẩu nối bằng dấu hai chấm không được nhận, bạn phải tự thêm phần xác thực tương ứng ở mỗi ngôn ngữ. Tham số gửi biểu mẫu nhiều phần dùng cho tải tệp lên cũng chưa được xử lý, và đây là phần khác biệt nhiều nhất giữa các ngôn ngữ nên dù có chuyển tự động bạn cũng phải viết lại. Các tham số về cookie, về bỏ qua kiểm tra chứng chỉ, về đi theo chuyển hướng, về nén nội dung và về thời gian chờ đều bị bỏ qua. Tham số mã hóa dữ liệu biểu mẫu cũng vậy. Ngoài ra công cụ chỉ đọc phần thân đầu tiên, nên lệnh có nhiều tham số dữ liệu nối tiếp nhau sẽ mất các phần sau. Cuối cùng, chiều ngược lại chưa có: công cụ không dựng lệnh cURL từ một đoạn mã nguồn.
Câu hỏi thường gặp (FAQ)
Công cụ chuyển được sang những ngôn ngữ nào?
Bốn dạng: hàm fetch sẵn có của trình duyệt, thư viện axios, thư viện requests của Python và bộ hàm cURL của PHP. Đây là bốn môi trường phổ biến nhất khi tích hợp API. Các ngôn ngữ khác như Go, Java hay C# chưa có, nhưng bạn có thể lấy đoạn Python làm mẫu vì nó thể hiện rõ nhất cấu trúc yêu cầu.
Vì sao dán lệnh vào mà công cụ báo không phân tích được?
Thường vì địa chỉ không nằm ngay sau chữ curl, ví dụ lệnh viết theo kiểu chữ curl rồi tới tham số phương thức rồi mới tới địa chỉ. Bộ phân tích lấy phần tử đầu tiên sau chữ curl làm địa chỉ, nên bạn hãy chuyển địa chỉ lên trước các tham số. Cách viết mà trình duyệt sinh ra khi sao chép từ tab Network vốn đã đúng thứ tự này.
Phần thân JSON của tôi bị cắt mất, xử lý thế nào?
Đó là hạn chế đã biết: bộ phân tích tìm cặp dấu nháy quanh phần thân bằng quy tắc đơn giản nên dừng sớm khi gặp dấu nháy kép bên trong. Cách nhanh nhất là để công cụ dựng khung rồi tự dán lại phần thân từ lệnh gốc vào đúng khóa tương ứng. Hoặc tạm thay dấu nháy kép thành nháy đơn trước khi dán rồi đổi ngược lại sau.
Lấy lệnh cURL từ trình duyệt bằng cách nào?
Mở công cụ dành cho nhà phát triển, sang tab Network, thực hiện thao tác cần bắt, bấm chuột phải vào dòng yêu cầu tương ứng rồi chọn mục sao chép dưới dạng cURL. Trên Windows nhớ chọn biến thể dành cho bash nếu có, vì biến thể cho cmd dùng cách bọc dấu nháy khác và sẽ khiến việc phân tích ở đây kém chính xác.
Đoạn mã fetch chạy trong trình duyệt lại báo lỗi trong khi cURL chạy được?
Gần như chắc chắn là do chính sách chia sẻ tài nguyên giữa các nguồn. cURL là chương trình chạy trên máy nên không bị ràng buộc này, còn trình duyệt sẽ chặn phản hồi nếu máy chủ đích không cho phép nguồn gốc của bạn. Cách xử lý là gọi API từ phía máy chủ của bạn rồi chuyển tiếp về, hoặc nhờ bên cung cấp API bổ sung tiêu đề cho phép.
Vì sao lệnh không khai báo phương thức mà mã sinh ra lại là POST?
Vì lệnh có phần thân dữ liệu. Chính cURL cũng hành xử như vậy: khi bạn truyền dữ liệu mà không nêu phương thức, nó tự chuyển sang POST. Công cụ giữ đúng quy ước đó để mã sinh ra khớp với hành vi thật của lệnh gốc. Nếu bạn cần một phương thức khác, hãy khai báo rõ bằng tham số phương thức trong lệnh.
Tham số xác thực dạng tên người dùng và mật khẩu có được chuyển không?
Chưa. Bạn phải tự thêm sau khi dán mã. Với axios và requests đều có tham số xác thực nhận một cặp giá trị, với PHP có tùy chọn tương ứng, còn với fetch thì phải tự dựng tiêu đề xác thực bằng cách mã hóa chuỗi tên người dùng và mật khẩu nối bằng dấu hai chấm theo kiểu Base64.
Lệnh tải tệp lên có chuyển được không?
Không. Tham số gửi biểu mẫu nhiều phần chưa được xử lý, và đây cũng là phần khác nhau nhiều nhất giữa các ngôn ngữ nên dù có chuyển tự động bạn vẫn phải viết lại. Với fetch bạn dựng đối tượng dữ liệu biểu mẫu, với requests bạn truyền tham số tệp, còn với PHP bạn tạo đối tượng tệp cURL cho từng phần.
Đoạn mã sinh ra đã bắt lỗi đầy đủ chưa?
Chưa. Nó chỉ có nhánh bắt lỗi ở mức mạng chứ không kiểm tra mã trạng thái. Hàm fetch không coi mã bốn trăm hay năm trăm là lỗi nên chuỗi xử lý vẫn chạy tiếp và bạn nhận về nội dung lỗi thay vì dữ liệu. Hãy tự thêm bước kiểm tra thuộc tính báo thành công, và với Python thì gọi thêm hàm ném lỗi theo trạng thái.
Lệnh của tôi có chứa khóa truy cập, dán vào đây có an toàn không?
Việc phân tích chạy hoàn toàn bằng JavaScript trong trình duyệt nên không có yêu cầu mạng nào mang lệnh của bạn đi. Dù vậy nên tập thói quen thay khóa thật bằng một chuỗi giả trước khi dán vào bất kỳ trang web nào, rồi thay lại trong mã nguồn. Đoạn mã sinh ra cũng chứa nguyên văn khóa nên đừng đưa thẳng vào kho mã nguồn.
Công cụ có chuyển ngược từ mã nguồn sang lệnh cURL không?
Không, chỉ có một chiều từ cURL sang mã nguồn. Nếu bạn cần chiều ngược lại để chia sẻ một yêu cầu cho đồng nghiệp, cách nhanh nhất là chạy đoạn mã đó, bắt yêu cầu trong tab Network của trình duyệt hoặc trong nhật ký máy chủ, rồi sao chép ra dạng cURL từ đó.
Tiêu đề chứa dấu hai chấm trong giá trị có bị tách sai không?
Không. Bộ phân tích chỉ tách ở dấu hai chấm đầu tiên rồi ghép nguyên phần còn lại làm giá trị, nên tiêu đề chứa địa chỉ đầy đủ hay chứa mốc thời gian có dấu hai chấm vẫn giữ đúng nội dung. Điều kiện là toàn bộ tiêu đề phải nằm trong một cặp dấu nháy và không có dấu nháy khác lồng bên trong.
Từ khóa liên quan
- chuyển curl sang code
- curl converter online
- curl sang fetch
- curl sang axios
- curl sang python requests
- curl sang php
- copy as curl trong devtools
- lệnh curl là gì
- curl -X POST là gì
- curl gửi json
- tham số curl thường dùng
- gọi api bằng javascript
- fetch api bắt lỗi
- lỗi cors khi gọi api
- python requests gửi json
- php curl_setopt
- test api bằng dòng lệnh
- chuyển postman sang code
- header authorization bearer
- công cụ cho lập trình viên
