HTTP,request,response
一、HTTP协议
Hypertext Transfer Protocol,超文本传输协议,HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
- HTTP 优点
- 灵活可扩展。一个是语法上只规定了基本格式,空格分隔单词,换行分隔字段等。另外一个就是传输形式上不仅可以传输文本,还可以传输图片,视频等任意数据。
- 请求-应答模式,通常而言,就是一方发送消息,另外一方要接受消息,或者是做出相应等。
- 可靠传输,HTTP是基于TCP/IP,因此把这一特性继承了下来。
- 无状态。
- HTTP 缺点
- 无状态,有时候,需要保存信息,比如像购物系统,需要保留下顾客信息等等,另外一方面,有时候,无状态也会减少网络开销,比如类似直播行业这样子等,这个还是分场景来说。
- 明文传输,
即协议里的报文(主要指的是头部)不使用二进制数据,而是文本形式
。这让HTTP的报文信息暴露给了外界,给攻击者带来了便利。- 队头阻塞,当http开启长连接时,共用一个TCP连接,
当某个请求时间过长时,其他的请求只能处于阻塞状态,这就是队头阻塞问题
。
- HTTP/1.0 HTTP1.1 HTTP2.0版本之间的差异
- HTTP 0.9
1991年,原型版本,功能简陋,只有一个命令GET,只支持纯文本内容,该版本已过时。
- HTTP 1.0
任何格式的内容都可以发送,这使得互联网不仅可以传输文字,还能传输图像、视频、二进制等文件。
除了GET命令,还引入了POST命令和HEAD命令。http请求和回应的格式改变,除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。只使用 header 中的 If-Modified-Since 和 Expires 作为缓存失效的标准。不支持断点续传,也就是说,每次都会传送全部的页面和数据。通常每台计算机只能绑定一个 IP,所以请求消息中的 URL 并没有传递主机名(hostname)
- HTTP 1.1
http1.1是目前最为主流的http协议版本
,从1999年发布至今,仍是主流的http协议版本。引入了持久连接( persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。
长连接的连接时长可以通过请求头中的 keep-alive 来设置引入了管道机制( pipelining),即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率。
HTTP 1.1 中新增加了 E-tag,If-Unmodified-Since, If-Match, If-None-Match 等缓存控制标头来控制缓存失效。支持断点续传
,通过使用请求头中的 Range 来实现。使用了虚拟网络,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。新增方法:PUT、 PATCH、 OPTIONS、 DELETE。
- http1.x版本问题
在传输数据过程中,所有内容都是明文,客户端和服务器端都无法验证对方的身份,无法保证数据的安全性。HTTP/1.1 版本默认允许复用TCP连接,但是在同一个TCP连接里,所有数据通信是按次序进行的,服务器通常在处理完一个回应后,才会继续去处理下一个,这样子就会造成队头阻塞。
http/1.x 版本支持Keep-alive,用此方案来弥补创建多次连接产生的延迟,但是同样会给服务器带来压力,并且的话,对于单文件被不断请求的服务,Keep-alive会极大影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。
- HTTP 2.0
二进制分帧 这是一次彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧":头信息帧和数据帧。
头部压缩 HTTP 1.1版本会出现 「User-Agent、Cookie、Accept、Server、Range」 等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP 2.0 使用 HPACK 算法进行压缩。多路复用 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,这样子解决了队头阻塞的问题。
服务器推送 允许服务器未经请求,主动向客户端发送资源,即服务器推送。
请求优先级 可以设置数据帧的优先级,让服务端先处理重要资源,优化用户体验。
- HTTP 常见状态码
RFC 规定 HTTP 的状态码为「三位数」,第一个数字定义了响应的类别
,被分为五类:
- 1xx: 代表请求已被接受,需要继续处理。
- 2xx: 表示成功状态。
- 3xx: 重定向状态。
- 4xx: 客户端错误。
- 5xx: 服务器端错误。
200 OK:请求正常处理完毕
204 No Content:请求成功处理,没有实体的主体返回
206 Partial Content:GET范围请求已成功处理
301 Moved Permanently:永久重定向,资源已永久分配新URI
302 Found:临时重定向,资源已临时分配新URI
303 See Other:临时重定向,期望使用GET定向获取
304 Not Modified:用于浏览器缓存的状态代码。 如果响应尚未修改,则客户端/用户可以继续使用相同的响应/缓存版本。 例如,如果资源已自特定时间以来被修改,浏览器可以请求。 如果没有,则发送状态代码 304。 如果已修改,则发送状态代码 200 以及资源
。
307 Temporary Redirect:临时重定向,POST不会变成GET
400 Bad Request:请求报文语法错误或参数错误
401 Unauthorized:需要通过HTTP认证,或认证失败
403 Forbidden:请求资源被拒绝
404 Not Found:无法找到请求资源(服务器无理由拒绝)
500 Internal Server Error;服务器故障或Web应用故障
503 Service Unavailable;服务器超负载或停机维护
更详细的状态码解释
- HTTP 请求方法
二、HTTP请求行、请求头、请求体
- HTTP请求报文解剖 :HTTP请求报文由3部分组成(
请求行+请求头+请求体
)
- 请求行属性
- ①是请求方法,
GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。
不过,当前的大多数浏览器只支持GET和POST,Spring 3.0提供了一个HiddenHttpMethodFilter,允许你通过“_method”的表单参数指定这些特殊的HTTP方法(实际上还是通过POST提交表单)
。服务端配置了HiddenHttpMethodFilter后,Spring会根据_method参数指定的值模拟出相应的HTTP方法,这样,就可以使用这些HTTP方法对处理方法进行映射了。- ②为请求对应的URL地址,
它和报文头的Host属性组成完整的请求URL
- ③是协议名称及版本号。
- HTTP请求报文头属性
- ④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
报文头属性是什么东西呢?我们不妨以一个小故事来说明吧。
- 快到中午了,张三丰不想去食堂吃饭,于是打电话叫外卖:老板,我要一份[鱼香肉丝],要12:30之前给我送过来哦,我在江湖湖公司研发部,叫张三丰。
- 这里,
你要[鱼香肉丝]相当于HTTP报文体
,而“12:30之前送过来”,你叫“张三丰”等信息就相当于HTTP的报文头。它们是一些附属信息,帮忙你和饭店老板顺利完成这次交易。
- 常见的HTTP请求报文头属性
Accept :请求报文可通过一个“Accept”报文头属性告诉服务端:客户端接受什么类型的响应。 Accept属性的值可以为一个或多个MIME类型的值。
更多关于MIME类型,大家请参考:http://en.wikipedia.org/wiki/MIME_typeCookie :客户端的Cookie就是通过这个报文头属性传给服务端的哦!
Referer :
表示这个请求是从哪个URL过来的
,假如你通过google搜索出一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点发送一个请求报文到商家的网站,这个请求报文的Referer报文头属性值就是http://www.google.com。Cache-Control :
对缓存进行控制
,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的。Accept-Charset:告诉服务器能够发送哪些字符集
Accept-Encoding:告诉服务器能够发送哪些编码方式
Accept-Language:告诉服务器能够发送哪些语言
Host:指定要请求的资源所在的主机和端口
User-Agent 作用:告诉服务器,客户端使用的操作系统、浏览器版本和名称
Client-IP:提供了运行客户端的机器的IP地址
From:提供了客户端用户的E-mail地址
TE:告诉服务器可以使用那些扩展传输编码
Expect:允许客户端列出某请求所要求的服务器行为
Range:如果服务器支持范围请求,就请求资源的指定范围
更详细的请求头解释
- 请求体
- ⑤是报文体,
它将一个页面表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成一个格式化串
,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.htmlparam1=value1¶m2=value2”的方式传递请求参数。
- 请求体的多种格式
- multipart/form-data
- application/x-www-from-urlencoded
- raw
- binary
- multipart/form-data
以表单形式提交,主要是上传文件用它
,在http中格式为
- application/x-www-from-urlencoded
以键值对的数据格式提交
- raw
- 选择text,则请求头是: text/plain
- 选择javascript,则请求头是: application/javascript
- 选择json,则请求头是: application/json
(如果想以json格式传参,就用raw+json就行了)
- 选择html,则请求头是: text/html 选择application/xml,则请求头是: application/xml
- binary
相当于Content-Type:application/octet-stream
,从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。
(一般用的不多)
- postman中 Params和Body的区别
Params 它会将参数放入url的?后面提交到后台(带到请求的接口链接里)
Body是放在请求体里面
三、HTTP响应行、响应头、响应体
- 响应行:
- ①报文协议及版本;
- ②状态码及状态描述;
- 响应头
- Cache-Control
(对应请求中的Cache-Control)Cache-Control:private 默认为private 响应只能够作为私有的缓存,不能再用户间共享
- Content-Type:text/html;charset=UTF-8
告诉客户端,资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析
。- Content-Encoding:gzip
告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。
- Date: Tue, 03 Apr 2018 03:52:28 GMT 这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。
http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。
- Server Server:Tengine/1.4.6 这个是服务器和相对应的版本,只是告诉客户端服务器信息。
- Transfer-Encoding:chunked 这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。
- Expires:Sun, 1 Jan 2000 01:00:00 GMT 这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本。
- Last-Modified: Dec, 26 Dec 2015 17:30:00 GMT 所请求的对象的最后修改日期(按照 RFC 7231 中定义的“超文本传输协议日期”格式来表示)
- Connection:keep-alive
这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求。
- ETag: “737060cd8c284d8af7ad3082f209582d” 就是
一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其Etag也会别修改
。- Refresh: 5; url=http://baidu.com
用于重定向,或者当一个新的资源被创建时。默认会在5秒后刷新重定向。
Access-Control-Allow-Origin: * *号代表所有网站可以跨域资源共享
,如果当前字段为*那么Access-Control-Allow-Credentials就不能为true
Access-Control-Allow-Origin: www.baidu.com 指定哪些网站可以跨域资源共享- Access-Control-Allow-MethodsAccess-Control-Allow-Methods:GET,POST,PUT,DELETE 允许哪些方法来访问
- Access-Control-Allow-CredentialsAccess-Control-Allow-Credentials: true
是否允许发送cookie。默认情况下,Cookie不包括在CORS请求之中。
更详细的响应头解释
- 响应体
由Content-Type决定,一般有以下类型:
- application/javascript
- application/html
- application/json
最后推荐直接看官方文档
参考文章
HTTP,request,response相关推荐
- JS HTTP 请求库哪家强?Axios,Request,Superagent,Fetch 还是 Supertest
JS HTTP 请求库哪家强?Axios,Request,Superagent,Fetch 还是 Supertest Web 开发中客户端与服务器间的交互非常重要,它有利于客户端应用高度动态化.用户通 ...
- BLOCK层基本概念:bio,request,request_queue
Summary bio 代表一个IO 请求 request 是bio 提交给IO调度器产生的数据,一个request 中放着顺序排列的bio 当设备提交bio 给IO调度器时,IO调度器可能会插入bi ...
- spring bean的使用范围:singleton,prototype,request,session,application
singleton prototype bean的学习 /** 结论一:singleton bean 只有一个:prototype bean每次都会创建新的 结论二:对于集合对象,会有两个user对象 ...
- 简单了解request与response
本文对 request. response 简单描述,未涉及到具体的浏览器缓存.重定向.请求转发等代码部分. 一.Web服务器,浏览器,代理服务器 在看 response.request 对象之前,先 ...
- Scrapy - Request 和 Response(请求和响应)
Requests and Responses:http://doc.scrapy.org/en/latest/topics/request-response.html Requests and Res ...
- Request和Response的使用以及html连接java同步到数据的实例
1,Request和Response的概述 Request是请求对象,Response是响应对象. request:获取请求数据 浏览器会发送HTTP请求到后台服务器[Tomcat] HTTP的请求中 ...
- java | (二十七) JSP(1)指令,隐式对象,动作,标签,EL表达式
目录 java脚本代码 JSP指令 Page指令 include指令 taglib指令 JSP隐式对象 out.response JSP作用域隐式对象 jsp动作 include动作 forward动 ...
- 浏览器,服务器,浏览器和服务器之间的通信协议
1,world wide web 我们通常所说的web就是指world wide web.一般来讲,这一种通过浏览器来访问资源的技术.我们经常说的上网,应该大部都是指的是上万维网(web),但是我们经 ...
- koa2 一网打尽(基本使用,洋葱圈,中间件机制和模拟,源码分析,核心点,生态)
原文https://juejin.im/entry/5bfbe5a76fb9a049cb186cfa/detail koa homepage 优秀的下一代 web 开发框架. Koa 应用程序不是 H ...
最新文章
- PHP处理Oracle的CLOB
- pb 修改数据窗口种指定字段位置_如何在PB数据窗口中修改数据---设置数据窗口的更新属性...
- 系统由单体架构到微服务架构到底是如何演进的?
- c if 判断select已经选择的值_Golang语言基础教程:if分支语句
- NIO的Buffer
- EasyRE 寒假逆向生涯(5/100)
- 剑指Offer-LeetCode刷题
- xxd命令转换二进制十六进制文件
- CISCO CCNA路由器密码管理
- 安装SQL Server 2012遇到“需要更新的以前的Visual Studio 2010实例.”
- FPGA入门实验试验报告
- WPS快捷键之 EXCEL高级
- 办公室计算机知识考试试题,办公室人员电脑操作基本技能方面测试题--绝对经典...
- IaaS PaaS SaaS DaaS基础设施即服务、平台即服务、软件即服务、数据即服务详解
- Excel的Index函数详解
- iOS 通过商品短链接跳转京东商品详情页
- Markdown内嵌图片的解决方法
- React 基础学习
- 优盘安装红帽linux系统,从U盘安装 redhat linux 6.0及centos 6.4
- x86架构下的安卓虚拟化