curl命令与HTTP请求

25次阅读

共计 2876 个字符,预计需要花费 8 分钟才能阅读完成。

curl 介绍

curl 是一个运行在命令行的 http 客户端。使用 curl 命令可以发起 http 请求并返回结果。

相信很多开发者都喜欢使用图形化界面工具(例如 Postman)来进行 API 的调试。但是我觉得了解 curl 命令行工具,会给开发带来很大的帮助,可以让开发者更直观地了解 http 请求,也方便了开发过程中的沟通与交流。

curl 的使用

注意:Windows 系统是没有 curl 命令的,要想 Windows 中使用它,可以使用 Git Bash 或者 Cygwin。

curl [options] [URL...]

先来尝试一下不加任何参数请求百度首页和 一言 API。

curl https://www.baidu.com

curl https://v1.hitokoto.cn/

可以看到返回的信息都是一串文本(字符串)。当所请求的内容是 html(百度首页)时返回 html 文本;当请求的内容是 JSON API(一言 API)时返回 JSON 文本。在浏览器中,浏览器便是根据这文本内容来进行页面渲染。

不加任何参数使用 curl 命令只是返回 http 的 响应正文 内容(后面有提到),如果要想查看完整的 http 请求信息可以加上 -v 参数。

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

此时 http 请求的完整信息被打印出来,这些信息便是 http 的 请求报文 响应报文

HTTP 请求

HTTP 请求可以看成向服务器发送字符串,服务器收到后返回字符串的过程。向服务器发送的字符串称为 请求报文 ,而服务器返回的字符串称为 响应报文

请求报文

一个 HTTP 请求报文由 请求行 请求头 空行 请求数据 4 个部分组成。

  • 请求行
    请求行由请求方法、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 参数时返回的内容。

在上面的例子中它们的具体位置如下

> 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 命令的常用参数有:

  • -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 接口出现问题时,我们就可以直接发送这段命令给其他开发者,只需粘贴到终端运行,便能知道问题所在,可以说是相当的方便。

参考资料

  • 一次完整的 HTTP 请求所经历的 7 个步骤
正文完
 0