【JavaEE】_HTTP请求与HTTP响应

目录

[1. HTTP协议](#1. HTTP协议)

[2. HTTP请求](#2. HTTP请求)

[2.1 HTTP请求首行](#2.1 HTTP请求首行)

[2.2 URL](#2.2 URL)

[2.3 HTTP方法](#2.3 HTTP方法)

[2.3.1 GET请求](#2.3.1 GET请求)

[2.3.2 POST请求](#2.3.2 POST请求)

[2.3.3 GET与POST的区别](#2.3.3 GET与POST的区别)

[2.3.4 其他方法](#2.3.4 其他方法)

[2.4 请求报头header](#2.4 请求报头header)

[2.4.1 Host:](#2.4.1 Host:)

[2.4.2 Content-Length与Content-Type:](#2.4.2 Content-Length与Content-Type:)

[2.4.3 User-Agent(简称UA)](#2.4.3 User-Agent(简称UA))

[2.4.4 Referer](#2.4.4 Referer)

[2.4.5 Cookie](#2.4.5 Cookie)

[2.5 请求正文body](#2.5 请求正文body)

[3. HTTP响应](#3. HTTP响应)

[3.1 响应首行](#3.1 响应首行)

[3.2 报头header](#3.2 报头header)

[3.3 空行](#3.3 空行)

[3.4 正文body](#3.4 正文body)


1. HTTP协议

  1. HTTP协议一般被称为"超文本传输协议",即不止可以传输文本,还可以传输图片、音频、视频等二进制数据,是一个应用层协议

  2. 浏览器获取到网页就是基于HTTP,可以将HTTP理解为浏览器与服务器之间的交互桥梁,最常见的是HTTP1.1。

  3. 应用层协议需要基于传输层协议向上层提供服务,HTTP就是基于TCP协议实现的。

  4. 当我们在浏览器中输入一个网址(URL)时,其实就是浏览器给该网址的服务器发送了一个HTTP请求,然后该网址的服务器返回一个HTTP响应,浏览器再把得到的HTML等数据显示出来,即进行渲染;

  5. HTTP协议是一个行文本协议(文本与二进制对应),可以直接用记事本等文本编辑器直接打开查看的;

  6. HTTP协议报文格式可以借助一些第三方工具查看,这些工具称为"抓包"工具,如:fiddler,打开后可在左栏查看到当前电脑上某个程序使用HTTP和服务器交互的过程:

注:(1)fiddler本质是一个代理程序,可能会与别的代理程序冲突,故而在使用fiddler时需要关闭其他的代理程序,包括一些浏览器插件;

代理分为正向代理与反向代理,其中代表着客户端的代理称为正向代理,代表着服务器的代理称为反向代理;

(2)要想正确抓包还需要开启https功能,https是基于http的进化版协议,当下互联网上绝大部分的服务器都是https的,fiddler默认不能抓包https的包,需要手动启用https并安装证书;

2. HTTP请求

HTTP请求包括四个部分:

(1)首行; (2)请求头(header); (3)空行; (4)正文(body);

如果是GET请求,没有body;如果是POST请求,一般有body

2.1 HTTP请求首行

以在浏览器中访问bilibili为例,抓包结果中,首行内容如下:

首行包括三个部分:

(1)GET:是HTTP的方法;

(2)中间部分是URL(唯一资源定位符,标识互联网上唯一的资源的位置),即俗称的网址;

注:URI是唯一资源标识符,是一个身份标识,为了和别的资源区分开,实际上URL也可以起到身份标识的效果,故而URL也可以视为是一个URI;

(3)HTTP/1.1:是HTTP的版本号;

2.2 URL

因特网标准RFC1738规定URL的详细情况如下:

即:协议名称://ip:端口号/路径?查询字符串

注:(1)TCP、IP、UDP等协议格式都是RFC系列文档规定的;

(2)URL不是HTTP专属的,很多协议都可以使用URL;

(3)URL中某些部分是可以省略的,以在浏览器页面访问bilibili为例,抓包到的url如下:

① 其中服务器端口号就被省略了,在端口号被省略时,浏览器会提供默认端口,

对于http来说,默认端口是80;

对于https来说,默认是443,

即访问https://www.bilibili.com与访问https://www.bilibili.com:443是相同的;

② / 也是目录,只是非常简短,代表HTTP服务器的根目录,/管理的根目录可以是系统上的任何一个目录;

(可以理解为HTTP服务器是系统上的一个进程,委托这个服务器管理系统上的一个特定目录,这个目录里的资源都可以让外部进行访问)

2.3 HTTP方法

常用的HTTP方法如下:

|----------|-------------|
| 方法 | 说明 |
| GET | 获取资源 |
| POST | 传输实体主体 |
| PUT | 传输文件 |
| HEAD | 获得报文首部 |
| DELETE | 删除文件 |
| OPTIONS | 询问支持的方法 |
| TRACE | 追踪路径 |
| CONNECT | 要求用隧道协议连接代理 |
| LINK | 建立和资源之间的联系 |
| UNLINE | 断开连接关系 |

注:(1)方法描述了这次请求的语义,即要进行的操作;

(2)GET方法最常用,其次是POST方法,其余方法使用频率都远小于这两中方法;

2.3.1 GET请求

1. 在浏览器地址栏里直接输入URL或点击收藏夹就会触发GET请求;

2. HTML中的link标签,script标签,img标签以及a标签等也会触发GET请求;

3. 通过JS也可以构造GET请求;

仍以访问网页版bilibili为例:

2.3.2 POST请求

1. 登录操作进行跳转时会涉及到POST;

2. 上传文件时也会使用到POST;

注:(1)POST的body部分的内容与格式都是程序员自行定义的;

2.3.3 GET与POST的区别

1.信息存放差异:

GET也可以给服务器传递一些信息,GET传递的信息一般都是放在query string,POST传递消息则是通过body

  1. 语义差异(数据流动方向差异):

GET请求一般用于从服务器获取数据,POST请求一般用于给服务器提交数据

  1. GET通常会被设计成幂等的,但POST则不要求幂等

  2. GET是可以被缓存的,POST一般不能被缓存

注:① 以上区别只是习惯用法,GET也可以有body,POST也可以有query string,GET也可以给服务器提交数据,POST也可以从服务器获取数据等等;

② 其实GET和POST就没有本质区别,在大部分场景下彼此之间都可以彼此替代,但在使用习惯上会有差异;

③ 幂等可以理解为相同的输入得到的结果也是确定的;

④ 缓存即保存请求的结果,方便下次请求直接取缓存结果从而节省时间;

2.3.4 其他方法

(1)PUT和POST相似,只是具有幂等特性,一般用于更新;

(2)DELETE删除服务器指定资源;

(3)OPTIONS返回服务器所支持的请求方法;

(4)HEAD类似于GET,只不过响应体不返回,只返回响应头;

(5)TRACE回显服务器端收到的请求,测试的时候会使用到该方法;

2.4 请求报头header

header的整体格式是"键值对"结构,一行是一个键值对,这些键值对都是HTTP事先定义好,有特殊含义的。

常见的报头种类有:

2.4.1 Host:

Host表示服务器主机的地址和端口;

注:此处的地址和端口是用来描述最重要访问的目标,大概率与URL相同,但也有可能不同

2.4.2 Content-Length与Content-Type:

Content-Length:表示body中的数据长度;

Content-Type:表示请求的body中的数据格式;

常见选项:

  1. Content-Type:application/json;charset=UTF-8,数据为json格式,body格式形如:

    {"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05ccde64b16
    a861fa2bddfdcd15"}

2.Content-Type:application/x-www-form-urlencoded;charset=UTF-8,form标签构造的body格式就是该种类型,body格式如下:

title=test&content=hello

注:如果是GET请求,没有body,则请求中没有以上两个字段;

如果是POST请求,有body,则请求中必须有该两个字段;

2.4.3 User-Agent(简称UA)

  1. 表示用户浏览器或操作系统的版本(属性);

  2. 如今的UA主要用于区分PC和移动;

2.4.4 Referer

  1. 表示当前页面的来源,即当前页面是由哪个页面跳转过来的;

  2. 不一定有,如果是直接通过地址栏输入地址,或者直接点击收藏夹等进行访问,就没有Referer;

  1. Cookie本质是浏览器给网页提供的本地存储数据的机制;

为了保证安全,网页默认是不允许访问计算机硬盘的。

Cookie即对浏览器访问硬盘做出了明确的限制;

  1. Cookie是通过键值对方式组织数据的,故而也可以使用Cookie存储少量数据;

  2. Cookie中具体存储的内容是程序员自定义的部分;

  3. Cookie中的数据来自于服务器,服务器会通过HTTP响应的报头部分(Set-Cookie字段)。

即服务器决定浏览器的Cookie要存什么;

  1. Cookie可以认为是存在于浏览器中的,本质上是存在于硬盘上

Cookie在存储的时候,是按照浏览器+域名 的维度来进行细分的,即不同的浏览器存各自的Cookie,同一个浏览器不同的域名也对应着不同的Cookie;

Cookie中的内容不只有键值对,还有过期时间,过期则删除,比如一些网站,在第一次登录之后,定期自动记录登录状态,若超过其设定的过期时间,则删除;

  1. Cookie最终要回到服务器

同一时刻存在很多客户端,客户端会通过Cookie来保存客户使用的中间状态,当客户端访问浏览器时,就会自动把Cookie内容带入到请求中,服务器就可以获取到当前客户端的状态了;

2.5 请求正文body

正文中的内容格式和header中的Content-Type密切相关,常见的正文类型有:

(1)application/x-www.form-urencoded:类似于query string的键值对组织方式;

(2)multipart/form-data;

(3)application/json:最为常见的数据格式;

3. HTTP响应

响应也是由四个部分构成的:

3.1 响应首行

响应首行:版本号+状态码+状态码描述

HTTP状态码描述了这次响应的结果(比如成功、失败,以及失败原因等);

  1. HTTP状态码有:

(来源:搜狗百科)

  1. 常见HTTP状态码有:

(1)200 OK, 表示访问成功

(2)404 Not Found, 表示访问的资源不存在,在服务器上查询无果

如访问:

页面显示:

也可在fiddler中查看:

(3)403 Forbidden:无访问权限,访问被拒绝

(4)302 Move temporarily:重定向

重定向类似于呼叫转移,在登录页面302非常常见,用于实现登陆成功后自动跳转到主页;

302这样的响应报文中会在header中带有一个Location属性,通过这个属性来描述要跳转到哪个新的地址;

注:注意区别重定向与请求转发:

① 请求转发是servlet/spring里提供的机制;重定向是HTTP里提供的机制;

② 请求转发只能在该服务器内部的资源之间转发,重定向可以重定向到外部资源,即可跳转到别的网站;

③ 请求转发只有一次交互,更高效;重定向需要进行两次交互;

(5)500系列:服务器内部错误

如:504 gateway timeout:请求超时等等;

注:gateway即网关,是一个网络的出入口,通常也用来指代一个机房的入口服务器,192.168.1.1这种ip一般是网关ip;

可总结如下:

|---------|----------------------------|---------------|
| | 类别 | 原因短语 |
| 1XX | Informational(信息性状态码) | 接受的请求正常处理 |
| 2XX | Success(成功状态码) | 请求正常处理完毕 |
| 3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
| 4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
| 5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |

注:HTTP状态码是RFC标准明确规定的,不允许自定义;

3.2 报头header

HTTP响应的报头也是键值对格式

3.3 空行

与HTTP请求相同,空行是header的结束标记;

3.4 正文body

HTML的页面内容;

HTTP请求与响应总结如下:

相关推荐
无敌开心19 分钟前
fastAPI教程:路由操作及HTTP请求响应
网络协议·http·fastapi
李的阿洁1 小时前
OSPF的不规则区域
运维·服务器·网络
逸狼1 小时前
【JavaEE初阶】网络原理
服务器·网络·智能路由器
shmily ....2 小时前
文件上传漏洞原理
网络·安全
IPFoxy6662 小时前
如何判断静态代理IP地址是否被污染?
网络·安全·web安全
网络研究院3 小时前
什么是 ARP 欺骗和缓存中毒攻击?
网络·安全·ddos·攻击·arp·实践·缓解
没有名字的小羊3 小时前
网络通信——OSPF和RIP的区别(总结)
网络·网络协议
it00zyq3 小时前
Linux网络编程
linux·网络
是小李呀~4 小时前
websocket实战
网络·websocket·网络协议
Play_Sai6 小时前
【信息安全管理与评估】2023年全国职业院校技能大赛赛题第02套
网络