网络原理-HTTP
1. HTTP是什么
HTTP是一种基于传输层TCP并位于应用层的超文本协议
目前主要使用HTTP1.1和HTTP2.0
2. HTTP协议基本格式
2.1 使用Fiddler抓包进行分析
关于Fiddler:
- 是一个代理工具,就像高速路上的收费站,不管什么车,只要它从高速路上经过,那么就需要经过收费站
- 对应到网站上,就是不管什么网站,只要有数据的上传下载,那么就会经过Fiddler,此时Fiddler就能够知道所有网站的信息
使用方法:
-
删除无关抓包信息(ctrl+A,delete)
-
打开想要抓包的网站 > 蓝色对应的即是request
-
查看request
在Fiddler的右半边,查看请求和响应
结果:
2.2 分析结果
请求:
GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
sec-ch-ua: "Chromium";v="122", "Not(A:Brand";v="24", "Microsoft Edge";v="122"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,zh-TW;q=0.5
Cookie: BIDUPSID=E1CBCCEF16E949D2FB803515D5054D7C; PSTM=1697071850; BD_UPN=12314753; sug=0; sugstore=0; BAIDUID=E1CBCCEF16E949D20FBD5E22D2DA6844:SL=0:NR=10:FG=1; ORIGIN=2; bdime=0; H_WISE_SIDS=40009_40204_39661_40207_40215_40266_40295_40290_40287_40285; H_WISE_SIDS_BFESS=40009_40204_39661_40207_40215_40266_40295_40290_40287_40285; newlogin=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BA_HECTOR=852l8g05858g0g8h850g0580jpjv5b1iv0e401s; ZFY=3PherofMOQjTtCmZZKg9U85hiYToS99infKIvCcpg:Bc:C; BAIDUID_BFESS=E1CBCCEF16E949D20FBD5E22D2DA6844:SL=0:NR=10:FG=1; H_PS_PSSID=40009_39661_40207_40215_40295_40290_40287_40285_40318_40079_40365_40352_40369_40374_40401_40415
-
首行:“方法 url HTTP版本”
-
Header:以键值对的形式进行标识,每组属性之间使用\n进行分隔
-
Body:与Header部分有一个空行,其主体用来传递数据
- Body可以为空
- 不为空时,在Header部分会有Content-type属性标识Body的长度
响应:
HTTP/1.1 200 OK
Connection: keep-alive
Content-Security-Policy: frame-ancestors 'self' https://chat.baidu.com http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com http://debug.baidu-int.com;
Content-Type: text/html; charset=utf-8
Date: Tue, 12 Mar 2024 14:57:29 GMT
Server: BWS/1.1
Set-Cookie: H_PS_PSSID=40009_39661_40207_40215_40295_40290_40287_40285_40318_40079_40365_40352_40369_40374_40401_40415; path=/; expires=Wed, 12-Mar-25 14:57:29 GMT; domain=.baidu.com
Traceid: 1710255449131260929015864326830156617079
X-Ua-Compatible: IE=Edge,chrome=1
X-Xss-Protection: 1;mode=block
Content-Length: 406157
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color" content="#ffffff"><meta name="description" content="全球领先的中文搜索引擎、致力于让网民更便捷地获取信息,找到所求。百度超过千亿的中文网页数据库,可以瞬间找到相关的搜索结果。"><link rel="shortcut icon"
......
-
首行:“版本号 状态码 状态码解释”
-
Header:以键值对的形式进行标识,每组属性之间使用\n进行分隔
-
Body:与Header部分有一个空行,其主体用来传递数据
- Body可以为空
- 不为空时,在Header部分会有Content-type属性标识Body的长度
为什么都会有一个“空行”存在?
因为空行表示当前Header部分结束。
如果没有这个标识,会因为底层使用TCP而发生**“粘包”问题**
3. HTTP请求(Request)
3.1 方法
方法 | 说明 | 支持的版本 |
---|---|---|
get | 获取资源(可以请求缓存,无长度限制) | 1.0,1.1 |
post | 提交表单数据,创建更新资源(不可请求缓存,无长度限制) | 1.0,1.1 |
put | 传输文件 | 1.0,1.1 |
head | 获取报文首部 | 1.0,1.1 |
delete | 删除文件 | 1.0,1.1 |
options | 查询指定资源针对URL请求支持的方法 | 1.1 |
trace | 跟踪路径 | 1.1 |
connect | 连接改为管道方式 | 1.1 |
link | 请求和服务器建立连接 | 1.0 |
unline | 断开连接 | 1.0 |
3.2 GET方法
使用Fiddler进行抓包观察:
特点
-
首行的第一部分显示为:“GET”
-
URL的query string可以为空,也可以不为空
一个网址中==在问号后面的==就是query string内容
-
Header部分为键值对结构
-
body部分为空(所以Header部分没有Content-Length)
3.3 POST方法
使用Fiddler进行抓包观察:
特点
-
首行第一部分为POST
-
body部分不为空
长度由Header部分的Content-Length决定
数据格式由Header部分的Content-Type决定
-
URL的query string⼀般为空(也可以不为空)
同GET方法的query string
3.4 GET与POST的区别?
-
GET请求一般是幂等的
POST请求一般不是幂等的
幂等就是多次请求得到的结果仍然相同
-
GET请求一般用于获取资源
POST请求一般用于提交数据
-
GET请求可以被缓存
POST请求不被缓存
因为POST每次获取的数据都是不一样的, 所以不便于缓存
但是GET请求每次都是重复内容, 缓存后能够加快访问速度
-
GET请求的body一般为空, 使用query string 进行数据传递
POST请求的query string 一般为空, 使用body进行数据传递
以上区别都不是硬性的, 都只是标准中的建议, 实际使用过程中完全可以不遵守这个约定.
- 可以将GET用于发送数据, POST用于获取数据
- GET也可是不幂等的
- 因为,有些网站中, 可以根据用户的历史记录进行实时个性化推荐
- 这同样使用了GET, 但是这个返回的数据每次都是不同的
4. 请求"报头"(Header)
-
Host: 表示服务器主机的地址和端口
-
Content-Length: body长度
-
Content-Type: body数据格式
-
User-Agent (UA): 标识访问服务器的操作系统, 浏览器的属性信息
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0
- (Windows NT 10.0; Win64; x64) : 是操作系统信息
- Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0: 是浏览器信息
-
Referer: 表示当前页面由哪个页面跳转过来
Referer: https://www.baidu.com/
-
Cookie : 用户登录网站的"令牌"
- 就像以前出入皇宫, 都需要进行严格的查验, 但是只要你拥有皇上钦赐的==“黄马褂”==, 那么就可以畅通无阻
- 网站中的cookie, 就是发挥着记录你登陆网站的信息, 比如用户名和密码等, 下次再进行登录的时候就可以不用输入用户名和密码
- cookie会保存在用户的本地, 有些cookie是永久性的(除非手动删除), 有些cookie是有有效期的
5. 状态码(Status Code)
5.1 2xx 成功
-
200 OK
:请求成功。 -
201 Created
:请求成功并且服务器创建了新的资源。 -
202 Accepted
:服务器已接受请求,但尚未处理。 -
204 No Content
:服务器成功处理了请求,但没有返回任何内容。
5.2 3xx 重定向
-
301 Moved Permanently
:请求的资源已永久移动到新位置。-
就像以前经常换号的那个年代, 一个已经被很多朋友知道的手机号, 不想一一通知他们换了新号, 那就办理一个==“呼叫转移”==服务,
-
别人还是可以照常打到以前的那个号码, 但是会直接拨通到现在这个新号
-
-
302 Found
(旧称Moved Temporarily
):请求的资源现在临时从不同的URI响应请求。 -
304 Not Modified
:自从上次请求后,请求的资源未修改过。文章来源:https://www.toymoban.com/news/detail-842157.html
5.3 4xx 客户端错误
-
400 Bad Request
:服务器不理解请求的语法。 -
401 Unauthorized
:请求要求身份验证。 -
403 Forbidden
:服务器拒绝请求。 -
404 Not Found
:服务器找不到请求的资源。 -
429 Too Many Requests
:用户在给定的时间内发送了太多的请求。
5xx 服务器错误
-
500 Internal Server Error
:服务器遇到错误,无法完成请求。 -
501 Not Implemented
:服务器不具备完成请求的功能。 -
502 Bad Gateway
:服务器作为网关或代理,从上游服务器收到无效响应。 -
503 Service Unavailable
:服务器暂时不可用(超载或停机维护)。 -
504 Gateway Timeout
:服务器作为网关或代理,但是没有及时从上游服务器收到请求。
6. 响应正文(body)
最重要的属性是Content-Type文章来源地址https://www.toymoban.com/news/detail-842157.html
- text/html :body数据格式是HTML
- text/css :body数据格式是CSS
- application/javascript :body数据格式是JavaScript
- application/json :body数据格式是JSON
到了这里,关于【JavaEE】网络原理-HTTP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!