Chỉ nhận tiêu đề phản hồi từ HTTP POST bằng cách sử dụng curl


561

Người ta chỉ có thể yêu cầu các tiêu đề sử dụng HTTP Head, như tùy chọn -Itrong curl(1).

$ curl -I /

Các nội dung phản hồi HTML dài là một vấn đề khó khăn trong dòng lệnh, vì vậy tôi chỉ muốn lấy tiêu đề làm phản hồi cho các yêu cầu POST của mình. Tuy nhiên, HEAD và POST là hai phương thức khác nhau.

Làm cách nào để có được curl để chỉ hiển thị các tiêu đề phản hồi cho yêu cầu POST?

Câu trả lời:


773
-D, --dump-header <file>
       Write the protocol headers to the specified file.

       This  option  is handy to use when you want to store the headers
       that a HTTP site sends to you. Cookies from  the  headers  could
       then  be  read  in  a  second  curl  invocation by using the -b,
       --cookie option! The -c, --cookie-jar option is however a better
       way to store cookies.

-S, --show-error
       When used with -s, --silent, it makes curl show an error message if it fails.

-L/--location
      (HTTP/HTTPS) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response
      code), this option will make curl redo the request on the new place. If used together with -i/--include or -I/--head, headers from  all  requested
      pages  will  be  shown.  When authentication is used, curl only sends its credentials to the initial host. If a redirect takes curl to a different
      host, it won’t be able to intercept the user+password. See also --location-trusted on how to change this. You can limit the amount of redirects to
      follow by using the --max-redirs option.

      When curl follows a redirect and the request is not a plain GET (for example POST or PUT), it will do the following request with a GET if the HTTP
      response was 301, 302, or 303. If the response code was any other 3xx code, curl will re-send the following  request  using  the  same  unmodified
      method.

từ trang người đàn ông. vì thế

curl -sSL -D - www.acooke.org -o /dev/null

theo các chuyển hướng, chuyển các tiêu đề thành thiết bị xuất chuẩn và gửi dữ liệu tới / dev / null (đó là GET, không phải POST, nhưng bạn có thể thực hiện điều tương tự với POST - chỉ cần thêm bất kỳ tùy chọn nào bạn đang sử dụng để POST dữ liệu)

lưu ý -sau -Dđó chỉ ra rằng "tập tin" đầu ra là thiết bị xuất chuẩn.


22
nhận xét trên là hợp lệ nếu bạn đang sử dụng powershell. để sử dụng cmd.execurl -s -D - http://yahoo.com -o nul
JJS

1
@JJS cho tôi $ null hoạt động trên Win7. Có phải do cLink cài đặt trên windows.
Satya Prakash

17
"-" phía trước URL có vẻ không quan trọng, nhưng thực tế không phải vậy.
Wahid Sadik

1
@WahidSadik Tại sao lại là trường hợp cụ thể? Chức năng của dấu gạch ngang đơn là gì?
mamachanko

4
@mamachanko -Dcó một đối số cho biết nơi đầu ra sẽ đi. dấu gạch ngang đơn có nghĩa là nó sẽ đi đến thiết bị xuất chuẩn.
rút cooke

172

Các câu trả lời khác yêu cầu cơ thể phản hồi được tải xuống. Nhưng có một cách để thực hiện một yêu cầu POST sẽ chỉ tìm nạp tiêu đề:

curl -s -I -X POST http://www.google.com

Bản -Ithân nó thực hiện một yêu cầu CHÍNH có thể được ghi đè bằng cách -X POSTthực hiện một yêu cầu POST (hoặc bất kỳ thứ gì khác) và vẫn chỉ nhận được dữ liệu tiêu đề.


15
Câu trả lời này thực sự chính xác vì các máy chủ web có thể trả về các tiêu đề khác nhau dựa trên phương thức yêu cầu. Nếu bạn muốn kiểm tra các tiêu đề trên GET, bạn phải sử dụng yêu cầu GET.
chhantyal

