HTTP请求(Request)
认识URL
URL基本格式
平时我们俗称的**"网址"其实就是说的URL** (UniformResourceLocator统⼀资源定位符). 互联⽹上的每个文件都有⼀个唯⼀的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它. URL的详细规则由因特网标准RFC1738进行了约定.https://datatracker.ietf.org/doc/html/rfc1738
⼀个具体的URL:
1 https://v.bitedu.vip/personInf/student?userId=10000\&classId=100
- https :协议方案名.常⻅的有http和https,也有其他的类型.(例如访问mysql时⽤的 jdbc:mysql )
- user:pass :登陆信息.现在的网站进行⾝份认证⼀般不再通过URL进行了.⼀般都会省略
- v .bitedu.vip :服务器地址.此处是⼀个"域名",域名会通过DNS系统解析成⼀个具体的IP地 址.(通过ping命令可以看到, v.bitedu.vip 的真实IP地址为 118.24.113.28 )
- 端口号:上⾯的URL中端口号被省略了.当端口号省略的时候,浏览器会根据协议类型自动决定使⽤ 哪个端口.例如http协议默认使用80端口,https协议默认使用443端口.
- personInf/student :带层次的⽂件路径.
- userId=10000&classId=100 :查询字符串(querystring).本质是⼀个键值对结构.键值对之 间使⽤&分隔.键和值之间使⽤=分隔.
- •片段标识:此URL中省略了片段标识.片段标识主要⽤于页面内跳转.(例如Vue官官方文档: https://cn.vuejs.org/v2/guide/#起步, 通过不同的片段标识跳转到文档的 不同章节
使⽤ping命令查看域名对应的IP地址.
-
在开始菜单中输⼊ cmd ,打开 命令提⽰符
-
在cmd中输入 ping v.bitedu.vip ,即可看到域名解析的结果
- PS: 有的电脑上ping命令会报错 ping 不是内部或外部命令,也不是可运⾏的程序或批处理⽂件 . 这种情况是因为有的Windows10默认没有启用ping命令. 百度搜索 windows10 启⽤ ping 即可.
URL 的 query(也叫 "查询字符串")是 URL 中用来向服务器传递参数的部分,通常跟在问号(?)后面。
它的核心特点是:
- 结构 :由
key=value形式的键值对组成,多个参数用&分隔; - 示例 :比如
https://example.com/search?keyword=书籍&page=2中,keyword=书籍&page=2就是 query,其中keyword是搜索关键词参数,page是分页参数; - 作用:用来传递请求的附加信息(如搜索条件、筛选规则等),帮助服务器返回对应结果。
关于query string
query string 中的内容是键值对结构.其中的key和value的取值和个数,完全都是程序猿自己约定 的.我们可以通过这样的方式来自定制传输我们需要的信息给服务器
URL中的可省略部分
- 协议名:可以省略,省略后默认为http://
- ip地址/域名:在HTML中可以省略(⽐如img,link,script,a标签的src或者href属性).省略后表 ⽰服务器的ip/域名与当前HTML所属的ip/域名⼀致.
- 端口号:可以省略.省略后如果是http协议,端口号自动设为80;如果是https协议,端⼝号⾃动设为 443.
- 带层次的⽂件路径:可以省略.省略后相当于/.有些服务器会在发现/路径的时候⾃动访问 /index.html
- 查询字符串:可以省略
- 片段标识:可以省略
关于URLencode
像/?:等这样的字符,已经被url当做特殊意义理解了.因此这些字符不能随意出现. 比如,某个参数中需要带有这些特殊字符,就必须先对特殊字符进⾏转义
⼀个中⽂字符由UTF-8或者GBK这样的编码方式构成,虽然在URL中没有特殊含义,但是仍然需要进行转义.否则浏览器可能把UTF-8/GBK编码中的某个字节当做URL中的特殊符号
转义的规则如下:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做 ⼀位,前面加上%,编码成%XY格式
- 核心作用
- 解决 URL 中特殊字符(如空格、中文、符号等)无法直接传输的问题,确保参数能被服务器正确解析。
- 典型应用场景
- URL 的查询字符串(query 部分)参数编码;
- 表单数据的提交(如 HTTP POST 请求的
application/x-www-form-urlencoded编码方式)。
- 实际示例
- 以中文 "测试" 为例,其 UTF-8 编码的二进制字节为
0xE6 0xB5 0x8B 0xE8 0xAF 0x95,经 urlencode 编码后会变为%E6%B5%8B%E8%AF%95。
- 以中文 "测试" 为例,其 UTF-8 编码的二进制字节为
"+" 被转义成了"%2B"
urldecode就是urlencode的逆过程;
认识"方法"(method)
1. GET方法
GET是最常用的HTTP方法.常用于获取服务器上的某个资源.
在浏览器中直接输入URL,此时浏览器就会发送出⼀个GET请求.
另外,HTML中的link,img,script等标签,也会触发GET请求.
后面我们还会学习,使用JavaScript中的ajax也能构造GET请求.
使用Fiddler观察GET请求
打开Fiddler,访问搜狗主页,观察抓包结果
注意:要摁住 CTRL+ 游览器的刷新
在上⾯的结果中可以看到:
最上面的
是通过浏览器地址栏发送的GET请求. 下面的和sogou域名相关的请求,有些是通过html中的link/script/img标签产生的,例如
有些是通过ajax的方式产生的,例如:
选中第⼀条
关于GET请求的URL长度问题
网上有些资料上描述: get 请求长度最多 1024kb 这样的说法是错误的.
HTTP协议由RFC2616标准定义,标准原⽂中明确说明:"HypertextTransferProtocol--HTTP/1.1," doesnotspecify any requirement for URLlength.
没有对URL的长度有任何的限制.
实际URL的长度取决于浏览器的实现和HTTP服务器端的实现.在浏览器端,不同的浏览器最大长度 是不同的,但是现代浏览器支持的长度⼀般都很长;在服务器端,⼀般这个长度是可以配置的
2. POST方法
POST方法也是⼀种常见的方法.多用于提交用户输入的数据给服务器(例如登陆页面)
通过HTML中的form标签可以构造POST请求,或者使用JavaScript的ajax也可以构造POST请求.
使⽤Fiddler观察POST方法
点击这个请求,查看请求详情
POST https://v.bitedu.vip/tms/login HTTP/1.1
Host: v.bitedu.vip
Connection: keep-alive
Content-Length: 105
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,
Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS
Content-Type: application/json;charset=UTF-8
Access-Control-Allow-Origin: *
Accept: application/json, text/plain, */*
Access-Control-Allow-Headers: Content-Type, Content-Length, Authorization, Accep
Origin: https://v.bitedu.vip
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://v.bitedu.vip/login
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: username=123456789; rememberMe=true
{"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05ccde64b16
POST请求的特点
- 首行的第⼀部分为POST
- URL的querystring⼀般为空(也可以不为空)
- header部分有若⼲个键值对结构.
- body部分⼀般不为空.body内的数据格式通过header中的 由header中的 Content-Length 指定.
谈谈GET和POST的区别
- 语义不同:GET⼀般用于获取数据, POST⼀般提交提交数据. Content-Type 指定.body的⻓度
- GET的body⼀般为空,需要传递的数据通过query string传递,POST的query string⼀般为空,需 要传递的数据通过body传递
- GET请求⼀般是幂等的,POST请求⼀般是不幂等的.(如果多次请求得到的结果⼀样,就视为请求是 幂等的).
- GET可以被缓存,POST不能被缓存.(这⼀点也是承接幂等性).
补充说明:
- 关于语义:GET完全可以⽤于提交数据,POST也完全可以⽤于获取数据.
- 关于幂等性:标准建议GET实现为幂等的.实际开发中GET也不必完全遵守这个规则(主流⽹站都有 "猜你喜欢"功能,会根据⽤⼾的历史⾏为实时更新现有的结果.
- 关于安全性:有些资料上说"POST⽐GET请安全".这样的说法是不科学的.是否安全取决于前端在 传输密码等敏感信息时是否进行加密,和GETPOST无关.
- 关于传输数据量:有的资料上说"GET传输的数据量小,POST传输数据量⼤".这个也是不科学的,标 准没有规定GET的URL的长度,也没有规定POST的body的长度.传输数据量多少,完全取决于不 同浏览器和不同服务器之间的实现区别.
- 关于传输数据类型:有的资料上说"GET只能传输⽂本数据,POST可以传输⼆进制数据".这个也是 不科学的.GET的querystring虽然无法直接传输⼆进制数据,但是可以针对⼆进制数据进行url encode.
3. 其他方法
• PUT与POST相似,只是具有幂等特性,⼀般⽤于更新
• DELETE删除服务器指定资源
• OPTIONS返回服务器所支持的请求方法
• HEAD类似于GET,只不过响应体不返回,只返回响应头
• TRACE回显服务器端收到的请求,测试的时候会用到这个
• CONNECT预留,暂⽆使⽤
这些方法的HTTP请求可以使⽤ajax来构造.(也可以通过⼀些第三⽅⼯具)
任何⼀个能进行网络编程的语⾔都可以构造HTTP请求.本质上就是通过TCPsocket写⼊⼀个符合 HTTP协议规则的字符串.
幂等是指对同一个操作执行一次或多次,产生的结果和副作用完全一致的特性,核心是 "多次执行与单次执行的效果等价"。
核心特点
- 结果一致:多次执行操作后,系统的状态与只执行一次的状态相同;
- 副作用可控:"副作用" 指对系统资源的修改(如数据新增、状态变更),幂等操作的副作用不会随执行次数增加而累积。