javaEE 初阶 — HTTP 协议 请求 与 响应

HTTP 是什么


全称是 超文本传输协议

HTTP 属于是 应用层 最广泛使用的协议之一,浏览器获取到网页基于的就是 http。
换句话也就是,HTTP 就是浏览器和服务器之间的桥梁。


HTTP 往往是基于传输层的 TCP 协议实现的。

我们平时就是通过 HTTP 协议传输数据,来打开一个网站的。


当我们在浏览器中输入一个搜狗搜索的 “网址” (URL) 时,浏览器就给搜狗的服务器发送了一个 HTTP 请求,
搜狗的服务器就会返回了一个 HTTP 响应。

这个响应结果被浏览器解析之后,就展示成我们看到的页面内容。
(这个过程中浏览器可能会给服务器发送多个 HTTP 请求,服务器会对应返回多个响应,这些响应里就包含了页面 HTML、CSS、JavaScript、图片、字体等信息)




当我们在浏览器中输入一个 “网址”,此时浏览器就会给对应的服务器发送一个 HTTP 请求。
对方服务器收到这个请求之后,经过计算处理,就会返回一个 HTTP 响应。


HTTP 协议报文格式

HTTP 协议格式

1 抓包工具的使用


抓包工具有很多,这里使用 fiddler,因为这是专注于 http 的,使用起来会更加的方便。

可以自上网下载安装,过程非常简单。



启动以后就会立即显示出当前电脑上某个程序使用 http 的服务器交互的过程。

2 抓包工具的原理


fiddler 的本质是一个代理程序,使用的时候有两个注意事项。

1、可能和别的代理程序冲突,使用的时候就要关闭其他的代理程序(包括一些浏览器插件)。


2、要向正确抓包,还需要开启 https 功能。

https 是基于 http 搞出来的进化版协议,当前互联网上却大多部分的服务器都是 https 的。
fiddler 默认不能抓 https 的包,需要手动启动 https 并且安装证书。

2.1 什么是代理


代理其实就是找个人帮你干活儿。

比如说,我想要吃饭,但是我又懒得去买,我就和室友说:“你去食堂吃饭的时候帮我带一份饭,ok?”
当他吃完饭回来的时候,就会把饭带给我,我再把前交给他。



如果是我自己去食堂,也是可以买到饭的,但是因为我比较懒,所以让室友帮我带了。
此时室友就是一个 “代理”,换个说法也就是,室友就是帮我干活的,在我不方便的时候,就需要派一个代理去。


在上述的过程中,我和食堂老板进行了什么样的交易,室友是非常清楚的,他就可以拿出一个小本本记下来。
fiddler 就是这样一个代理

2.2 正向与反向代理


代理还分为 正向代理反向代理
代表着客户端的代理,叫做正向代理,代表着服务器的代理,叫做反向代理。



我的室友买饭的时候,食堂老板比较忙,就找的兼职学妹买的饭,此时的室友代表的是我,他是我的工具人,
这个就是 正向代理

兼职学妹代表的是食堂老板,是老板的工具人,就是 反向代理

3 如何开启 https


1、打开 fiddler 界面,点击 Tools


2、在出现的界面上,点击 Options…


3、在出现的界面中,选择 https,将出现的 4 个选项全部勾选即可。



第一次勾选的时候,会出现以下的界面。它的意思是是否安装证书,一定要点击 Yes






这里的蓝色部分表示它是一个 html 页面,绿色的部分表示它是一个 js
灰色与黑色部分表示是一个单纯的数据。


双击左侧的请求列表中的选项,查看到请求的详细情况。






http 请求,是有一定格式的,fiddler 会按照格式解析,呈现出不同的显示效果。

选中上图中的 Raw 展示的就是最原始的效果。



右下角选择 Raw 展示出来的就是响应。


点击下面的红色方框位置的按钮,选择记事本打开。



以下就是记事本打开的请求。



上面红色圈出的部分叫做 首行,它包含了三个部分,之间使用 空格 来区分。

1、GET

这是 HTTP 的方法(method)


2、https://www.sogou.com/

这就是 URL(唯一资源定位符),也就是俗称的 网址,URL 的作用是 标识了互联网上的唯一位置


3、HTTP/1.1

这是版本号。

HTTP 请求

1 认识 URL




端口号描述的是哪个程序,带层次的文件路径负责找到程序管辖下的哪个文件。
查询字符串是获取资源的时候带的字符串,服务器地址就是域名,片段标识符现在基本上不使用了。
登录信息现在也不再使用了,因为在登陆的时候会有一个专门的页面用来登录。



举一个例子,比如我要到学校食堂吃煎饼,首先我要确定是在哪一个食堂,而且还要知道是在哪一个窗口
吃之前还要选择,煎饼里加什么配菜。还要选择调料什么的。

这里的在哪个食堂表示的就是 ip 地址,哪个窗口表示的就是端口号,加什么配菜表示的就是带层次的路径,
带什么调料表示的就是查询字符串(一键值对的方式来组织的)


一个 url 这里的几个部分,有些是可以省略的。

https://www.sogou.com/

上面的就是省略了端口,省略了以后浏览器会提供一个默认的端口。
对于 http 来说默认端口是 80,对于 https 来说默认端口是 443。
/ 也是路径,这里代表的是一个 “根目录”,这是 HTTP 服务器的根目录。

2 认识方法




方法描述了这次的请求的语义。

这里面的大部分 方法都是用不到的,只有 GETPOST 最为常见。


