请求
报头
里面是一系列键值对,有的是标准定义的,有的是自定义的
典型的有以下几个
Host
代表服务器的主机地址和端口
也就是当我们访问浏览器时,可以知道从哪里获取数据
端口号如果省略就代表是默认值,http是80,https是443
URL中也有端口号和IP地址,而这两者并不一定一样
当目标服务器有代理时,请求的URL的主机地址就是代理的地址,而Host中的地址是服务器的地址
Content-Length
表示body中的数据的长度
由于我们Http早起是采用TCP传输的,因此具有粘包问题,所以需要给定报文长度
Content-Type
表示body中的数据格式
不同的数据类型格式采用的解析方式是不一样的,因此需要指定
常见有以下几种类型
- form表单提交的数据格式
application/x-www-form-urlencoded: form
- 表单提交的数据格式(提交文件时)
multipart/form-data: form
- json数据
application/json
User-Agent
用来表示浏览器和操作系统的一系列属性
例如一下几种
- 多少位系统
- win几的系统
- 浏览器的内核
- 浏览器的版本号
由于早期互联网时代大家的设备差异比较大,因此不同的设备需要不同的页面显示方式,差一点的设备就少显示一点图,好一点的设备就多显示一点,不同的浏览器对页面的支持程度也是不一样的,因此通过传输这个属性给服务器,服务器就知道该给你返回什么样的页面了
Referer
代表当前页面是从哪一个页面跳转过来的
如果当前页面是直接输入地址打开的,或者从收藏夹打开的,那就没有Referer
通过Referer,可以核定一个浏览器为广告商带来了多少的引流
Cookie
由于为了防止某些恶意网站入侵我们的电脑,使得我们的磁盘中的文件遭到篡改与删除,因此浏览器的网页都是不能访问硬盘的
因此,浏览器为网页提供了一系列api,让网页存储简单的数据,cookie就是其中的一种,是服务器发送给浏览器一些简单的数据,方便网页的跳转与再次打开
cookie以键值对的形式存储数据
比如可以传下面这几种数据
- 当前访问网页的用户信息
- 当前访问的位置
- 访问的次数和时间
服务器的响应报文中,set-cookie的数据是设置cookie的数据,比如存储用户信息
当浏览器再次访问这个网站时,网站会把之前存储的cookie传输给服务器,这样的话服务器就得到了身份信息,就不用再次登陆了
例如,给大家抓个包,看一下前面提到的这几个概念
GET /sw.js HTTP/1.1
(这里就是主机地址和端口)
Host: blog.csdn.net
Origin: https://blog.csdn.net
Accept-Encoding: gzip, deflate, br
(这里是cookie)
Cookie: c_dsid=11_1668321926105.806691; dc_session_id=10_1668321931278.555733; log_Id_click=794; log_Id_view=1736; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1668322413; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1668075076,1668215971,1668304024,1668321927; c_page_id=default; c_pref=https%3A//blog.csdn.net/; c_ref=https%3A//mp.csdn.net/; c_segment=2; dc_tos=rl9xt8; log_Id_pv=676; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=6525*1*10_19406376060-1636882844312-793122!5744*1*m0_60867520; Hm_up_6bcd52f51e9b3dce32bec4a3997715ac=%7B%22islogin%22%3A%7B%22value%22%3A%221%22%2C%22scope%22%3A1%7D%2C%22isonline%22%3A%7B%22value%22%3A%221%22%2C%22scope%22%3A1%7D%2C%22isvip%22%3A%7B%22value%22%3A%220%22%2C%22scope%22%3A1%7D%2C%22uid_%22%3A%7B%22value%22%3A%22m0_60867520%22%2C%22scope%22%3A1%7D%7D; __bid_n=183e5bc0225476c4084207; c_first_page=https%3A//blog.csdn.net/m0_60867520%3Fspm%3D1000.2115.3001.5343; c_first_ref=default; dc_sid=a39818fac3c56bf45e17bae53186475e; HWWAFSESID=1bd914e48a3f275855f; HWWAFSESTIME=1668321923442; FCNEC=%5B%5B%22AKsRol_XiY2H06P5Xlw3z7LQfwhl4kqvq5sIj4R2iX7vxEhCs08i5Qfm5nQ9hXeBbbv5FhhSbIwcDxwqNW-JDnQzByjf98hzA6ShijaMOwYSkJbQeQTeoHl1KMfL3s1v6Xg97Mlx6w-MMW0TDYDGmfwWd9298lo5DQ%3D%3D%22%5D%2Cnull%2C%5B%5D%5D; __gpi=UID=000009711177805a:T=1662280592:RT=1668304025:S=ALNI_MadB__bBPsEbHe_0fVn_E4rh8bltA; is_advert=1; firstDie=1; ssxmod_itna=eqRxRDBDcD9AKGKGH0hC07GkQD7GeiQq8eHYImDlxQwPGzDAxn40iDto=qhnornhiY=fKnOG+diGnrP0Iq7PrP5PfbnRedoD84i7DKqibDCqD1D3qDkbiYxiiDGdU8nDDx0rDG4iafmTy1pxKDUY2WrYhNk=idKeRqZAibK0GY=GWbqDrpeGG5GCh+w9hzKOhNKYD===; ssxmod_itna2=eqRxRDBDcD9AKGKGH0hC07GkQD7GeiQq8eHYeD6p4QqmxDskjDLQQeOum0Dqn+48Ye/wh68e/=GKe88/O0o6m/+fh758rrDpD=sjiepaKYNxTddHs=uzUF9x1/PnyRyE6=5BypZi5yDVWw1nAirZrmNHpPaylcFVQWhLPm8VCaa3tgbL=Ww7IB80EAp3bS86E7WGfgpUfBb63dFg6K6CpcLnIWFPbiXgZmUTxq6yDwXd1YUKkkRNXeexhrY3ZPeY7eKmD1h3AhGrEOb=h9TeFuDiDwgxPT1Kpnw9cE2c6/rKugaZmw1zE5GBdj0dCoQifoCO8omYOqbxhd3GiKY3orx3uYN2DcEopwiHgGTbhKwaertrwrc3dCQowLKjwizeKO8YN2CRqKwLoAMdkTidrT/MdWdKx6K5RHF2O83H+Rkdo7HbOc+bi67WcE=pEFmLt2k1ZpeOvwpApP=CoArbjCOC1a64oPD7jgDGcDG7uODNDx8TDD==; __gads=ID=4ea7d0a4ecd37ee1-2235438dd8d70085:T=1667202525:RT=1667202525:S=ALNI_MaMuEad1hYwTDZx_QZCGwFd0sQKhw; FPTOKEN=30$MopefTes+oZpPK6toPAhBx51Jkf9qoNou5sQ5nIqneIX4PhBtpAsxtEBc76AQs9WOaJjwxItblyB8EW/sLxs5T0I/kL/KjtpLbx6pk/ojEIhGiQzqoGscV8k9FHd4HmCpud/RXGieejdSIq95AICEhi1Erl95ummz/XBzvkWzFjSgo+/txL4p5ETCor0ixhOlDaIgbhfR2JBIHMSmhtQ+JbbP1LrdVB2+wxtLITOnssE02CuNBj0Gy/E/xsjoXQnuC/mIVOTaUEIRRaDkxOR6fOy/n50FWt84MYUuC26etIhLyJ9pVxZP3ss6H/fXqEzgrfgv4AiRzMR+wcHhU5cSCLlOdSislMsyQqKnLonQyEGR683E6xMtOl8CgDMZi+yTzZr6n5vMwHih5kMA2ZualamIb1KhHtyCrz/OzfeDMc=|2t9hFLuiMkraJiWOrBtyMNOEfpEtZpoKTRFhp0enI3o=|10|54642beb2d74356187b795abbc93d44c; c_dl_fpage=/download/u012513463/77747331; c_dl_fref=https://blog.csdn.net/qq_24950043/article/details/125714225; c_dl_prid=1665566040391_574973; c_dl_rid=1666093978240_243831; c_dl_um=-; AU=E5A; BT=1660286910129; UN=m0_60867520; UserInfo=1dd1ec314c054470a954e82931020212; UserName=m0_60867520; UserNick=Xiaolock830; UserToken=1dd1ec314c054470a954e82931020212; p_uid=U010000; uuid_tt_dd=10_19406376060-1636882844312-793122
Connection: keep-alive
Accept: */*
(这里是浏览器和操作系统的信息)
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15
Accept-Language: zh-CN,zh-Hans;q=0.9
(这里是浏览器跳转前的地址)
Referer:
Service-Worker: script
构造http请求
有以下几种不同的构造方法
- 浏览起自己通过url构造请求
- form表单
- ajax
form表单
只支持get和post方法
其中的action表示要访问的网页
input中的name是键
input中的用户输入的值是值,和name构成键值对
如果是get请求,就将键值对放到url中,如果是post就放在body中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="http://www.sogou.com" method="get">
<input type="text" name="aaa">
<input type="text" name="bbb">
<input type="submit" value="提交">
</form>
</body>
</html>
最终的url长这样
如果是post方法,那我们只能用抓包工具来看body中的内容了
ajax
全称是Asynchronous Javascript And XML
其中的Asynchronous代表异步的
在之前的多线程中讲的同步(synchronized)表示的是互斥
而在网络通信中,同步代表发起请求者同时也接受响应,异步代表发起请求者不接受响应,由其他的人来推送过来
form的请求一定会触发页面的跳转
ajax的请求默认不会引发页面跳转
由于浏览器的原声ajax的api不好用,因此我们可以引入jquery,这个第三方库封装好的api更好用
jquery直接上网搜索即可,选择.min.js,复制其script标签
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script>
$.ajax({
type: 'post',
url: 'http://sogou.com',
data: 'http请求的body',
contentType: 'x-www-form-urlencoded',
success: function(body){
//浏览器返回正常响应时调用这个函数,body为响应正文
console.log('ok');
},
error: function(){
//浏览器返回错误响应时调用这个函数
console.log('error');
}
});
</script>
使用这种方法在浏览器中会看到报错,这是因为默认情况下域名a是无法访问域名b的资源的,也就是说搜狗拒绝了我们的访问。如果我们的项目是在同一个服务器下相互访问的就不会报错
这种情况下,我们可以用postman来进行测试,这是一个专门用来构造请求的工具,方便了我们的测试
响应
状态码
我们上网常常看到的404网页就是一个状态码,表示了请求的状态,可以告诉我们请求是否成功,为什么失败
最常见的状态码有以下几种
类型
号码开头 | 类型 | 原因. |
---|---|---|
1xx | 信息性状态码 | 接收的请求正在处理 |
2xx | 成功状态码 | 请求正常处理完毕 |
3xx | 重定向状态码 | 需要附加操作以完成请求 |
4xx | 客户端错误状态码 | 服务器无法处理请求 |
5xx | 服务器错误状态码 | 服务器处理请求出错 |
具体实例
200
表示访问成功
大家抓包时看到的最多的响应的状态码都是200
404
not found
产生错误的原因就是请求的路径错了
访问的资源服务器上没有了,就会返回404
403
表示访问访问被拒绝
也就是我们的访问权限不够,只有管理员或者特定的用户才能访问这个网站
500
表示服务器内部错误
也就是服务器里有bug,比如说空指针异常了,我们很少见到,除非是自己写的代码
504
表示访问超时
如果服务器的访问流量过大,就会出现访问超时的情况
302
表示重定向
如果以前的网站的域名不用了,换成了新的域名,就需要重定向,还有我们的网页跳转也是重定向
418
是一个彩蛋,418I’m a teapot
在许多年前,电脑上安装一个软件,很有可能安装下来的根本就不是你想要的那个软件
这是因为,运营商劫持了我们网上传输的数据,替代了新的数据给我们
为了防止这种事情发生,也为了防止黑客对我们数据的入侵,因此发明了更为安全的传输协议——HTTPS
加密
加密是指用密钥把明文变成密文
与之对应的,解密就是把密文变成明文
对称加密
而当一个服务器想要让客户端把传输过来的用户信息进行加密时,双方都要知道这个密钥是什么,这就是对称加密。但显然,你这个密钥被更多人知道,你的信息被破获的概率就更大,因此一个服务器给不同的客户端不同的密钥
但这样的话,服务器就需要同时掌握多个密钥,一一进行匹配,大量的浪费了资源
不对称加密
因此,根据数学上的一系列规律,发明了不对称加密,客户端的密钥是不同的,而服务器只用一个密钥就可以把所有的密文破解为明文,客户端拿到的是公钥,这个公钥告诉谁都可以,而服务器拿到的是私钥,这个私钥只能自己持有
但是,如果黑客先冒充客户端,向服务器获取了公钥,再冒充服务器,向客户端提供了自己篡改后的公钥。这时,客户端传输过来的数据就是按照黑客的钥匙加密的数据了,黑客就可以看了。而且还可以用之前获取的公钥对明文重新加密成正确的格式,发送给服务器,使服务器与客户端之间正常的工作
证书
证书是为了保证公钥是服务器提供的而不是黑客提供的
第三方公证机构会给各个服务器的资质进行审查,然后颁发证书
客户端在向服务器获取公钥前,会先对服务器获取证书,然后看这个证书是否合法,然后才会进行传输数据
因此,如果是没有证书的网站,浏览器会警告我们这个网站很危险,也有时候会告诉我们这个网站的证书过期了