文章更新时间:2020/07/24

一、概念

定义

HTTP:超文本传输协议,是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。

HTTP协议:用于定义客户端与web服务器通迅的格式。

版本

通讯中真正使用的http协议一般有两种:

  • HTTP1.0
  • HTTP1.1

  客户端若需要向服务端发送请求,首先要建立TCP【控制传输协议】连接,也就是我们常说的“三次握手,四次挥手”,这个我们后续再详细了解

HTTP1.0与HTTP1.1的异同

  共同点:请求和响应是成对出现的,客户端的一次请求一定会对应服务端的一次响应

  不同点:

HTTP1.0

  • 非持久连接,一次TCP连接只能进行一次请求与响应。
  • 一次请求与响应对应一个TCP连接。
  • 客户端只有接收到服务端对上一次请求的响应后,客户端才可发出第二次请求
  • 不支持对虚拟主机的访问。【请求头没有HOST属性】
  • 客户端接收到响应后,马上发送关闭TCP连接的请求,服务端关闭连接。

HTTP1.1

  • 持久连接,在一个TCP连接上可以传送多个请求和响应。
  • 一般情况下,一个页面中的请求与响应对应一个TCP链接。
  • 客户端不用等待上一次请求的结果返回,就可以发出下一次请求。
  • 支持虚拟主机的访问。【请求头有HOST属性】
  • 客户端接收到对最后一次请求的响应后,马上发送关闭TCP连接的请求,服务端关闭连接。

二、HTTP请求

定义

客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。

结构

一个完整的HTTP请求包括如下内容:一个请求行若干消息头空白行、以及请求正文

请求行

请求方式:GET(默认)、POST、HEAD、OPTIONS、DELETE、TRACE、PUT

GET(默认):多个数据之间以&进行分隔,数据容量通常不能超过1K。例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1

POST:可以在请求的实体内容中向服务器发送数据,传送的数据量无限制。

消息头

  • accept  : 支持的数据类型
  • Accept-Charset : 支持哪种字符集
  • Accept-Encoding  :支持的压缩格式
  • Accept-Language :支持的语言环境
  • Host :想访问哪台主机
  • If-Modified-Since : 缓存数据的时间
  • Referer :客户机是哪个页面来的  防盗链
  • Connection :请求完后是断开链接还是何持链接

三、HTTP响应

定义

一个HTTP响应代表服务器向客户端回送的数据

结构

一个完整的HTTP请求包括如下内容:一个请求行响应报空白行、以及响应正文

状态行

状态行格式: HTTP版本号 状态码 状态叙述
举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:
 

响应头

  • Location : 跳到哪里
  • Server :服务器的型号
  • Content-Encoding :数据的压缩格式
  • Content-Length : 回送数据的长度
  • Content-Language : 语言环境
  • Content-Type :回送数据的类型
  • Refresh :定时刷新
  • Content-Disposition : 以下载方式打数据
  • Transfer-Encoding :数据是以分块方式回送的
  • Expires : 缓存存在时间,-1  控制浏览器不要缓存
  • Cache-Control : 缓存控制(同时存在会覆盖Expires,"no-cache"为不缓存)
  • Pragma : 缓存控制("no-cache"为不缓存)

四、GET请求和POST请求

GET请求

  特点:客户端收到服务器端对GET请求回送的响应时,浏览器会自动缓存响应,当客户端再次进行相同的请求提交时,将直接读取本地浏览器缓存中的数据,提升用户体验,减轻服务器端的压力。
  缺陷:

  • 参数只能是字符串,而不能是其他类型
  • 可以携带的数据量小
  • 数据安全性低
  • 参数作为URL的一部分,显示在地址栏,容易被拦截

POST请求

  特点:

  • 数据类型可以是任意形式,还可以是图片,音频,视频等。
  • 请求可携带的数据量大
  • 数据安全性高
  • 响应结果不会缓存,每次请求都真正去请求服务器

Q:为什么GET请求的响应结果会被浏览器缓存,而POST请求的响应结果却不缓存呢?

