Java HTTP协议(一)--- HTTP,报文格式,请求和响应

文章目录

HTTP协议

  1. HTTP 理论和实践同样重要。如果我们未来写web开发(写网站)。HTTP就是我们工作中最常用到的东西。
  2. 什么是HTTP?
    HTTP是应用层的协议,HTTP现在大规模使用的版本是 HTTP/1.1
  3. 使用HTTP协议的场景:
    1.浏览器打开网站(基本上)
    2.手机APP访问对应的服务器(大概率)

报文格式

  1. HTTP最重要的就是报文格式了
  2. HTTP的报文格式和 TCP/IP/UDP 这些不同,HTTP 的报文格式,要分两个部分来看待
    请求和响应

HTTP协议,是一种 一问一答 结构模型的协议,请求和响应的协议格式,是有所差别的

这里也不只有一问一答的模型结构:

一问一答(访问网站)

多问一答(上传文件,把请求拆分成多份传给服务器)

一问多答(下载文件,把响应拆成多份进行下载)

多问多答(串流 / 远程桌面,远程桌面就是这边操作了,那边就会有响应)

  1. 如何查看到 HTTP 请求和响应的格式呢?
    抓包工具:把网卡上经过的数据,获取到,并显示出来(这个是我们必备的技能,分析和调试程序的重要手段)

Fiddler

抓包工具:

wireshark:功能非常强大,可以抓各种各样的协议,使用起来比较复杂,但是用这个抓 HTTP 是不太方便的

Fiddler工具:是专门用来抓HTTP的,使用起来简单,企业中也经常用到

在官网下载Fiddler Classic 版本的就可以

FIddler的请求和响应,还要下载证书,否则就只抓包http了,不能抓https了

安装证书:

出现这个点cancel就行

  1. Fiddler 本质上是一个 代理,可能会和其他的代理软件冲突

举个栗子:

除了 fiddler 之外,有的程序也是代理

(1) 加速器

(2) vpn

...

这些代理程序之间可能会产生冲突

如果你的 fiddler 不能抓包了,一定要检查关闭之前的开启的代理软件(也可能是一个浏览器插件),如果还是不行,还可以尝试换一个浏览器,有的时候 edge浏览器 可能会不行,比如出现下面这样的情况

postman 是构造请求的软件

fiddler 是抓取/显示已有的请求的软件

  1. ctrl + a:选中所有的请求,delete删除这里所有的请求,方便后续观察想要观察的http

  2. HTTP 协议是文本格式的协议 (协议里面都是字符串)
    TCP,UDP,IP...都是二进制格式的协议

**HTTP 响应也是文本的。直接查看,往往能看到二进制的数据(压缩后的),HTTP 响应经常会被压缩。因为压缩之后,体积更小,传输的时候,节省网络带宽。**但是,压缩和解压缩,是需要消耗额外的 cpu 和 时间 的。其实也没关系,一台服务器,最贵的硬件资源就是网络带宽,这样压缩和解压缩就是用便宜的换贵的

解压缩之后,可以看到,响应的数据其实是 html,浏览器上显示的网页,就是html,往往都是浏览器先请求对应的服务器,从服务器这边拿到的 网页 数据(html),每次访问网页,都会下载对应的网页数据,会消耗一定的带宽(不像我们下载APP一样,只需要下载一次)

  1. 请求:
    键值对这里是 标准规定 的,所以不能自己胡编乱造
  2. 响应:

URL

  1. URL 是计算机中的非常重要的概念,不仅仅是在 HTTP 中涉及到

jdbc

设置数据源

setUrl("jdbc:mysql://127.0.0.1:3306/java1?characterEncoding=utf8&useSSL=false");

setUser

setPassword

URL,描述了某个资源在网络上的所属位置。数据库也是一种资源

  1. URL的具体信息:

    1.协议方案名(协议名):例如,https:// ,jdbc:mysql://

2.登录信息(认证):这个东西现在几乎不会用到了(尤其是针对用户的产品)

3.服务器地址:可以 IP地址,也可以是 域名

4.服务器端口号:

5.带层次的文件路径:

6.查询字符串(query string)

关于以上 url 的几个部分(query string),举个例子:


对于 query string 来说,如果 value 部分要包含一些特殊符号的话,往往需要进行 urlencode 操作

比如:

搜索C++这个词

后面使用 url 的时候,要记得针对 query string 的内容进行好 urlencode 工作。如果不处理好,有些浏览器就可能会解析失败,导致请求无法正常工作

中文汉字也需要转义,如果不转义的话,汉字也出现特殊的符号的话,不就bug了

