Làm cách nào để gửi tiêu đề bằng yêu cầu HTTP thông qua cuộc gọi curl?


1447

Tôi muốn gửi một tiêu đề đến máy chủ Apache của tôi trên một hộp Linux. Làm thế nào tôi có thể đạt được điều này thông qua một cuộc gọi curl?


60
Có một cách hay để tìm hiểu cách sử dụng curl cho các yêu cầu http bằng các ví dụ. Tải xuống phiên bản mới nhất của Postman, thực hiện bất kỳ cấu hình yêu cầu http nào bạn muốn ở cấp giao diện người dùng (đăng, đặt, lấy .. chẳng hạn, với tiêu đề và thân json) và sau đó nhấp vào "tạo mã" và chọn tùy chọn "curl" . Nó cung cấp cho bạn dòng lệnh tương đương.
Vinicius Lima

Câu trả lời:


512

ĐƯỢC:

với JSON:

curl -i -H "Accept: application/json" -H "Content-Type: application/json" http://hostname/resource

với XML:

curl -H "Accept: application/xml" -H "Content-Type: application/xml" -X GET http://hostname/resource

BÀI ĐĂNG:

Để đăng dữ liệu:

curl --data "param1=value1&param2=value2" http://hostname/resource

Để tải lên tập tin:

curl --form "fileupload=@filename.txt" http://hostname/resource

Bài viết HTTP RESTful:

curl -X POST -d @filename http://hostname/resource

Để đăng nhập vào một trang web (auth):

curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login
curl -L -b headers http://localhost/

@filename có nghĩa là gì đối với bài viết RESTful? bạn đang gửi một tập tin đến một máy chủ REST? điều đó có vẻ kỳ lạ đối với tôi
JesseBoyd

6
Đối với những người đến sau, những người có thể đang thắc mắc điều tương tự ... ký hiệu @ là cách đọc dữ liệu để gửi đến máy chủ từ một tệp, thay vì nhập nội tuyến vào yêu cầu cuộn tròn. Bạn không POST một tệp mỗi se, bạn đang POST nội dung của tệp dưới dạng phần thân của yêu cầu POST của bạn.
F1dave

Câu trả lời chi tiết hơn tại đây: stackoverflow.com/questions/14978411/, :)
Amith Koujalgi

1983

man curl:

   -H/--header <header>
          (HTTP)  Extra header to use when getting a web page. You may specify
          any number of extra headers. Note that if you should  add  a  custom
          header that has the same name as one of the internal ones curl would
          use, your externally set header will be used instead of the internal
          one.  This  allows  you  to make even trickier stuff than curl would
          normally do. You should not replace internally set  headers  without
          knowing  perfectly well what you're doing. Remove an internal header
          by giving a replacement without content on the  right  side  of  the
          colon, as in: -H "Host:".

          curl  will  make sure that each header you add/replace get sent with
          the proper end of line marker, you should thus not  add  that  as  a
          part  of the header content: do not add newlines or carriage returns
          they will only mess things up for you.

          See also the -A/--user-agent and -e/--referer options.

          This option can be used multiple times to add/replace/remove  multi-
          ple headers.

Thí dụ:

curl --header "X-MyHeader: 123" www.google.com

Bạn có thể thấy yêu cầu cuộn tròn được gửi bằng cách thêm -vtùy chọn.


74
Nếu bạn muốn gửi nhiều tiêu đề sử dụng nhiều hơn một tiêu đề, không sao, curl sẽ phân tích từng tiêu đề như một tiêu đề khác nhau. Không có cách nào để tách các tiêu đề bên trong cùng một tham số - tiêu đề. ví dụ: curl - tiêu đề "Chấp nhận: javascript" - tiêu đề "kiểm tra: xin chào" -v www.google.com
Hatoru Hansou

2
Nếu mọi người muốn có ví dụ, tôi sẽ để nó ở đây: bropages.org
Peter Westmacott

trang man (trên OSX, ít nhất) bây giờ DO bao gồm một ví dụ: Ví dụ: # curl -H "X-First-Name: Joe" 192.168.0.1
JESii

6
@MartinKonicek và những người khác: Tôi thật sự khuyên bạn nên sử dụng tldr utiltiy (brew, v.v. cài đặt tldr). Ví dụ duy nhất của nó. ví dụ: "Gửi yêu cầu có tiêu đề bổ sung, sử dụng phương thức HTTP tùy chỉnh: curl -H 'X-My-Header: 123' -X PUT example.com "