A:主要是有两个原因:

  1. GET请求一般是向服务端查询或下载相关资源,多次请求结果应该是要保证一致的,所以设计为缓存的方式,减少了客户端和服务端交互的次数;而POST请求一般是用户要提交资源信息,所以对于响应结果每次都是独立的,也就不需要缓存了。
  2. GET请求对于请求因为其请求体为空,参数都丢到URL上了,对于请求是否相同容易比较,所以设计缓存机制;而POST请求因为请求参数类型太多,请求体比较复杂,不好比较请求是否相同,所以也就不设计缓存机制了

五、请求方式的选择

  我们先简单了解一下,现在常用的请求类型有哪几种:

  一般来说我们大部分请求都是使用GET方式来进行发送的,那么什么时候选用POST方式做请求发送比较合适呢?一般出现以下几种情况时,我们选用POST方式来发送请求:

  • 请求携带参数的类型不是字符串
  • 请求携带的参数数据量很大
  • 请求携带的参数数据敏感性较高,安全性要求较高

Java Web学习(四)http协议的更多相关文章

  1. java web 学习四(http协议)

    一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...

  2. Java Web 学习路线

    实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...

  3. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. Java Web学习系列——Maven Web项目中集成使用Spring

    参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...

  5. Java Web 学习笔记 1

    Java Web 学习笔记 1 一.Web开发基础 1-1 Java Web 应用开发概述 1.1.1 C/S C/S(Client/Server)服务器通常采用高性能的PC机或工作站,并采用大型数据 ...

  6. [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. JAVA Web学习笔记

    JAVA Web学习笔记 1.JSP (java服务器页面) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . JSP全名为Java Server Pages,中文名叫java服务器 ...

  8. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  9. Java web 学习之旅

    java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户 ...

  10. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. 操作系统-存储管理(6)buffer/cache/swap

    为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘. 缓存 ...

  2. SQL联结笔记(内联结,自联结,自然联结,外联结区别以及应用)

    SQL中有三种联结,分别是:内联结,自然联结,外联结. 联结是针对不同表联合起来的一种方式.应用的对象是:表(table) 为了方便验证练习理解,首先展示所要用到的表的内容: 1.Customers表 ...

  3. KNN手写数字识别

    import numpy as np import matplotlib .pyplot as plt from sklearn.neighbors import KNeighborsClassifi ...

  4. Django中views数据查询使用locals()函数进行优化

    优化场景 利用视图函数(views)查询数据之后可以通过上下文context.字典.列表等方式将数据传递给HTML模板,由template引擎接收数据并完成解析.但是通过context传递数据可能就存 ...

  5. ISO8601

    日期和时间的组合表示法 合并表示时,要在时间前面加一大写字母T,如要表示东八区时间2004年5月3日下午5点30分8秒,可以写成2004-05-03T17:30:08+08:00或20040503T1 ...

  6. JVM 第一篇:编译 OpenJdk14 ,我行你也行

    本文内容过于硬核,建议有 Java 相关经验人士阅读. 1 引言 从上周开始一直在看周志明的 「深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)」 ,好多年之前看过第二版的,绝对算的上是国内 ...

  7. python爬虫实战---爬取大众点评评论

    python爬虫实战—爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...

  8. 入门的艰难——关于LR的使用

    这年头做一件事真是TM不容易啊.做测试也很纠结,不是都说商业工具很强大么,我去,这个不支持那个不支持的,这还有什么搞头,还非要按照你说的这个版本的才行,高一点的就crash了,结果连最初级的录制脚本都 ...

  9. Android Studio从Eclipse导项目

    要是你只下了Android Studio 就不能用Eclipse导出gradle项目了 可以直接使用Android Studio导入模块,在Android Studio里Project算Eclipse ...

  10. django学习(二)

    1.反向解析 什么是方向解析呢? 通过一些方法得到一个结果,该结果可以直接访问对应url出发视图函数. 先给一个路由和视图函数起一个别名.但是我们要注意的是反向解析的别名是不可以冲突的!!!不然会出现 ...