http 是一个协议, 协议就是约定, 规定, 先不管为什么这么约定有什么高深的东西, 为了解决具体问题, 我们先要能使用协议, 理解协议中对我们有用的那部分数据, 是的, 我们不是研究生, 更不是纯研究, 所有的研究都要由具体的问题来驱动.
那这里的具体问题是什么? 就是看懂 http 的请求跟回复啊, 就像写某某申请一样, 你不理申请最终怎么传递出去, 你先要知道以什么格式来写, 对方回复后你怎么看明白它, 这才是基本的. 所以, http 的请求格式跟回复格式, 其实也只是形式上的东西, 形式是多变而不稳定的, 更不是什么深奥的东西, 它只是表达了一些内容.
那就来看看 http 请求与响应的形式上的东西吧.
本文介绍 http 请求与响应的报文结构, 以及 curl 的使用.
先抓个包来直观看一下, 在百度的搜索框中, 敲入 "helloworld" 并回车, 这时会发起一个 http 请求, 用 charles 来抓包(为什么用它? 因为我介绍过!), 可以看到这样的请求与响应的信息:
从数据包来看, 有一个 GET 方法, 返回了 200 的状态码, 等等. 但这里混合了请求与响应的信息, 如果分开来看, 请求与响应各自有什么数据组织结构呢?
(1)请求报文
http 请求数据, 使用的结构是这样的:
{请求行, 请求头, 请求体}
小程引用网上的一张图, 这张图描绘了这个结构:
参照上图, 请求行是这个样子:
GET /index.html HTTP/1.1
或者:
- POST /xiaocheng/about.HTML HTTP/1.1
- ...
注意, 请求行一般不包括 host 的地址, 而 host 地址存放在请求头中.
然后是请求头, 分为多行, 每一行是一个键值对(key: value 的格式), 比如请求头是这个样子的:
最后是请求体, 一般来说 GET 方法是不带请求体的, 因为所有内容都放到请求行 (特别是 url 中) 或请求头中了, 一般来说 POST 方法需要带请求体, 比如在 iTunes 下载一个 App 时, POST 请求数据是这样的:
不要觉得好新奇, 又是请求行, 请求头又是请求体的, 这都只是规则, 形式上的东西, 以这种形式传递了内容.
(2)响应报文
响应数据的结构, 也可以分三部分:
{响应行, 响应头, 响应体}
这里给一个响应实例:
响应行, 也叫状态行, 包括 http 的版本, 状态码与状态描述.
响应头跟请求头一样, 由一行一行的 key-value 构成.
响应体一般就是请求方想要的数据了, 但响应体不一定会存在, 比如 HEAD 请求方法时不返回响应体(这时响应行就是请求方想要的).
规则上是这样的, 响应 / 请求行就是一行, 响应 / 请求头就是 key-value 的集合, 响应 / 请求体就是各种格式的数据(xml,gif,PNG 等格式).
http 请求与响应数据, 还有其它的一些知识, 比如 GET 与 POST 的区别, 返回 404/403/303 表示什么意思, 等等, 这个谁用谁查, 不细说.
但我想说一个工具, 一个可以发起 http 请求的工具, 好用, 就是 curl.
(3)curl 的使用
小程使用的是 macos,Mac 自带了 curl 工具.
curl 的功能也算强大的, 提供了系列的选项, 这里只介绍一些常规的使用方式.
get 请求, 与保存
- curl www.baidu.com
- curl "http://172.17.21.197:54321?pa1=hello"
- // 保存, 下载
- curl -o file.HTML www.baidu.com
- curl -o i.jpg http://img3.douban.com/lpic/s4549903.jpg
- // -A 仿造 IE 与运行平台
- curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" www.baidu.com
- // -e 仿造入口链接(即 referer, 用于盗链)
- curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -e "www.google.com" www.baidu.com
- // -x 使用代理
- curl -x a.b.c.d:54321 http://google.com
- // -D 保存 cookie 到文件
- curl www.baidu.com -o aa.txt -D cookie.txt
- // -b 读取文件并当作 cookie 数据来请求
- curl www.baidu.com -b cookie.txt
- // -H 设置请求头, 这里设置了 cookie 跟 ua
- curl -H "Cookie: install_id=14621691626; sid_guard=\"0eb878191489e4247f643672c932c814|1504782359|2592000|Sat\054 07-Oct-2017 11:05:59 GMT\"; \n User-Agent: xxx/1.5.6 (iPhone; iOS 10.2; Scale/2.00)" "https://xxx.yy.com/..."
- post
- // -d 请求体
- curl -d "user=nickwolfe&password=12345" http://www.linuxidc.com/login.cgi
- curl -d "key=jet" 192.168.2.32:54321
post, 以表单的方式(multipart/form-data)
- // "file" 为 key 名, 随便起, 后面为文件路径(包括文件包)
- curl -F "file=@./myfile.ok" "http://172.17.xx.xx:54321"
总结一下, 本文介绍了 http 请求与响应报文的数据结构, 也介绍了用于发送 http 请求的工具 curl 的使用. 文章的目的, 一方面是让你巩固 http 报文的结构(其实这只是形式的东西, 不要太在意), 另一方面掌握一个便利的发送 http 请求的工具(这个就很实用了).
来源: https://www.cnblogs.com/freeself/p/10882404.html