curl命令與HTTP請求

curl介紹

curl 是一個運行在命令行的 http 客戶端。使用 curl 命令能夠發起 http 請求並返回結果。

相信不少開發者都喜歡使用圖形化界面工具(例如 Postman)來進行 API 的調試。可是我以爲了解 curl 命令行工具,會給開發帶來很大的幫助,可讓開發者更直觀地瞭解 http 請求,也方便了開發過程當中的溝通與交流。html

curl的使用

注意:Windows 系統是沒有 curl 命令的,要想 Windows 中使用它,可使用 Git Bash 或者 Cygwin
curl [options] [URL...]

先來嘗試一下不加任何參數請求百度首頁和 一言 APIgit

curl https://www.baidu.com

圖片描述

curl https://v1.hitokoto.cn/

圖片描述

能夠看到返回的信息都是一串文本(字符串)。當所請求的內容是html(百度首頁)時返回html文本;當請求的內容是JSON API(一言 API)時返回JSON文本。在瀏覽器中,瀏覽器即是根據這文本內容來進行頁面渲染。web

不加任何參數使用 curl 命令只是返回http的響應正文內容(後面有提到),若是要想查看完整的http請求信息能夠加上 -v 參數。json

curl -v https://v1.hitokoto.cn/

圖片描述

此時http請求的完整信息被打印出來,這些信息即是http的 請求報文響應報文api

HTTP請求

HTTP請求能夠當作向服務器發送字符串,服務器收到後返回字符串的過程。向服務器發送的字符串稱爲 請求報文,而服務器返回的字符串稱爲 響應報文瀏覽器

請求報文

一個HTTP請求報文由 請求行請求頭空行請求數據 4個部分組成。bash

  • 請求行
    請求行由請求方法、URL和HTTP協議版本組成。例如,GET /index.html HTTP/1.1。
    HTTP的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
  • 請求頭
    請求頭由鍵/值對組成,每行一對,鍵與值之間用冒號分隔。常見的請求頭有:
    User-Agent:產生請求的瀏覽器類型。
    Accept:客戶端可識別的內容類型列表。
    Host:請求的主機名。
  • 空行
    最後一個請求頭以後是一個空行,發送回車符和換行符,通知服務器如下再也不有請求頭。
  • 請求數據
    請求數據不在GET方法中使用,而是在POST方法中使用。

響應報文

響應報文由 狀態行響應頭響應正文 3個部分組成。服務器

  • 狀態行
    返回HTTP狀態碼來講明所請求的資源狀況。
    常見的狀態碼有 200 OK(請求成功),403 Forbidden(服務器收到請求,可是拒絕提供服務),404 Not Found(請求資源不存在)。
  • 響應頭
    響應頭和請求頭同樣,由鍵/值對組成,每行一對,鍵與值之間用冒號分隔。
  • 響應正文
    響應的正文內容,也就是上面所說的當 curl 命令不加 -v 參數時返回的內容。

在上面的例子中它們的具體位置以下app

> GET / HTTP/1.1    (請求行)
> Host: v1.hitokoto.cn    (請求頭)
> User-Agent: curl/7.64.0    (請求頭)
> Accept: */*    (請求頭)
>    (空行)
< HTTP/1.1 200 OK    (狀態行)
< Date: Thu, 25 Jul 2019 01:51:45 GMT    (下面都是響應頭)
< Content-Type: application/json; charset=utf-8
< Content-Length: 182
< Connection: keep-alive
< X-Request-Id: 0b8927ab-47be-4e61-8c0e-04acfbe81bb4
< X-DNS-Prefetch-Control: off
< X-Frame-Options: SAMEORIGIN
< Strict-Transport-Security: max-age=15552000; includeSubDomains
< X-Download-Options: noopen
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< X-Via: 1.1 PSgxnndx7ba44:7 (Cdn Cache Server V2.0)
<    (下面是響應正文)
{
  "id": 708,
  "hitokoto": "彼方爲誰,無我有問 ;九月露溼,待君以前",
  "type": "a",
  "from": "你的名字",
  "creator": "moe",
  "created_at": "1477825585"
}* Connection #0 to host v1.hitokoto.cn left intact

curl命令的經常使用參數

curl 命令的經常使用參數有:curl

  • -X <method> // 設置請求方法
  • -H <header> // 設置請求頭
  • -D <data> // 設置請求數據(POST方法)

例子:

curl 'https://v1.hitokoto.cn/' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' -H 'Cookie: _ga=GA1.2.303411826.1562744042' -D 'c=b'

上面的例子表示

  • POST 請求 https://v1.hitokoto.cn/,因爲添加了 -D 參數,因此 -X POST 參數能夠不寫
  • 添加了兩個 請求頭,分別是 User-Agent,和 Cookie
  • 添加了一個 請求數據c=b。若 請求數據 有多個時,用 & 鏈接。

另外,在現代瀏覽器的開發者工具中,有一個很方便的功能,能夠複製所請求的 curl 命令。

圖片描述

複製出來的結果:

curl 'https://v1.hitokoto.cn/' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.9' -H 'Cookie: _ga=GA1.2.303411826.1562744042' --compressed

當調試 api 接口出現問題時,咱們就能夠直接發送這段命令給其餘開發者,只需粘貼到終端運行,便能知道問題所在,能夠說是至關的方便。

參考資料
相關文章
相關標籤/搜索