6
Đây là câu trả lời đúng nhất, theo ý kiến ​​của tôi. Thật dễ nhớ, nó thực sự gửi GETyêu cầu và không tải xuống toàn bộ phần phản hồi (hoặc ít nhất là không xuất ra nó). Các -slá cờ là cũng không cần thiết.
skozin

@JeffPuckettII tôi cũng nói vậy. Bạn có thể thay thế GETbằng POSTlệnh trên và nó sẽ hoạt động như mong đợi. or any otherlà chìa khóa ở đó.
chhantyal

18
Điều này không hoạt động khi bạn thực sự muốn POSTmột số dữ liệu. Curl nói:Warning: You can only select one HTTP request method! You asked for both POST Warning: (-d, --data) and HEAD (-I, --head).
SebastianH

2
@nickboldt Vấn đề ở đây là một máy chủ có thể phản hồi khác với yêu cầu CHÍNH so với yêu cầu POST hoặc GET (và một số máy chủ thực sự làm điều đó), vì vậy -X HEADkhông có giải pháp đáng tin cậy nào ở đây.
siracusa

58

Lệnh sau hiển thị thêm thông tin

curl -X POST http://httpbin.org/post -v > /dev/null

Bạn có thể yêu cầu máy chủ chỉ gửi CHÍNH, thay vì trả lời đầy đủ

curl -X HEAD -I http://httpbin.org/

Note:Trong một số trường hợp, máy chủ có thể gửi các tiêu đề khác nhau cho bài đăng và ĐẦU. Nhưng trong hầu hết các trường hợp tiêu đề đều giống nhau.


5
Thật không may là câu trả lời khác đã thắng, bởi vì đây là câu trả lời đúng - không cần thiết phải chuyển một tấn dữ liệu.
Daniel

1
@dmd Nếu tôi hiểu hướng dẫn sử dụng cURL -X, --requestmột cách chính xác, -X HEADvẫn dẫn đến kết quả là một tấn dữ liệu, nhưng -I, --headđiều đó sẽ dẫn đến những gì bạn đang dự đoán.
Daniel AR Werner

1
Bạn không hiểu chính xác. -X HEAD-Ihoàn toàn tương đương.
Daniel

18
Vấn đề -X HEADlà máy chủ có thể phản hồi khác nhau, vì hiện tại nó nhận được HEADyêu cầu thay vì GET(hoặc bất cứ yêu cầu nào trước đó)
Grav

4
Warning: Setting custom HTTP method to HEAD with -X/--request may not work the Warning: way you want. Consider using -I/--head instead.
Dorian

53

Đối với các cơ quan phản hồi dài (và nhiều tình huống tương tự khác), giải pháp tôi sử dụng luôn là dẫn đến less, vì vậy

curl -i https://api.github.com/users | less

hoặc là

curl -s -D - https://api.github.com/users | less

sẽ làm việc


những điều này không tương đương vấn đề đầu tiên là HEADyêu cầu nhiều máy chủ phản hồi khác nhau. vấn đề thứ hai là một GETyêu cầu giống như những gì chúng ta đang tìm kiếm ở đây.
glasz

25

Có thể đó là một chút cực đoan, nhưng tôi đang sử dụng phiên bản siêu ngắn này:

curl -svo. <URL>

Giải trình:

-v in thông tin gỡ lỗi (bao gồm các tiêu đề)

-o.gửi dữ liệu trang web (mà chúng tôi muốn bỏ qua) đến một tệp nhất định, .trong trường hợp này là thư mục và là đích không hợp lệ và làm cho đầu ra bị bỏ qua.

-skhông có thanh tiến trình, không có thông tin lỗi (nếu không bạn sẽ thấy Warning: Failed to create the file .: Is a directory)

cảnh báo: kết quả luôn thất bại (về mã lỗi, nếu có thể truy cập hoặc không). Không sử dụng các câu lệnh có điều kiện trong shell script ...


1
Tại sao sử dụng -o.thay vì -o /dev/null?
bfontaine

@bfontaine -o.được sử dụng so với -o /dev/nullngắn gọn
exebook

