題 獲取curl輸出HTTP狀態代碼?


我正在使用 curl 在Linux上的命令行發出HTTP請求。響應主體打印到標準輸出,這很好,但我無法從手冊頁中看到如何獲取curl來從響應中打印HTTP狀態代碼(404,403等)。這可能嗎?


618
2018-04-18 10:28


起源


至於我,我可以從手冊中看到如何獲取HTTP狀態代碼,但選項-w不起作用。我向Apple報告了這個錯誤。 - Nicolas Barbulesco
該 -i 旗幟,如 curl -i https://www.example.com/,可能是你想要的,按照 superuser.com/a/514798/190188 - caw


答案:


這應該適合你 如果 Web服務器能夠響應HEAD請求(這不會執行 GET):

curl -I http://www.example.org

另外,讓cURL遵循重定向(3xx狀態)添加-L。


383
2018-04-18 10:56



注意: curl -I 執行HEAD HTTP請求,這對於測試某些Web應用程序服務器和服務的HTTP狀態代碼可能會有問題 - Jay Taylor
並獲得狀態號,將其管道 head -n 1|cut -d$' ' -f2 - Benubird
不要忘記重定向curl的stderr: curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2。如果在重定向後需要最終狀態,請添加-L以進行捲曲。 - Aaron Blenkush
僅在執行HEAD請求之後重定向可能會導致有趣的行為,具體取決於應用程序的編程方式。 - Scott McIntyre
curl -I -X GET將發送GET請求,但提供相同的輸出。 - jiggy


打印出更具體的方法 只是 HTTP狀態代碼的含義如下:

curl -s -o /dev/null -w "%{http_code}" http://www.example.org/

在腳本中更容易使用,因為它不需要任何解析:-)

可能會添加參數-I以提高響應負載性能。此參數僅請求響應的狀態/標頭,沒有下載響應正文。 (%{http_code}在HTTP有效負載的第一行返回)

即:

curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/

665
2018-06-28 00:25



-w“%{http_code}”是打印狀態代碼的位。您可以在其中添加一行或兩行來將代碼與正文分開(-w“\ n \ n%{http_code} \ n”) - Jeffrey Martinez
哇,這個 /dev/null 事情甚至適用於我正在使用的Windows版curl。 - Uwe Keim
我相信這會下載整個文件,即使它全部轉到/ dev / null,因此不適合檢查大文件的狀態代碼。 httping -c 1 -s -G -m 發出GET並且沒有下載整個文件,雖然我意識到這個問題是關於curl的。 - RomanSt
@romkyns,你是對的:我的答案中的第一個變體下載整個文件並“保存”它 /dev/null,但第二個變種 - 即。使用的那個 -I 選項 curl  - 沒有。但是,必須小心,因為您並沒有真正測試相同的操作:一個是HTTP GET 要求,而另一方提出要求 HEAD 請求...一些網絡服務器/網站將使用不同的狀態代碼進行響應,即使請求的網址完全相同! - pvandenberk
供參考: -s =不顯示下載進度, -o /dev/null =不顯示身體, -w "%{http_code}" =退出後將http響應代碼寫入stdout。 - Ajedi32


如果要查看標題以及結果,可以使用verbose選項:

curl -v http://www.example.org
curl --verbose http://www.example.org

狀態將顯示在標題中。例如。

< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity

177
2018-05-03 04:28



用於指出詳細標誌的+1提供了額外的細節。非常適合測試REST應用程序。 - MrOodles
在執行POST請求時非常容易使用+1(curl -v --data“...”) - MegaTux
它甚至將它們分成兩個不同的文件輸出(http狀態詳細信息到stderr,響應體到stdout) - Blauhirn


除了執行以下所有標題之外,您還可以打印狀態代碼:

curl -i http://example.org

關於好事 -i 是它的工作原理 -X POST 同樣。


153
2017-12-04 20:45



比接受的答案(執行HEAD請求)要好得多。 - neu242
也許很明顯,但是 -i 確實有效 任何 HTTP方法,而不僅僅是 GET 和 POST...... :) - mac
最好的答案,因為它使curl輸出標題和正文,使其適用於腳本中使用的大多數任務 - Sarge Borsch
這是最好的答案,可以與之結合使用 -s (不顯示進度表或錯誤消息)和 -S(畢竟顯示錯誤信息) - Jonathan Hartley


如果要捕獲變量中的HTTP狀態代碼,但仍將內容重定向到STDOUT,則必須創建兩個STDOUT。你可以這樣做 過程替換>() 和 命令替換$()

首先,創建一個文件描述符 3 對於您當前的流程'STDOUT with exec 3>&1

然後,使用curl's -o 使用命令替換將響應內容重定向到臨時fifo的選項,然後在該命令替換中,將輸出重定向回當前進程STDOUT文件描述符 3 同 -o >(cat >&3)

全部放在一起 bash  3.2.57(1)-release (標準為 macOS):

#creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1 
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')

請注意,這不起作用 /bin/sh 如 SamK在下面的評論中指出


49
2018-01-08 20:59



這是嚴重的slickery ......我喜歡它! - spyle
現在又如何將輸出重定向到另一個變量呢? - Roger Filmyer
輸出是在 STDOUT,所以你應該能夠將命令的輸出重定向到你喜歡的任何地方,就像常規命令一樣。我沒有測試過這個。 - Heath Borders
不適用於/ bin / sh。 - SamK


重新定義捲曲輸出:

curl -sw '%{http_code}' http://example.org

可以與任何請求類型一起使用。


27
2017-08-05 18:18



-k(--insecure)覆蓋-s(沉默)。 - Ravichandra


這將向url發送請求,僅獲取響應的第一行,將其拆分為塊並選擇第二行。

它包含響應代碼

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2

10
2017-07-15 20:08



你能解釋一下這段代碼的作用以及它如何解決OP給出的問題嗎?原因不明的代碼對用戶來說可能不受信任且危險。 - bwDraco
當然,我們向url發送請求,只獲取響應的第一行,將其拆分為塊並選擇第二行。它包含OP正在尋找的響應代碼。 - Filip Spiridonov