280

Trong PHP :

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName:HeaderValue'));

hoặc bạn có thể đặt nhiều:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName:HeaderValue', 'HeaderName2:HeaderValue2'));

1
@James nó hoạt động tốt trong một số trường hợp, nhưng trong những trường hợp khác, CURL gửi một tiêu đề bổ sung "Mong đợi: 100-tiếp tục" - bạn có ý tưởng nào về cách loại bỏ nó không?
mã hóa_idiot

@coding_idiot: Bạn có thể chuyển "Expect:" trong mảng các giá trị tiêu đề để vô hiệu hóa nó. Ví dụ: curl_setopt ($ ch, CURLOPT_HTTPHEADER, mảng ('HeaderName: HeaderValue', 'Expect:'));
ether

12
OP đã không nói bất cứ điều gì về suy nghĩ của PHP
hanshenrik

Tên tiêu đề được đặt phía trên với dấu gạch dưới và HTTP_ được thêm tiền tố. Ví dụ: "mã thông báo bảo vệ" trở thành "HTTP_PROTMENT_TOKEN".
Bimal Poudel


44

NHẬN (nhiều tham số):

curl -X  GET "http://localhost:3000/action?result1=gh&result2=ghk"

hoặc là

curl --request  GET "http://localhost:3000/action?result1=gh&result2=ghk"

hoặc là

curl  "http://localhost:3000/action?result1=gh&result2=ghk"

hoặc là

curl -i -H "Application/json" -H "Content-type: application/json"  "http://localhost:3000/action?result1=gh&result2=ghk"

1
Cảm ơn. Tôi đã không nhận ra các trích dẫn bắt buộc cho loại url này.
remat_br

12

Tôi sử dụng Postman.

Thực hiện bất cứ cuộc gọi nào bạn muốn làm. Sau đó, người đưa thư cung cấp một công cụ tiện dụng để hiển thị mã curl.

Chạy nó trong thiết bị đầu cuối. nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


Đây là một cách tốt để tăng tốc mọi thứ nhưng hãy cẩn thận thoát khỏi dấu ngoặc đơn hoặc dấu ngoặc kép nếu bạn đang sử dụng tập lệnh shell trên windows vì tập lệnh shell có các yêu cầu định dạng riêng
Thierrydev

Mặc dù postman là một công cụ tuyệt vời nhưng khi bạn không có môi trường đồ họa như trong các nhóm Kubernetes thì nó vô dụng. Tìm hiểu curl và bạn luôn có thể kiểm tra phần còn lại.
Namphibian

11

Bạn cũng có thể gửi nhiều tiêu đề, dữ liệu (ví dụ JSON) và chỉ định phương thức Gọi (POST, GET) vào một cuộc gọi CUrl như thế này:

curl -X POST(Get or whatever) \
  http://your_url.com/api/endpoint \
  -H 'Content-Type: application/json' \
  -H 'header-element1: header-data1' \
  -H 'header-element2: header-data2' \

...... nhiều tiêu đề hơn ................

  -d '{
  "JsonExArray": [
    {
      "json_prop": "1",
    },
    {
      "json_prop": "2",
    }
  ]
}'


7

Trong trường hợp bạn muốn gửi tiêu đề tùy chỉnh của mình , bạn có thể thực hiện theo cách này:

curl -v -H @{'custom_header'='custom_header_value'} http://localhost:3000/action?result1=gh&result2=ghk

2

Trong môi trường anaconda thông qua các cửa sổ, các lệnh nên là: GET, ví dụ:

curl.exe http://127.0.0.1:5000/books 

Đăng hoặc Patch dữ liệu cho ex:

curl.exe http://127.0.0.1:5000/books/8 -X PATCH -H "Content-Type: application/json" -d '{\"rating\":\"2\"}' 

PS: Thêm dấu gạch chéo ngược cho dữ liệu json để tránh loại lỗi này => Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)

và sử dụng curl.exethay vì curlchỉ để tránh vấn đề này:

Invoke-WebRequest : Cannot bind parameter 'Headers'. Cannot convert the "Content-Type: application/json" value of type
"System.String" to type "System.Collections.IDictionary".
At line:1 char:48
+ ... 0.1:5000/books/8 -X PATCH -H "Content-Type: application/json" -d '{\" ...
+                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
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.