cuộn tròn -GET và -X GET


126

Curl cung cấp một loạt các lệnh gọi phương thức http khác nhau có tiền tố là X, nhưng cũng cung cấp các phương thức tương tự mà không có. Tôi đã thử cả hai và tôi dường như không thể tìm ra sự khác biệt. Ai đó có thể giải thích cho tôi nhanh chóng làm thế nào hai hoạt động này khác nhau?

Câu trả lời:


263

Theo mặc định, bạn sử dụng curl mà không nói rõ ràng phương thức yêu cầu nào sẽ sử dụng. Nếu bạn chỉ chuyển vào một URL HTTP giống như curl http://example.comnó sẽ sử dụng GET. Nếu bạn sử dụng -dhoặc -Fcuộn tròn sẽ sử dụng POST, -Isẽ gây ra HEAD và -Tsẽ làm cho nó trở thành PUT.

Nếu vì lý do nào đó mà bạn không hài lòng với những lựa chọn mặc định mà curl mang lại cho bạn này, bạn có thể ghi đè các phương thức yêu cầu đó bằng cách chỉ định -X [WHATEVER]. Bằng cách này, bạn có thể ví dụ như gửi một XÓA bằng cách thực hiện curl -X DELETE [URL].

Do đó, nó là vô nghĩa nếu curl -X GET [URL]GET sẽ được sử dụng. Theo cách tương tự, điều đó là vô nghĩa curl -X POST -d data [URL]...nhưng bạn có thể thực hiện một yêu cầu thú vị và hơi hiếm khi gửi một request-body trong một yêu cầu GET với một cái gì đó như curl -X GET -d data [URL].

Đào sâu hơn

curl -GET(sử dụng một dấu gạch ngang) chỉ là sai cho mục đích này. Điều đó tương đương với việc chỉ định -G, -E-Tcác tùy chọn và điều đó sẽ làm một cái gì đó hoàn toàn khác.

Ngoài ra còn có một tùy chọn cuộn tóc được gọi --getđể không nhầm lẫn các vấn đề với cả hai. Đây là dạng dài của -G, được sử dụng để chuyển đổi dữ liệu được chỉ định với -dthành yêu cầu GET thay vì POST.

(Sau đó, tôi đã sử dụng câu trả lời của riêng mình ở đây để điền Câu hỏi thường gặp về curl để giải quyết vấn đề này .)

Cảnh báo

Các phiên bản hiện đại của curl sẽ thông báo cho người dùng về việc sử dụng -X không cần thiết và có khả năng gây hại này khi chế độ tiết được bật ( -v) - để người dùng biết. Giải thích thêm và động lực trong bài đăng blog này .

-G chuyển đổi nội dung POST + thành truy vấn GET +

Bạn có thể yêu cầu curl chuyển đổi một tập hợp các -dtùy chọn và thay vì gửi chúng trong phần nội dung yêu cầu với POST, hãy đặt chúng vào cuối chuỗi truy vấn của URL và đưa ra GET, với việc sử dụng `-G. Như thế này:

curl -d name=daniel -d grumpy=yes -G https://example.com/

5
-XGET có thể không phù hợp, nhưng nó làm cho nó rõ ràng.
mtyson

"Theo mặc định, bạn sử dụng curl mà không nói rõ ràng phương thức yêu cầu nào sẽ sử dụng. Nếu bạn chỉ chuyển vào một URL HTTP như curl example.com, nó sẽ sử dụng GET. Nếu bạn sử dụng -d hoặc -F, curl sẽ sử dụng POST, tôi sẽ gây ra HEAD và -T sẽ biến nó thành PUT. " Mọi thư bạn cân biêt.
Donato

4
Rõ ràng tốt hơn là ngầm bất cứ khi nào bạn có tùy chọn. Lỗi sớm, hỏng nhanh, giảm tai nạn, giảm thời gian gỡ lỗi. Lần duy nhất bạn có lý do để bỏ qua nó là khi nhập nó vào dòng lệnh. Bất kỳ tập lệnh nào cũng nên chỉ định -XGET ngay cả khi hoàn toàn không cần thiết.
Backgammon

1
@Backgammon nếu họ làm vậy, họ đang làm sai. Nhưng chắc chắn, họ có thể.
Daniel Stenberg

2

-X [phương pháp của bạn]
X cho phép bạn ghi đè 'Nhận' mặc định

** sửa chữ thường xthành chữ hoaX


2
Điều này thậm chí không cố gắng trả lời câu hỏi "hai hoạt động này khác nhau như thế nào".
Melebius

1

Việc sử dụng -X [WHATEVER]chỉ đơn thuần là thay đổi chuỗi phương thức của yêu cầu được sử dụng trong yêu cầu HTTP. Điều này dễ hiểu hơn với hai ví dụ - một có -X [WHATEVER]và một không có - và các tiêu đề yêu cầu HTTP được liên kết cho mỗi:

# curl -XPANTS -o nul -v http://neverssl.com/
* Connected to neverssl.com (13.224.86.126) port 80 (#0)
> PANTS / HTTP/1.1
> Host: neverssl.com
> User-Agent: curl/7.42.0
> Accept: */*

# curl -o nul -v http://neverssl.com/
* Connected to neverssl.com (13.33.50.167) port 80 (#0)
> GET / HTTP/1.1
> Host: neverssl.com
> User-Agent: curl/7.42.0
> Accept: */*
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.