目录
前言
上篇博客我们结束了前端的学习,接下来就要进行后端的学习,后端是最复杂也最难理解的一块部分!
HTTP
HTTP是一种应用非常广泛的应用层协议
HTTP协议格式
使用抓包工具来捕获请求交互的详细情况
抓包工具是个特殊的软件,相当于一个“代理程序”,浏览器给服务器发的请求就会经过这个代理程序,进一步的就能分析请求和响应的结果如何
请求的完整格式:
首行
请求头header
空行
一个HTTP请求的header可以有若干个,就使用空行,作为header的结束标记,类似于链表的null
正文body
有的请求有,有的请求没有
URL
1、IP地址+端口号
2、带层次的路径
3、查询字符串
URL encode:把原始的字符,转成转义后的字符
URL decode:把转义后的字符还原成原始的字符
方法
HTTP中非常重要的部分,可以把方法理解为这个请求想要做的工作
GET
最常用的HTTP请求方法
1、浏览器地址栏直接输入URL,此时就会触发GET
2、html里面的link,a,img,script也会触发GET请求
3、from表单,html里的from标签,可以构造出GET请求
4、ajax
POST
1、from
2、ajax
POST请求的特点:1、方法叫做POST;2、url通常是没有query string的;3、也是由若干个header,键值对的形式;4、通常有body,post在传递信息给服务器的时候,通常就会把信息放在body中
面试题:GET和POST的区别
1、GET和POST没有本质区别
使用GET实现的场景,基本都可以用POST代替
使用POST实现的场景,也可以用GET来代替
2、细节上的区别
2.1、GET的语义是“从服务器获取个数据”,POST的语义是“往服务器上提交个数据”
2.2、给服务器传递的数据,GET通常是放在url的query string中,POST通常是放在body中
2.3、GET请求建议实现成“幂等”,POST则一般不要求实现成“幂等”
2.4、在幂等的基础上,GET的请求结果是可以被缓存的,POST则一般不会被缓存
HTTP请求
认识请求“报头”(header)
Host
表示服务器主机的地址和端口
Content-Length
表示body中的数据长度
Content-Type
表示请求的body中的数据格式
User-Agent
表示浏览器/操作系统的属性
Referer
表示这个页面是从哪个页面跳转过来的
在浏览器地址栏里直接输入一个地址,没有referer,直接点收藏夹,也没有referer
Cookie
是浏览器在本地存储数据(硬盘)的一种机制
浏览器为了安全起见,禁止网页的js访问电脑的硬盘(文件系统),所以提供了特殊的api给网页来用,就可以让网页存储一些简单的数据。
Cookie中存储了一个字符串,这个数据可能是客户端(网页)自行通过JS写入的,也可能来自于服务器(服务器在HTTP相应的header中通过Set-Cookie字段给浏览器返回数据)
使用cookie作为保存数据的手段,只能存一些简单的键值对信息,简单的字符串,比如,可以用cookie存:
1、上次访问页面的时间
2、当前页面的访问次数
3、当前访问页面的身份信息(身份标识,id)
cookie是存在在浏览器的,来源是服务器。cookie都是浏览器访问了bing服务器之后由服务器返回的,在服务器返回的响应报文中,可以在响应header中包含一个/多个Set-Cookie这样的资源,浏览器看到Set-Cookie就会把这样的数据给保存在浏览器本地。当浏览器保存了cookie之后,下次浏览器访问同一个网站,就会把之前本地存储的cookie在通过http请求header中的cookie给带过去。
认识请求“正文”(body)
正文中的内容格式和header中的Content-Type是密切相关的
HTTP响应
状态码
状态码表示访问一个页面的结果(是访问成功,还是失败,还是其他的一些情况)
200
表示访问成功
404
表示想要访问服务器的资源在服务器上没有
403
表示访问被拒绝,有的页面通常需要用户具有一定的权限才能访问(登录后才能访问),如果用户没有登陆直接访问,就容易见到403
500
服务器内部错误(服务器代码执行过程中,出异常了)
504
访问超时(服务器请求量很大的时候)
302
重定向(访问一个旧的URL自动转移到新的URL)
1、服务器的地址迁移;2、搜索引擎中的点击跳转
类别 | 原因短语 | |
1xx | Informational(信息性状态码) | 接收的请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4xx | Client Error(客户端状态错误码) | 服务器无法处理请求 |
5xx | Server Error(服务器错误状态码) | 服务器处理请求出错 |
认识响应“报头”header
响应报头的基本格式和请求报头的格式基本一致
响应中Content-Type常见取值:
text/html:body的数据格式html
text/css:body数据格式是css
application/JavaScript:body数据格式是JavaScript
application/json:body数据格式是json
构造HTTP请求
通过form表单构造HTTP请求
form发送GET请求
<!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>form</title>
</head>
<body>
<form action="http://www.sogou.com" method="get">
<input type="text" name="11">
<input type="text" name="22">
<input type="submit" value="提交">
</form>
</body>
</html>
form发送POST请求
<!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>form</title>
</head>
<body>
<form action="http://www.sogou.com" method="post">
<input type="text" name="11">
<input type="text" name="22">
<input type="submit" value="提交">
</form>
</body>
</html>
此处的方法只支持get和post,借助这些标签来给请求构造数据,每个input就对应一个键值对,input的name属性就是键,input里用户的输入内容就是值。如果方法是get,键值对就会出现在url的query string中,如果方法是post,键值对就会放在body中。
通过ajax构造HTTP请求
使用第三方库,jquery代替原生的api(ajax)
发送GET请求
<!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>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
$.ajax({
type:'get',
url:'http://www.sogou.com',
body:'http请求的body',
contentType:'x-www-form-urlencode',
success:function(body){
//服务器返回一个正确的响应
//就会由浏览器调用这个sucess对应的函数,来处理响应
//参数body就是响应的正文
console.log("ok");
},
error:function(){
//服务器返回一个错误的响应
//就会由浏览器调用这个error对应的函数
console.log("error");
}
});
</script>
</body>
</html>
发送POST请求
<!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>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
$.ajax({
type:'post',
url:'http://www.sogou.com',
body:'http请求的body',
contentType:'x-www-form-urlencode',
success:function(body){
//服务器返回一个正确的响应
//就会由浏览器调用这个sucess对应的函数,来处理响应
//参数body就是响应的正文
console.log("ok");
},
error:function(){
//服务器返回一个错误的响应
//就会由浏览器调用这个error对应的函数
console.log("error");
}
});
</script>
</body>
</html>
HTTPS
HTTPS也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层
加密
加密就是把明文(要传输的信息)进行一系列的变换,生成密文
解密就是把密文再进行一系列变换,还原成明文
对称加密
加密和解密使用同一个密钥
非对称加密
加密和解密使用不同的密钥
HTTPS的工作过程
引入对称加密
对称加密其实就是通过同一个“密钥”,把明文加密成密文,并且能把密文解密成明文
引入非对称加密
非对称加密就是为了能安全的传输对称密钥,防止明文传输时,会导致密钥会被黑客拿到
引入证书
为了防止中间人攻击