nó không có hành vi tương tự, vì vậy thật lạ khi chỉ sử dụng để lưu 8 ký tự.
bfontaine

2
@bfontaine có những câu trả lời khác chỉ ra cách thực hiện điều này một cách chính xác nhất, câu trả lời này có ở đây để chỉ ra cách thay thế ngắn thực hiện điều tương tự về cơ bản.
exebook

Bạn nên làm rõ trong câu trả lời của bạn rằng lệnh này luôn luôn thất bại. curl -svo. <url> && echo foosẽ không in foo-o.làm curltrở lại một (= lỗi) Mã-zero không: curl: (23) Failed writing body.
bfontaine

16

Dễ dàng hơn nhiều - đây là những gì tôi sử dụng để tránh theo dõi Shortlink - là như sau:

curl -IL http://bit.ly/in-the-shadows

Sôi mà cũng theo liên kết .


14

Mặc dù các câu trả lời khác không hiệu quả với tôi trong mọi tình huống, nhưng giải pháp tốt nhất tôi có thể tìm thấy (cũng làm việc với POST), được lấy từ đây :

curl -vs 'https://some-site.com' 1> /dev/null


1
Tôi đã phải đặt url giữa các trích dẫn để làm việc này.
Barshe Weis

1
Điều này có cần thiết hay không có thể phụ thuộc vào url và shell được sử dụng. Tôi đã cải thiện câu trả lời cho phù hợp. Cảm ơn.
Daniel AR Werner

3

headcurl.cmd (phiên bản windows)

curl -sSkv -o NUL %* 2>&1
  • Tôi không muốn một thanh tiến trình -s,
  • nhưng tôi muốn có lỗi -S,
  • không bận tâm về chứng chỉ https hợp lệ -k,
  • nhận được mức độ chi tiết cao -v(đây là về khắc phục sự cố, phải không?),
  • không có đầu ra (một cách sạch sẽ).
  • oh, và tôi muốn chuyển tiếp stderr đến stdout , vì vậy tôi có thể grep chống lại toàn bộ (vì hầu hết hoặc tất cả đầu ra đều ở stderr)
  • %*có nghĩa là [chuyển tất cả các tham số cho tập lệnh này] (tốt ( https://stackoverflow.com/a/980372/444255 ), thường thì đó chỉ là một tham số: url bạn đang kiểm tra

ví dụ trong thế giới thực (về khắc phục sự cố proxy):

C:\depot>headcurl google.ch | grep -i -e http -e cache
Hostname was NOT found in DNS cache
GET HTTP://google.ch/ HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://www.google.ch/
Cache-Control: public, max-age=2592000
X-Cache: HIT from company.somewhere.ch
X-Cache-Lookup: HIT from company.somewhere.ch:1234

Phiên bản Linux

cho bạn .bash_aliases/ .bash_rc:

alias headcurl='curl -sSkv -o /dev/null $@  2>&1'

Điều này sẽ tải về cơ thể và tiêu thụ băng thông, thời gian. Câu trả lời của @siracusa ( stackoverflow.com/a/38679650/6168139 ) không có chi phí này.
rushi

Nếu & khi bạn muốn POST, hãy thêm -X POSTvào các tham số thông qua, nếu bạn muốn GET, hãy sử dụng GET (nghĩa là mặc định), vì các phản hồi có thể khác nhau. - Trừ khi bạn làm xoăn nhiều trong các kịch bản sản xuất (không phải để chẩn đoán và phát triển) Tôi không quan tâm đến một chút băng thông.
Frank Nocke

Tôi đang lên kế hoạch để xem các tệp trên máy chủ có được cập nhật hay không sử dụng 'Sửa đổi lần cuối'. Bản thân các tệp rất lớn, một số tính bằng GB và tôi thường sử dụng internet di động. Vì vậy, băng thông lớn này là một vấn đề đối với tôi.
rushi

Đó sẽ là hacky . Tôi không cần phải làm điều này vì câu trả lời của siracusa thực hiện nhiệm vụ một cách chính xác.
rushi
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.