7.片段标识符:比如说这个网址就有 [vue技术文档],片段标识符实现页面内部的跳转 (https://cn.vuejs.org/guide/introduction.html#the-progressive-framework)

请求

方法

  1. 方法既有 GET 还有POST,出现最多的还是GET,POST出现的比较少

POST请求

POST

(1) 登录

(2) 上传文件

习惯用法(不是硬性规定,也可以不遵守的)
这个不遵守的话,客户端和服务器都要一起不遵守的,不然会出现问题

GET 请求,通常会把要传给服务器的数据,加到 url 的 query string 中。

POST 请求,通常把要传给服务器的数据,加到 body 中

登录和上传头像的请求

出现蓝色的字体(在刚开始加载网页的时候出现的,后续Fiddler删除这些包,就不会出现了),是获取到网页(得到 html 的响应)

对于浏览器缓存的理解:
刚才最开始没有抓到这里的返回的请求,是因为命中了浏览器的缓存

存在网络缓存的原因:

浏览器显示的网页,其实是从服务去这边下载的 html。html 内容可能会比较多,体积可能比较大,通过网络加载,消耗的时间就可能会比较多。

浏览器一般都会自己带有缓存,就会把之前加载过的页面,保存在本地硬盘上。

下次访问直接读取本地硬盘的数据即可。


缓存可能出现的bug:如果缓存的是之前未修改的网页,缓存之后又修改了网页,就可能会出现bug

上传图像的body本身是比较长的

  1. 方法的种类:

    这些HTTP请求最初的初心是为了表示不同的 语义(不同的含义),现在在实际的使用过程中,初心,已经被遗忘了。HTTP的各种请求,目前来说已经不一定完全遵守自己的初心了,实际上程序员如何使用,更加随意了

比如:还可以用GET来上传文件,用POST获取文件,也是可行的

还有 POST和 PUT 目前来说,可以理解成 没有任何的区别!!!(任何使用 POST 的场景,换成 PUT 完全可以,反之亦然)

GET 和 POST 的区别

经典的面试题:GET 和 POST 的区别

GET 和 POST 之间的差别,网络上的有些说法,需要大家来注意!(都是错误的说法)

  1. GET 请求能传递的数据量有上限,POST 传递的数据量没有上限
  2. GET 请求传递的数据不安全,POST 请求传递的数据更安全
    安全关键在于是否加密了
  3. GET 只能给服务器传输 文本数据。POST 可以给服务器传输文本 和 二进制数据
    (1) GET 也不是不能使用body(body 中是可以直接放二进制数的)
    (2) GET 也可以把 二进制的数据进行 base64 转码(转码成字符串的文本文件),放到 url 的query string 中,之后再解码,不也是二进制的数据吗

下面说法不够准确,但是也不是完全错的

1.GET 请求是幂等的。POST 请求不是幂等的。
幂等:数学概念,输入相同的内容,输出是稳定的。
举个栗子:

吃进去的是草,挤出来的是奶。如果任何时候吃草,挤出来的都是奶,就是幂等的。如果吃草之后,不同时候挤出来的东西不一样,就不是幂等的。

GET 和 POST 具体是否是幂等的,取决于代码的实现。GET 是否幂等,也不绝对。只不过 RFC 标准文档上建议 GET 请求实现成幂等的。

再举个例子:

不同的时间,广告的顺序都可能会不同

有哪些常见的Header,理解Header的含义

  1. HOST
    HOST:www.sogou.com
    HOST后这个信息在 url 中也是存在的

比如,在使用代理的情况下,Host 的内容是可能和 url 中的内容不同的

  1. Content-Length:body 中数据的长度
    Content-Type:body 中数据的格式
    注意:请求中有 body,才会有这两个属性。
    通常情况下 GET 请求没有 body,POST 请求有 body

body 中的格式,可以选择的方式是非常多的

body中数据的格式:
请求:

1.json

2.form 表单的格式:相当于是把 GET 的query string 给搬到 body 中。(后面写个代码来构造一个)

上传图片:

3.form-data 的格式:上传文件的时候,会涉及到(也不一定就是 form-data,也可能是 form 表单)

响应:

后续给服务器提交请求,不同的 Content-Type(body),服务器处理数据的逻辑是不同的。

服务器返回数据给浏览器,也需要设置合适的 Content-Type,浏览器也会根据不同的Content-Type 做出不同的处理

  1. User-Agent(简称UA)

    UA是用来区分不同的设备的 ,上古时期的UA是用来区分浏览器的兼容问题的,可以让旧的浏览器支持文字,让新的浏览器支持图片,这样也就区分开了
    现在 UA 使用来区分是PC端还是 移动端的
  2. Referer:描述了当前页面是从哪个页面跳转而来的
    如果是直接在地址栏输入 url(或者是点击收藏夹中的按钮)都是没有 Referer


Referer的用途:这个也可以用来算钱的

搜索引擎,每点击一次,它都会赚钱
通过域名来区分是百度投放的广告,还是搜狗投放的广告

  1. Cookie

Cookie可以认为是浏览器在本地存储数据 的一种机制

对于安全性的考虑,所以引入了Cookie ,存储简单的字符串也是够用的

Cookie是怎么进行存储的(重点)

浏览器中的 Cookie

Cookie的作用:

Servlet / Spring 中会结合代码更深入地理解Cookie

响应

状态码

状态码

  1. 响应 状态码
    表示了这次请求对应的响应,是啥样的状态(成功,失败,其他的情况,对应的原因是什么)

这里的状态码,种类非常多。咱们不需要全都记住

成功

2xx 都表示成功,200是最常见的

重定向

3xx 表示重定向,(可以理解为爱情转移)
请求中访问的是 A 这样的地址。响应返回了一个重定向报文,告诉你应该要访问B地址

举个例子:

比如你请教一个老师,老师说这边还没有空,叫你去找另一个老师,如果还不行的话,再来找我

301和302

301 Moved Permanently是永久重定向,是有缓存的,比如你地址就在新的网站了,以后就不要访问旧的网站了

302 Move tmporarily 是临时重定向,是没有缓存的,指不定后面又要更改,比如说你地址在新网站了,但是可能后面又会改回旧的网站

重定向的响应报文中,会带有Location字段,描述出当前要跳转到哪个新的地址

(后面会在代码中具体演示)

请求错误

客户端,也就是浏览器(客户端)会构造一个http请求,不符合服务器的一些要求

404 Not Found

请求中访问的资源,在服务器上不存在

比如:

HTTP/1.1 404 Not Found

404这个状态码表示的是自愿不存在,同时在 body 中也是可以返回一个指定的错误页面的,很多网站会把这个错误页面做的很丰富多彩

比如:bilibili

403 Forbidden

表示访问的资源没有权限

服务器错误

5xx 表示服务器出错了

看到这个说明服务器挂了

比较容易出现的是500,后面我们自己写服务器的时候,还是比较容易写出500这样的问题的(一般就是你的代码有bug)

一个经典的面试题:说一下,HTTP的状态码有哪些常见的

通过不同的数字来表示状态,这种做法其实是非常常见的(在C语言中也有,比如 errno,表示打开文件失败的原因, strerror 把errno翻译成字符串)可能我们面试中也会考察C语言的

如何让客户端构造一个HTTP请求

如何让服务器处理一个HTTP请求,这是非常重要的内容(Servlet/Spring中都会涉及到这一部分)

浏览器:

  1. 直接在浏览器地址栏输入url,此时构造了一个GET请求
  2. html中,一些特殊的html标签,可能会触发GET请求,比如像 img,a,link,script...
  3. 通过form表单来触发GET/POST请求(我们需要了解一下),form本质也是一个HTML标签

写一个简单的html代码,来编写逻辑(解释form的逻辑)

form表达如何编写?使用form标签

设置提交按钮:

构造GET请求:

构造POST请求:

  1. ajax的方式

1.引入jquery库(第三方库,是需要额外下载引入的)

前端引入第三方库非常容易的,只要代码中写一个库的地址即可

jquery cdn中有一些资源和库

2.编写代码

回调函数:

js中定义变量:

ajax的get请求写法:

ajax的post请求写法:

构造请求还有更简单,更方便的方式,比如使用第三方工具,可以实现这里的效果。
form能够构造get和post请求,ajax也能构造get和post请求。上面的知道这些就可以了,等学了前端来看才能够懂!!!

一种更简单的构造HTTP请求的方式

直接通过第三方工具,图形化的界面来构造。我们这里使用postman

  1. 先创建一个Workspaces,然后创建标签页
  2. 请求的设定,最后发送请求


postman 也是我们常用的构造请求的方式,一般是用于测试阶段

不会写ajax也没事,postman都会给你自动生成代码,就在右上角的code按钮

HTTPS

  1. 引入HTTPS的原因:
  2. 使用HTTPS进行加密,也是为了防止运营商劫持,还有比如在商场你连商场的wifi,也可能会被黑客截获数据,黑客把wifi伪装成商场的wifi一样的名字
相关推荐
蜚鸣5 小时前
JavaStream用法全解析
java
小墨宝5 小时前
umijs 4.0学习 - umijs 的项目搭建+自动化eslint保存+项目结构
开发语言·前端·javascript
失散135 小时前
分布式专题——19 Zookeeper分布式一致性协议ZAB源码剖析
java·分布式·zookeeper·云原生·架构
间彧5 小时前
Collections.singletonList详解与应用
java
代码匠心1 天前
从零开始学Flink:数据转换的艺术
java·大数据·flink
泥嚎泥嚎3 天前
【Android】View 的滑动
java
京茶吉鹿3 天前
三步构建完美树节点,从此告别数据结构焦虑!
java·后端
橙序员小站3 天前
搞定系统设计题:如何设计一个订单系统?
java·后端·面试
是2的10次方啊3 天前
防御性编程:编程界的'安全驾驶'指南
java