https://www.huaweicloud.com/articles/736eef13dc3e4d73b10d155557bb93c5.html(这个文章写的特别详细,如果本笔记没有的内容可以考虑上这里搜索)
http 是超文本传输协议,它允许将超文本标记语言(html)文档从服务器传输到客户端。除了传html还可以传其他的类型数据,例如json,二进制数据等。(如果被获取的url是一个文件,就直接会触发浏览器的下载;也可以是html,就会有网页页面)
http协议是无状态的,短连接的,每一次的客户端请求都是一个新的连接,完成响应后便会关闭连接,同时http是无状态的,上一次请求和这一次的请求无关,相同的用户和请求都被当成新的请求来处理,这会导致响应速度变慢,而cookies就是解决这种问题的方法。
在浏览器中,打开网页是去获取html页面,而这个html页面中有很多元素,例如各种图片、css、js文件等等,此时浏览器会再去request这些数据,最终展示成一个完整的有内容的页面给用户。
url
url的参数通过?后的key-value形式给出
/mypath/helloworld.html?name=rex&age=25&sex=man
http request
http请求包的结构如下:

第一行有请求方法,例如GET、POST、PUT、DELETE等,然后有这次要访问的url以及使用的http协议版本,例如HTTP/1.1.
紧接着的几行就是header,头部信息,这些头部信息可以是http协议约定好的一些字段,也可以是用户自己设置的一些字段,如果是前者则会影响http通信的行为。
header完空一行后的下一行开始,就是请求体,如果是post请求,请求体就有post请求的数据内容,例如可以是json数据。

一些常用的请求头字段:
1、Accept
表示浏览器(客户端)可以接受的媒体类型
Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档,
如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)
Accept: / 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)
2、User-Agent
告诉服务器,客户端使用的浏览器和操作系统信息
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
3、Accept-Charset
客户端声明自己接受的字符集编码
4、Accept-Encoding
客户端声明自己使用的数据编码格式,通常指定为压缩的格式,例如gzip、defalte,表示支持压缩算法,不是字符集的编码
http response
http的回包结构如下:

第一行是状态行,有协议版本,http的状态码以及状态信息(例如HTTP/1.1 200 OK)
第二行开始也是header,这些header有和真实数据相关的字段,也有和request header中相对应的字段,这需要详细看。
空一行后,就是响应体,真实的数据都在这,可以是html文档的内容,也可以是json,甚至可以是文件二进制数据等。
状态码:
HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别
1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求
其中302 Found表示重定向,服务器会回一个新的url给浏览器,浏览器会自动访问这个URL
304 Not modified 表示上次的文档已经被缓存,可以继续使用(客户端用这种制度来确定是否要更新本地的缓存,如果不用,用户响应速度会提高)
400 Bad request 客户端请求与语法错误,不能被服务端理解
403 Forbidden 客户端没有权限访问某个uri,或者这个uri在服务端没有开放
404 Not found 表示服务端没有这个uri资源,一般是客户端url拼错了
500 Internal Server Error 服务器内部错误
503 Server Unavailable 服务器暂时不可用,无法处理用户请求,一段时间后可恢复
总的来说,request和response的包体结构相似,header有相互对应的,也有独立的。
Accept和Content-Type两个头部字段的区别
1.Accept属于请求头, Content-Type属于实体头。
Http报头分为通用报头,请求报头,响应报头和实体报头。
请求方的http报头结构:通用报头|请求报头|实体报头
响应方的http报头结构:通用报头|响应报头|实体报头
2.Accept代表发送端(客户端)希望接受的数据类型。
比如:Accept:text/xml;
代表客户端希望接受的数据类型是xml类型
Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。
比如:Content-Type:text/html;
代表发送端发送的数据格式是html。
二者合起来,
Accept:text/xml;
Content-Type:text/html
即代表希望接受的数据类型是xml格式,本次请求发送的数据的数据格式是html。
Accept是告诉服务端,我(客户端)想要接受的是什么格式的数据,而Content-Type则是告诉接收方,传给你的数据是什么格式,是两个方向的事。

