好程序员web前端教程JavaScript系列之HTTP
好程序员web前端教程JavaScript系列之HTTP:http 是我们前后台交互的时候的传输协议(即超文本传输协议)
HTTP 的工作流程
.和服务器建立链接
.建立链接后,发送一个请求给服务器(请求)
.服务器接受到请求以后进行相应的处理并给出一个回应(响应)
.断开于服务器的链接
和服务器建立链接
怎么和服务器建立链接呢?
需要保证客户端的接受和发送正常,服务器端的接受和发送正常
这里就涉及到一个东西叫做 TCP/IP 协议
建立链接的主要步骤叫做 三次握手
1、客户端发送一个消息给到服务端
此时: 服务端知道了 客户端可以正常发送消息 服务端知道了 服务端可以正常接受消息
2、服务端回给客户端一个消息
此时:
服务端知道了 客户端可以正常发送消息
服务端知道了 服务端可以正常接受消息
客户端知道了 客户端可以正常发送消息
客户端知道了 客户端可以正常接受消息
客户端知道了 服务端可以正常接受消息
客户端知道了 服务端可以正常发送消息
3、客户端再回给服务端一个消息
此时:
服务端知道了 客户端可以正常发送消息
服务端知道了 服务端可以正常接受消息
客户端知道了 客户端可以正常发送消息
客户端知道了 客户端可以正常接受消息
客户端知道了 服务端可以正常接受消息
客户端知道了 服务端可以正常发送消息
服务端知道了 服务端可以正常发送消息
服务端知道了 客户端可以正常接受消息
至此,依照 TCP/IP 协议的建立链接就建立好了
双方都知道双方可以正常收发消息
就可以进入到第二步,通讯了
发送一个请求
建立完链接以后就是发送请求的过程
我们的每一个请求都要把我们的所有信息都包含请求
每一个请求都会有一个 请求报文
在 请求报文 中会包含我们所有的请求信息(也就是我们要和服务端说的话都在里面)
我们的请求报文中会包含几个东西
1、请求行
POST /user HTTP/1.1
POST 请求方式
/user 请求URL(不包含域名)
HTTP/1.1 请求协议版本
2、请求头(请求头都是键值对的形式出现的)
user-agent: Mozilla/5.0 # 产生请求的浏览器信息accept: application/json # 表示客户端希望接受的数据类型Content-Type: application/x-www-form-urlencoded # 客户端发送的实体数据格式Host: 127.0.0.1 # 请求的主机名(IP)
3、请求空行(请求头和请求主体之间要留一个空白行)
就是一个空行
4、请求体(本次请求携带的数据)
GET 请求是没有请求体数据的
POST 请求才有请求体数据
接下来看一个完整的请求报文
POST /user HTTP/1.1 # 请求行
Host: www.user.com
Content-Type: application/x-www-form-urlencoded
accept: application/json
User-agent: Mozilla/5.0. # 以上是首部
(此处必须有一空行) # 空行分割header和请求内容
name=world # 请求体
接受一个响应
客户端的请求发送到服务端以后
服务端进行对应的处理
会给我们返回一个响应
每一个响应都会有一个 响应报文
在 响应报文 中会包含我们所有的响应信息(也就是服务端在接受到客户端请求以后,给我们的回信)
我们的 响应报文 中会包含几个信息
1、状态行
HTTP/1.1 200 OK
HTTP/1.1 服务器使用的 HTTP 协议版本
200 响应状态码
OK 对响应状态码的简单解释
2、响应头
Date: Jan, 14 Aug 2019 12:42:30 GMT # 服务器时间
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45 # 服务器类型
Content-Type: text/html # 服务端给客户端的数据类型
Content-Length: 11 # 服务端给客户端的数据长度
3、响应体
hello world
服务端给客户端的响应数据
断开于服务端的链接
之前我们的建立链接是基于 TCP/IP 协议的 三次握手
我们的断开链接是基于 TCP/IP 协议的 四次挥手
.客户端发送一个我要断开的消息给服务端
.服务端接受到以后发送一个消息告诉客户端我已经进入关闭等待状态
.服务端再次发送一个消息告诉客户端,这个是我的最后一次消息给你,当我再接受到消息的时候就会关闭
.客户端接受到服务端的消息以后,告诉服务器,我已经关闭,这个是给你的最后一个消息
完成一个 HTTP 请求
至此,一个 HTTP 请求就完整的完成了
一个 HTTP 请求必须要包含的四个步骤就是
.建立链接
.发送请求
.接受响应
.断开链接
在一个 HTTP 请求中,请求的部分有请求报文,接受响应的部分有响应报文
请求报文包含
.请求行
.请求头
.请求空行
.请求体
响应报文
.状态行
.响应头
.响应体
常见的 HTTP 响应状态码
在一个 HTTP 请求的响应报文中的状态行会有一个响应状态码
这个状态码是用来描述本次响应的状态的
通常会出现五种状态码
.100 ~ 199
.200 ~ 299
.300 ~ 399
.400 ~ 499
.500 ~ 599
100 ~ 199
一般我们看不到,因为表示请求继续
100: 继续请求,前面的一部分内容服务端已经接受到了,正在等待后续内容
101: 请求者已经准备切换协议,服务器页表示同意
200 ~ 299
2 开头的都是表示成功,本次请求成功了,只不过不一样的状态码有不一样的含义(语义化)
200: 标准请求成功(一般表示服务端提供的是网页)
201: 创建成功(一般是注册的时候,表示新用户信息已经添加到数据库)
203: 表示服务器已经成功处理了请求,但是返回的信息可能来自另一源
204: 服务端已经成功处理了请求,但是没有任何数据返回
300 ~ 399
3 开头也是成功的一种,但是一般表示重定向
301: 永久重定向
302: 临时重定向
304: 使用的是缓存的数据
305: 使用代理
400 ~ 499
4 开头表示客户端出现错误了
400: 请求的语法服务端不认识
401: 未授权(你要登录的网站需要授权登录)
403: 服务器拒绝了你的请求
404: 服务器找不到你请求的 URL
407: 你的代理没有授权
408: 请求超时
410: 你请求的数据已经被服务端永久删除
500 ~ 599
5 开头的表示服务端出现了错误
500: 服务器内部错误
503: 服务器当前不可用(过载或者维护)
505: 请求的协议服务器不支持
常见的 HTTP 请求方式
每一个 HTTP 请求在请求行里面会有一个东西叫做请求方式
不同的请求方式代表的含义不同
.GET: 一般用于获取一些信息使用(获取列表)
.POST: 一般用于发送一些数据给服务端(登录)
.PUT: 一般用于发送一些数据给服务当让其添加新数据(注册)
.DELETE: 一般用域删除某些数据
.HEAD: 类似于 GET 的请求,只不过一般没有响应的具体内容,用于获取报文头
.CONNECT: HTTP/1.1 中预留的方式,一般用于管道链接改变为代理的时候使用
.PATCH: 是和 PUT 方式类似的一个方式,一般用于更新局部数据
.OPTIONS: 允许客户端查看服务端性能
我们比较常用的就是 GET 和 POST
GET 请求
参数以 querystring 的形式发送,也就是直接拼接在 请求路径的后面
GET 请求会被浏览器主动缓存
GET 请求根据不同的浏览器对长度是有限制的
IE: 2083 个字符
FireFox: 65536 个字符
Safari: 80000 个字符
Opera: 190000 个字符
Chrome: 8182 个字符
APACHE(server): 理论上接受的最大长度是 8192 个字符(有待商榷)
对参数的类型有限制,只接受 ASCII 码的格式
GET 请求是明文发送,相对不安全
POST 请求
参数以 request body的形式发送,也就是放在请求体中
POST 请求不会被浏览器主动缓存,除非手动设置
POST 请求理论上是没有限制的,除非服务端做了限制
对参数类型没有限制,理论上可以传递任意数据类型,只不过要和请求头对应
POST 请求是密文发送,相对安全
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
好程序员Python教程系列-第6讲:循环结构
好程序员Python教程系列-第6讲:循环结构,应用场景:我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景。例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令。在这个场景中,让机器人向球门方向移动就是一个需要重复的动作,当然这里还会用到上一课讲的分支结构来判断机器人是否持球以及是否进入射门范围。再举一个简单的例子,如果要实现每隔1秒中在屏幕上打印一次“hello, world”并持续打印一个小时,我们肯定不能够直接把print('hello, world')这句代码写3600遍,这里同样需要循环结构。循环结构就是程序中控制某条或某些指令重复执行的结构。在Python中构造循环结构有两种做法,一种是for-in循环,一种是while循环。for-in循环如果明确的知道循环执行的次数,我们推荐使用for-in循环,例如计算1到100的和,即。"""用for循环实现1~100求和 Version: 0.1Author: 骆昊"""total = 0for x in range(1, 101): total += x...
- 下一篇
Java单元测试之 Spring Test
Spring框架提供了测试工具spring-test <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> spring-test可以结合JUnit很轻松的进行单元测试 import org.junit.runner.RunWith; import org.springframework.test.context.Contex
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Red5直播服务器,属于Java语言的直播服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Hadoop3单机部署,实现最简伪集群