【JavaEE】HTTP 协议

一、HTTP 是什么

HTTP 全称为 “超长文本传输协议” ,是一种应用非常广泛的应用层协议

HTTP 往往是基于传输层的 TCP 协议来实现的,(HTTP1.0、HTTP1.1、HTTP2.0均为 TCP,HTTP3.0 是基于 UDP),但是现在主要使用的还是HTTP1.1、HTTP2.0,所以我们这里讨论的以 HTTP1.1 为准。

当我们在浏览器输入搜狗的“网址”(URL)时,浏览器会给搜狗的服务器发送一个 HTTP 请求,服务器收到这个请求并向浏览器返回一个 HTTP 响应。
响应被浏览器解析之后就成了我们看到的搜狗页面,(这个过程中浏览器可能会给服务器发送多个 HTTP 请求,服务器也会对应返回多个响应,这些响应包含 HTML/CSS/JavaScript/图片/字体等信息)

所谓 “超文本” 的含义:就是传输的内容不仅仅是文本(比如 html, css 这个就是文本),还可以是一些其他的资源,比如图片、视频、音频等二进制的数据

二、理解 “应用层协议”

三、理解 HTTP 协议的工作过程

四、HTTP 协议格式

HTTP 协议是一个文本格式的协议,可以通过 Chrome 开发者工具或者 Fiddler 抓包工具查看具体的 HTTP 请求/响应细节。

1、Fiddler 下载

Fiddler 下载:https://www.telerik.com/fiddler

Fiddler下载以及使用

2、抓包工具的使用

Fiddler 相当于一个代理
浏览器访问搜狗先把 HTTP 请求发送给 Fiddler ,Fiddler 再把请求转发给搜狗服务器;搜狗服务器收到请求后返回 HTTP 响应给 Fiddler ,然后 Fiddler 再把请求返回给浏览器。

因此,Fiddler 对浏览器和搜狗服务器之间的数据交互都非常清楚。

3、抓包结果

以下是抓到的 HTTP 请求:

首行:[方法] + [URL] + [版本]
Header:请求的属性,用 : 分隔开的键值对,每组属性之间用 \n 分割开,遇到空行表示 Header 结束
Body:空行后都是 Body ,Body 允许为空字符串,如果有 Body ,则在 Header 中会有 Content-Length 属性来标识 Body 的长度

以下是抓到的 HTTP 响应:

首行:[版本号] + [状态码] + [状态码解释]
Header:请求的属性,用 : 分隔开的键值对,每组属性之间用 \n 分割开,遇到空行表示 Header 结束
Body:空行后都是 Body ,Body 允许为空字符串,如果有 Body ,则在 Header 中会有 Content-Length 属性来标识 Body 的长度;如果用户返回了一个 html 页面,那么 html 页面内容就是在 Body 里面

4、协议格式总结

为什么 HTTP 要存在空行?
因为 HTTP 报头没有规定键值对有多少个,用空行来表示报头的结束标志,也是报头和正文之间的分割符。
HTTP 传输层依赖 TCP 协议,TCP 是面向字节流的,如果没有这个空行分割则会出现“粘包问题”。

五、HTTP 请求 (Request)

1、认识 URL

1.1 URL 基本格式

平时我们俗称的网址就是 URL(Uniform Resource Locator 统一资源定位符),互联网上每一个文件都有 URL,它包含的信息指出文件的位置和浏览器该怎么处理它。
URL 的详细规则由 因特网标准RFC1738 进行了约定 https://datatracker.ietf.org/doc/html/rfc1738

一个具体的 URL:

https://v.bitedu.vip/personInf/student?userId=10000&classId=100
  • https 协议方案名,常见的有 http 、https,还有其他的如 jdbc:mysql
  • user:pass 登录信息,现在的网站一般不通过 URL 进行身份认证,所以一般都会省略
  • v.bitedu 服务器地址,这里是一处“域名”,域名会通过 DNS 系统解析成一个具体的 IP 地址
  • 80 服务器端口号,上述 URL 省略了端口号,如果省略的端口号浏览器会根据协议自动选择端口号,http 默认端口号 80,https 默认端口号 443
  • dir/index.html 带层次的文件路径
  • userId=10000&classId=100 查询字符串(query string),本质是一个键值对结构,键值对之间可以用 & 分隔,键和值之间可以用 = 分隔
  • 片段标识:此处省略了片段标识,片段标识用于页面内跳转(如Vue 官方文档 https://v2.cn.vuejs.org/v2/guide/#%E8%B5%B7%E6%AD%A5),通过不同的片段标识跳转到页面内不同的章节

关于 query string:里面的内容都是键值对,其中 key 和 value 都是我们自己约定的,我们可以通过约定的键值对给服务器传输信息

URL 中可以省略的信息:

  • 协议名:可以省略,省略后默认为 http://
  • ip 地址/域名:在 HTML 中可以省略(比如 img、link、script、a 标签的 src 或者 href 属性),省略后表示服务器的 ip / 域名和当前 HTML 所属的 ip / 域名一致
  • 端口号:可以省略,http 默认端口号 80 ,https 默认端口号 443
  • 带层次的文件路径:可以省略,省略后相当于 / ,有些服务器会在发现 / 时自动跳转到 /index.html
  • 查询字符串:可以省略
  • 片段标识:可以省略

1.2 关于 URL encode

/ ? :等这样的字符,已经被 url 当做特殊意义理解了,因此这些字符不能随意出现。比如,某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义

转义的规则如下:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式

例如:+ 被转义成了 %2B

urldecode就是urlencode的逆过程,urlencode工具

2、认识 “方法” (method)

GET 方法

POST 方法

其他方法

3、认识请求 “报头” (header)

4、认识请求 “正文” (body)

六、HTTP 响应详解

七、通过 form 表单构造 HTTP 请求

八、通过 ajax 构造 HTTP 请求

九、通过 Java socket 构造 HTTP 请求

  • 38
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值