多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# [curl命令与HTTP请求](https://segmentfault.com/a/1190000019869209) ![](https://avatar-static.segmentfault.com/300/741/3007410968-5c088f40acc6a_huge128) # curl介绍 > `curl`是一个运行在命令行的 http 客户端。使用`curl`命令可以发起 http 请求并返回结果。 相信很多开发者都喜欢使用图形化界面工具(例如[Postman](https://link.segmentfault.com/?enc=NueG7nS6%2B2iAJwHWSCLFig%3D%3D.TksQez1kozLtQFz1mXxxRXD31lX5wh4PGt%2FM62%2BaU1s%3D))来进行 API 的调试。但是我觉得了解`curl`命令行工具,会给开发带来很大的帮助,可以让开发者更直观地了解 http 请求,也方便了开发过程中的沟通与交流。 # curl的使用 > 注意:Windows 系统是没有`curl`命令的,要想 Windows 中使用它,可以使用[Git Bash](https://link.segmentfault.com/?enc=VPJDKMeGvACA4eqJVceerw%3D%3D.1n3rNWYmnUfEcmps6SIXk7sstxzMDFsYQQ1TZeJXYSDr809JU%2FdMuGwXsZ8m%2B9J3)或者[Cygwin](https://link.segmentfault.com/?enc=2aaL3QYen5ZHeSuLNT6ZcQ%3D%3D.N7ZcSeOaHy4YUvNThczdJ0VpZnD3MLU6gJocWO7trIE%3D)。 ~~~bash curl [options] [URL...] ~~~ 先来尝试一下不加任何参数请求百度首页和[一言 API](https://link.segmentfault.com/?enc=uQzpZ5%2B066w5QxIYQaITbA%3D%3D.zeiJLJb59B5J1Lsv1CAc9GUTVjjElEcKdpTZHD8JrGE%3D)。 ~~~bash curl https://www.baidu.com ~~~ ![图片描述](https://segmentfault.com/img/bVbvwzc?w=760&h=302 "图片描述") ~~~bash curl https://v1.hitokoto.cn/ ~~~ ![图片描述](https://segmentfault.com/img/bVbvwBR?w=475&h=171 "图片描述") 可以看到返回的信息都是一串文本(字符串)。当所请求的内容是html(百度首页)时返回html文本;当请求的内容是JSON API(一言 API)时返回JSON文本。在浏览器中,浏览器便是根据这文本内容来进行页面渲染。 不加任何参数使用`curl`命令只是返回http的`响应正文`内容(后面有提到),如果要想查看完整的http请求信息可以加上`-v`参数。 ~~~bash curl -v https://v1.hitokoto.cn/ ~~~ ![图片描述](https://segmentfault.com/img/bVbvwGo?w=557&h=470 "图片描述") 此时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`参数时返回的内容。 在上面的例子中它们的具体位置如下 ~~~nestedtext > 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 // 设置请求方法 * \-H // 设置请求头 * \-D // 设置请求数据(POST方法) 例子: ~~~bash 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`命令。 ![图片描述](https://segmentfault.com/img/bVbvw00?w=1126&h=962 "图片描述") 复制出来的结果: ~~~bash 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个步骤](https://link.segmentfault.com/?enc=S0zChWLUqxpIWgCEQIBrbw%3D%3D.dP0LRiz%2BB6jI8L03Rr6dTP9DDwu4iF2U7V1PK47nvrxANIflzlpBeHO3llPAnOwW)