/

使用curl進行HTTP請求的指南

使用curl進行HTTP請求的指南

curl是一個強大的工具,可以讓你從命令行創建網絡請求。

curl是一個命令行工具,用於在網絡上傳輸數據。

它支持許多協議,包括HTTP、HTTPS、FTP、FTPS、SFTP、IMAP、SMTP、POP3等。

在調試網絡請求方面,curl是最好的工具之一。

這是一個工具,一旦你知道如何使用它,你就會再次使用。它是程序員最好的朋友。

它是通用的,可以在Linux、Mac、Windows上運行。請參考官方安裝指南在你的系統上安裝它。

有趣的事實:curl的作者和維護人員是瑞典人,因他的工作(curl和libcurl)對計算世界的貢獻而被瑞典國王授予獎項。

讓我們深入介紹一些與HTTP請求一起工作時,你最有可能執行的命令和操作。

這些示例涉及與HTTP一起工作,這是最常用的協議。

執行HTTP GET請求

當你執行一個請求時,curl將返回響應的主體:

1
curl https://flaviocopes.com/

獲取HTTP響應頭

默認情況下,curl在輸出中隱藏響應頭。要顯示它們,使用i選項:

1
curl -i https://flaviocopes.com/

僅獲取HTTP響應頭

使用I選項,你可以僅獲取響應頭,而不是響應體:

1
curl -I https://flaviocopes.com/

執行HTTP POST請求

X選項允許你更改HTTP方法。默認情況下,使用GET,等同於:

1
curl -X GET https://flaviocopes.com/

使用-X POST將執行POST請求。

你可以執行URL編碼的POST請求:

1
curl -d "option=value&something=anothervalue" -X POST https://flaviocopes.com/

在這種情況下,發送application/x-www-form-urlencoded的Content-Type。

執行HTTP POST請求並發送JSON

與上面的示例不同,你可能希望發送JSON。

在這種情況下,你需要明確設置Content-Type頭,使用H選項:

1
curl -d '{"option": "value", "something": "anothervalue"}' -H "Content-Type: application/json" -X POST https://flaviocopes.com/

你還可以從磁盤上發送JSON文件:

1
curl -d "@my-file.json" -X POST https://flaviocopes.com/

執行HTTP PUT請求

原理與POST請求相同,只需使用-X PUT更改HTTP方法

跟隨重定向

指定L選項後,將自動跟隨重定向響應,例如301,它指定了Location響應頭:

1
curl http://flaviocopes.com/

將不會自動跟隨到我設置的重定向到HTTPS版本,但以下命令將:

1
curl -L http://flaviocopes.com/

將響應保存到文件中

使用o選項,你可以告訴curl將響應保存到文件中:

1
curl -o file.html https://flaviocopes.com/

你也可以通過文件名直接保存文件,使用O選項:

1
curl -O https://flaviocopes.com/index.html

使用HTTP驗證

如果資源需要基本的HTTP驗證,你可以使用u選項傳遞user:password的值:

1
curl -u user:pass https://flaviocopes.com/

設置不同的User Agent

用戶代理告訴服務器發起請求的客戶端是誰。curl默認發送curl/版本的用戶代理,如:curl/7.54.0

你可以使用--user-agent選項來指定不同的用戶代理:

1
curl --user-agent "my-user-agent" https://flaviocopes.com

檢查請求和響應的所有詳細信息

使用--verbose選項,可以使curl輸出請求和響應的所有詳細信息:

1
curl --verbose -I https://flaviocopes.com/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
\* Trying 178.128.202.129...
\* TCP_NODELAY set
\* Connected to flaviocopes.com (178.128.202.129) port 443 (#0)
\* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
\* Server certificate: flaviocopes.com
\* Server certificate: Let's Encrypt Authority X3
\* Server certificate: DST Root CA X3
> HEAD / HTTP/1.1
> Host: flaviocopes.com
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Cache-Control: public, max-age=0, must-revalidate
Cache-Control: public, max-age=0, must-revalidate
< Content-Type: text/html; charset=UTF-8
Content-Type: text/html; charset=UTF-8
< Date: Mon, 30 Jul 2018 08:08:41 GMT
Date: Mon, 30 Jul 2018 08:08:41 GMT

將任意瀏覽器網絡請求複製為curl命令

在使用Chrome開發者工具檢查任意網絡請求時,你可以將該請求複製為curl命令:

1
curl 'https://github.com/curl/curl' -H 'Connection: keep-alive' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache' -H 'Upgrade-Insecure-Requests: 1' -H 'DNT: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' -H 'Referer: https://www.google.it/' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9,it;q=0.8' -H 'Cookie: _octo=GH1.1.933116459.1507545550; _ga=GA1.2.643383860.1507545550; tz=Europe%2FRome; user_session=XXXXX; __Host-user_session_same_site=YYYYYY; dotcom_user=flaviocopes; logged_in=yes; has_recent_activity=1; _gh_sess=ZZZZZZ' --compressed

tags: [“http”, “curl”, “HTTP requests”, “network requests”]