举个例子,天下文采十斗,曹子建独占八斗,我自己一斗,天下人共分一斗。
天下的 HTTP 方法十斗,GET 方法独占八斗,POST 方法占一斗,剩下的方法分一斗。

2.1 GET 方法


GET 是最常用的 HTTP 方法,常用于获取服务器上的某个资源。在浏览器中直接输入 URL,
此时浏览器就会发送出一个 GET 请求,另外,HTML 中的 link、img、script 等标签,也会触发 GET 请求。

打开 Fiddler,访问 搜狗主页,选择记事本打开,观察抓包结果。




GET 请求分为两个部分,即 首行harder

2.2 POST 方法


最典型的就是登录跳转的时候就会涉及到 POST,还有一个就是上传文件。

使用 Fiddler 观察 POST 方法,选择记事本打开。



一个 HTTP 请求可以分为四个部分:

1、首行

2、请求头(harder)

3、空行

4、正文(body)

如果是 GET 请求,则没有 body,如果是 POST 请求则有 body。

2.2.1 认识请求 “报头” (header)


harder 里是一堆键值对,每一行是一个键值对,键和值之间使用:分割。
键值对都是有特殊含义的。

Host: gitee.com 这里大概描述了服务器所在的 地址 和 端口,
Host 这里的 地址 和 端口,用来描述最重要访问的目标。

Content-Length 表示 body 中的数据长度,Content-Type 表示请求的 body 中的数据格式。


如果是 GET 请求,没有 body,请求中没有这两个字段,如果是 POST 请求,有 body,则必须要有这两个字段。

User-Agent 简称 UA,描述了浏览器和操作系统的版本。

现在的 User-Agent 主要用来区分 PC 和 移动。

Referer 表示当前页面的 “来源” ,如果直接通过地址栏输入地址,直接点击收藏夹…都是没有 referer。

Cookie 是一个非常重要的 harder 属性,本质上浏览器给网页提供的本地存储数据机制。
网页默认是不允许访问你计算机的硬盘的,这是为了保证安全。

Cookie 是有过期时间的,过期时间是有啥用?

有些公共的电脑(学校图书馆电子阅览室)在公共电脑上,登录的自己的账号,
此时登录状态就保存到cookie 中了,下个人使用的时候,很可能cookie 就过期了,就要求重新登录了。
越敏感的网站,过期时间就越短。

2.2.1.1 关于 Cookie 的三个问题


1、Cookie 是从哪来的?

Cookie 中的数据是来自于服务器的,
服务器会通过HTTP响应的报头部分(Set-Cookie字段)服务器来决定浏览器的Cookie要存什么。


2、Cookie 是在哪存的?

可以认为是存在于浏览器中,存在于硬盘的,Cookie 在存的时候,是按照浏览器+域名维度来进行细分的。
不同的浏览器,各自存各自的cookie,同一个浏览器不同的域名,对应不同的 cookie。

cookie里的内容不光是键值对,同时还有过期时间,比如,有很多网站登录一次之后,自动记录登录状态。


3、Cookie要到哪里去?

回到服务器这里,客户端同一时刻是有很多的。

客户端这边就会通过 Cookie 来保存当前用户使用中间状态,
当客户端访问浏览器的时候,就会自动的把 Cookie 的内容带入到请求中,
服务器就能够知道现在客户端是啥样子了。

2.3 GET 和 POST 的区别

  • 语义不同:GET 一般用于获取数据,POST 一般用于提交数据。
  • GET 的 body 一般为空,需要传递的数据通过 query string 传递,POST 的 query string 一般
    为空,需要传递的数据通过 body 传递。
  • GET 请求一般是幂等的,POST 请求一般是不幂等的。(如果多次请求得到的结果一样,就视为请
    求是幂等的)。
  • GET 可以被缓存,POST 不能被缓存。(这一点也是承接幂等性)

幂等的举个例子,一只奶牛第一次吃草,挤出来的是奶;第二次吃草,挤出来一定还是奶。
如果第一次吃草与第二次吃草挤出来的不一样,那就不是 幂等的。


GET 与 POST 其实是没有本质区别的,在大多数场景下,彼此之间都可以互相替代。
但是在使用习惯上,还是有区别的。

完全可以使用 GET 提交,使用 POST 获取;完全可以把 POST 设定为幂等的,GET 不幂等。

HTTP 响应




响应也是分为四个部分

1、首行:HTTP/1.1 200 OK


2、header


3、空行:表示 header 的结束标记


4、body

1 认识 “状态码”




状态码 200 OK 表示成功了。

404 Not Found 表示访问的资源不存在,也就是服务器上没找到。

403 Forbidden 表示访问被拒绝(没有权限)

302 Move temporarily 表示重定向(类似于呼叫转移)
呼叫转移 就比如说如果一个人换了手机号以后,有人再拨打之前的号码就会给转移到新的号码。

500 表示服务器内部错误(服务器代码抛异常了)

504 gateway timeout 表示相应的太久,浏览器等不及。


重定向与请求转发的区别





重定向,是可以重定向到外部资源的(跳转到别的网站)
请求转发只能该服务器内部的资源之间转发,少了一次交互,就会更加的高效。


状态码是可以分为几个大类的:

1** 表示等一等、2** 表示成功、3** 表示重定向、4** 表示客户端错误、5** 表示服务器错误。

2 认识响应 “报头” (header)


响应报头的基本格式和请求报头的格式基本一致。

类似于 Content-TypeContent-Length 等属性的含义也和请求中的含义一致。

\

猜你喜欢

转载自blog.csdn.net/m0_63033419/article/details/129789613