HTTP协议
HTTP协议,又称超文本传输协议,是一种应用广泛的应用层协议。所谓超文本,其实就是除了文本还能传输其他资源。而HTTP本身是基于传输层的TCP协议实现的。目前HTTP协议3版本已经在完善中。本文采用1.1版本。
它是一种请求--响应的工作模式,浏览器处于主动地位,服务器处于被动地位。
当我们在浏览器中输入一个 搜狗搜索的 "网址" (URL) 时, 浏览器就给搜狗的服务器发送了一个 HTTP 请 求, 搜狗的服务器返回了一个 HTTP 响应. 这个响应结果被浏览器解析之后, 就展示成我们看到的页面内容. (这个过程中浏览器可能会给服务器发送 多个 HTTP 请求, 服务器会对应返回多个响应, 这些响应里就包含了页面 HTML, CSS, JavaScript, 图片, 字 体等信息).
浏览器通过URL请求资源可能出现四种结果:
1.URL中指定的web服务器进程不存在
2.进程存在但是对应的路径资源不存在
3.资源也存在,但是处理响应的过程中发生错误,大多为动态资源
4.完成响应
HTTP请求
URL格式:
协议://主机:端口/路径?查询字符串
请求(request)
请求里的内容要足够承载我们的诉求——web服务器能看到的所有东西都在请求中,其他的看不到
1.本次请求的是哪个URL
2.本次请求的动作:是从浏览器提交内容给服务器,还是浏览器从服务器取东西
3.本次请求遵循哪个版本的HTTP协议
4.本次请求的一些专门的描述
5.如果本次请求是从浏览器向服务器提交内容,内容放哪里?
请求格式:
请求行 请求头们 --请求方法--请求资源URL--请求版本--可能的请求体
一个请求 = 请求行 请求头 请求体 其中请求行必须存在,其他可以不存在
请求行 = 请求方法 空格 请求资源URL/路径 空格 请求协议版本 \r\n
请求头们 = 请求头\r\n请求头\r\n...请求头\r\n\r\n(最后一个\r\n是空白行)
请求头 = Name:Value\r\n
请求体没有格式要求
HTTP为文本协议:请求就是一个字符串,写出如下,经过网络发送给指定的web服务器进程
请求的主体是客户端
请求方法
在浏览器中输入URL按下回车发起的就是GET请求,表单提交时可以使用post请求
<a href = "....."> <img src = "...">都是get请求
方法使用为method = “方法名称”
GET与POST
1.GET与POST都是i请求方法:GET:取 POST:提交
2.所有资源都有一个特性:资源支持被什么方法请求
3.对于浏览器
1.POST请求:from表单+method=”POST“、使用JS的ajax、还有其他工具
2.GET请求:浏览器地址栏+回车/刷新/标签关联
4.GET请求不会有请求体(不能有)POST允许有(可以没有)
5.GET请求最好是具备幂等性 POST请求一般不具备幂等性
幂等性:在不考虑外部环境变化的前提下,对同一个资源多次请求,总是得到相同的结果。
SQL中select就具备幂等性,无论select多少次都是相同的结果
但是insert就不具备,一次插入成功第二次可能就失败了
另外,select的幂等性不具备副作用,不会有别的作用发生,而update具备幂等性就有副作用。
6.由于GET请求具备幂等性,使得GET请求允许被缓存,缓存的结果用于下一次查询
而POST不具备幂等性,不允许缓存
7.from既可以使用get也可以使用post提交数据,但表现上有所区别:
1.get上不允许携带请求体,使得要提交的数据只能放到URL的查询字符串中
2.post请求允许携带请求体,所以,提交的数据一般都是放在请求体中,url保持为/path(也可放在查询字符串中)
请求头
Name:Value\r\n
HTTP协议并没有死规定过Name与Value是什么,所以这里的name和value可以自行去写,但是一些常见的name有约定成俗的规定。
HOST:124.0.0.1:8080 主机 网络建立连接 连接到一个具体的web服务器进程,由于这个进程下有多个主机,所以这个HOST请求头表示我们要请求的是哪个主机下的资源
Content-XXX请求头 /响应头 描述请求头/响应头 的特征的
Content: 指的是body 请求是请求体,响应是响应体
Content-Length :body的长度,字节为单位
Content-Type:body的内容类型(有严格规定—MIMI type)如果希望对象(如果是响应,则对象是浏览器)按照指定类型格式处理响应的内容,就在Content-Type指定即可
响应
响应的主体是服务器,由服务器收到一次请求后被动发起。
服务器能响应一次的请求的前提:浏览器发起的请求满足:
1.主机存在
2.端口存在
3.没有防火墙阻拦网络连接
格式
响应行=状态(状态码+状态描述) 响应的协议版本信息
响应头=Name:Value\r\n.......Name:Value\r\n\r\n
响应体=资源的内容(一般响应都是有响应体的)
无论是谁,只要遵守HTTP请求/响应的格式,都可以正常通信。
结合动态资源
动态资源在springMVC中主要体现为
一个方法,这个方法必须:
1.这个方法属于一个类,这个类被@Controller注解修饰
2.这个方法必须被@RequestMapping注解修饰,并且通过这个注解制定了资源的路径(该资源路径全工程不能重复且为绝对路径)
进行配置
web服务器中的资源,唯一路径,静态资源一般支持get和post方法,动态资源一般是进行配置,不配置则全支持。