【JavaEE】网络原理-HTTP

网络原理-HTTP

1. HTTP是什么

HTTP是一种基于传输层TCP并位于应用层的超文本协议

目前主要使用HTTP1.1和HTTP2.0


2. HTTP协议基本格式

2.1 使用Fiddler抓包进行分析

关于Fiddler:

  1. 是一个代理工具,就像高速路上的收费站,不管什么车,只要它从高速路上经过,那么就需要经过收费站
  2. 对应到网站上,就是不管什么网站,只要有数据的上传下载,那么就会经过Fiddler,此时Fiddler就能够知道所有网站的信息

使用方法:

  1. 删除无关抓包信息(ctrl+A,delete)
    在这里插入图片描述

  2. 打开想要抓包的网站 > 蓝色对应的即是request 在这里插入图片描述

  3. 查看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


  1. 首行:“方法 url HTTP版本”

  2. Header:以键值对的形式进行标识,每组属性之间使用\n进行分隔

  3. Body:与Header部分有一个空行,其主体用来传递数据

    1. Body可以为空
    2. 不为空时,在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" 
......
  1. 首行:“版本号 状态码 状态码解释”

  2. Header:以键值对的形式进行标识,每组属性之间使用\n进行分隔

  3. Body:与Header部分有一个空行,其主体用来传递数据

    1. Body可以为空
    2. 不为空时,在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进行抓包观察:

在这里插入图片描述

特点
  1. 首行的第一部分显示为:“GET”

  2. URL的query string可以为空,也可以不为空

    一个网址中==在问号后面的==就是query string内容在这里插入图片描述

  3. Header部分为键值对结构

  4. body部分为空(所以Header部分没有Content-Length)

3.3 POST方法

使用Fiddler进行抓包观察:

在这里插入图片描述

特点
  1. 首行第一部分为POST

  2. body部分不为空

    长度由Header部分的Content-Length决定

    数据格式由Header部分的Content-Type决定

  3. URL的query string⼀般为空(也可以不为空)

    同GET方法的query string

3.4 GET与POST的区别?
  1. GET请求一般是幂等的

    POST请求一般不是幂等的

    幂等就是多次请求得到的结果仍然相同

  2. GET请求一般用于获取资源

    POST请求一般用于提交数据

  3. GET请求可以被缓存

    POST请求不被缓存

    因为POST每次获取的数据都是不一样的, 所以不便于缓存

    但是GET请求每次都是重复内容, 缓存后能够加快访问速度

  4. GET请求的body一般为空, 使用query string 进行数据传递

    POST请求的query string 一般为空, 使用body进行数据传递

以上区别都不是硬性的, 都只是标准中的建议, 实际使用过程中完全可以不遵守这个约定.

  • 可以将GET用于发送数据, POST用于获取数据
  • GET也可是不幂等的
    • 因为,有些网站中, 可以根据用户的历史记录进行实时个性化推荐
    • 这同样使用了GET, 但是这个返回的数据每次都是不同的

4. 请求"报头"(Header)

  1. Host: 表示服务器主机的地址和端口

  2. Content-Length: body长度

  3. Content-Type: body数据格式

  4. 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: 是浏览器信息
  5. Referer: 表示当前页面由哪个页面跳转过来

    Referer: https://www.baidu.com/

  6. 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:自从上次请求后,请求的资源未修改过。

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

  1. text/html :body数据格式是HTML
  2. text/css :body数据格式是CSS
  3. application/javascript :body数据格式是JavaScript
  4. application/json :body数据格式是JSON
  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值