除了上面http协议自身定义好的头部字段以外,还可以用户自定义头部字段,例如可以将一些参数用key-value的形式写到header中,接收方去查header一样可以得到参数值:

body和form的关系
body是http的实体,可以是请求包的请求体,也可以是响应包的响应体,是包结构中的最后一块内容,body不指代具体类型的数据,只是对这块数据的统称。
form是body的一种数据类型,类似json数据也可以是body一样(像框架直接去get body反序列化写到json对象中,相应的content-type就是application/json),这个具体解析方法,要根据content-type来决定,以及使用相应的api来解析数据。
想要在body中发送不同类型的数据,就要确定好Content-Type

get和post的区别
1、get是不安全的,是明文的,所有的参数信息会带在url中,如果关键信息在url中,别人一眼可以看出,存在风险
2、虽然http没有对get限制参数的长度大小,但是一般浏览器有url长度限制,一般为2k,加上请求数据也会被放到url中,所以get操作一般不用于传输大量数据,只是简单的获取资源,要传大量数据请使用post
3、get请求要从参数中获取数据,而post请求则是在body中获取
代理和反向代理
代理是代理客户端,反向代理是代理服务端;
(客户端的流量必须经过的服务就叫代理,而服务器的流量必须经过的服务就叫反向代理)

例如我们访问外网的vpn就是代理,而API网关就是反向代理,因为前者代理我们客户端的请求到服务器,而后者是代理服务端,客户端不知道确切的服务器是谁;
代理使客户端对服务器透明,服务器不知道客户端是谁;
反向代理使服务端对客户端透明,客户端不知道服务器是谁(确切访问的是哪个主机);
跨域请求
https://juejin.cn/post/6844903954455724045
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS
跨域请求的场景是指:
用户在站点A的页面,发起请求时,请求了站点B的资源,这时候就会触发跨域;
而浏览器一般在跨域请求之前,会先请求站点B(预检请求)来确认是否可以进行跨域访问站点。
这类预检请求,method为option,通过一些http规范规定的头部来和服务端进行通信,确认服务端B是否支持跨域请求,以及响应的跨域策略。
预检请求的时序图:

这类请求头都是以Access-Control开头的,分为请求和响应头两类
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS#http_%E8%AF%B7%E6%B1%82%E9%A6%96%E9%83%A8%E5%AD%97%E6%AE%B5
请求头:
Access-Control-Request-Method
用于检查服务端是否支持跨域的某种method请求
Access-Control-Request-Headers
用于确认服务端支持的标准外的头部字段
Origin
表示跨域的来源请求方,在上面的例子中,跨域时,origin为站点A的host
响应头:
Access-Control-Allow-Origin
服务端返回的放通的、允许的跨域请求源,也即非这些origin的跨域请求,均当作非法
Access-Control-Expose-Headers

Access-Control-Max-Age
表示预检请求的结果能够被客户端缓存多久,这个时间内的预检请求结果有效
Access-Control-Allow-Credentials
指定了当浏览器的 credentials 设置为 true 时是否允许浏览器读取 response 的内容。当用在对 preflight 预检测请求的响应中时,它指定了实际的请求是否可以使用 credentials。
简单来说,就是是否允许将站点A的cookie等信息透传给站点B
Access-Control-Allow-Methods
服务端支持的跨域请求method
Access-Control-Allow-Headers
服务端允许的跨域请求带过来的自定义的(非http规范的)头部,首部字段用于预检请求的响应。其指明了实际请求中允许携带的首部字段。
跨域请求的核心标志其实是需要有Origin或者Referer的字段,这样的请求,在服务端接受后,会被判为跨域的请求,如果请求头中没有这两个字段,即使有相关的Access-Control的头部,也不会被当作跨域请求,就是一个普通请求,这时候不会触发服务端的跨域问题。
如果服务在跨域上限制比较多,可以考虑让请求方去掉origin和referer头部。