JavaEE--网络编程 http请求 :URL 方法get 和 post

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地址.

  1. 在开始菜单中输⼊ cmd ,打开 命令提⽰符

  2. 在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格式

  1. 核心作用
    • 解决 URL 中特殊字符(如空格、中文、符号等)无法直接传输的问题,确保参数能被服务器正确解析。
  2. 典型应用场景
    • URL 的查询字符串(query 部分)参数编码;
    • 表单数据的提交(如 HTTP POST 请求的application/x-www-form-urlencoded编码方式)。
  3. 实际示例
    • 以中文 "测试" 为例,其 UTF-8 编码的二进制字节为0xE6 0xB5 0x8B 0xE8 0xAF 0x95,经 urlencode 编码后会变为%E6%B5%8B%E8%AF%95

"+" 被转义成了"%2B"

urldecode就是urlencode的逆过程;

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协议规则的字符串.

幂等是指对同一个操作执行一次或多次,产生的结果和副作用完全一致的特性,核心是 "多次执行与单次执行的效果等价"。

核心特点

  1. 结果一致:多次执行操作后,系统的状态与只执行一次的状态相同;
  2. 副作用可控:"副作用" 指对系统资源的修改(如数据新增、状态变更),幂等操作的副作用不会随执行次数增加而累积。
相关推荐
好好研究1 小时前
MyBatis框架 - 注解形式
java·数据库·mysql·maven·mybatis
爬山算法1 小时前
Redis(154)Redis的数据一致性如何保证?
数据库·redis·bootstrap
e***0961 小时前
postgresql链接详解
数据库·postgresql
踢球的打工仔1 小时前
mysql数据表的基本操作
数据库·mysql
踢球的打工仔1 小时前
mysql链接(2)
数据库·mysql
专注API从业者1 小时前
构建分布式京东商品数据采集器:基于微服务的架构设计与实现
数据结构·数据库·分布式·微服务·架构
h***01541 小时前
MySQL数据库的数据文件保存在哪?MySQL数据存在哪里
数据库·mysql
k***21601 小时前
MySQL 批量插入详解:快速提升大数据导入效率的实战方法
大数据·数据库·mysql
chenyuhao20242 小时前
MySQL事务
开发语言·数据库·c++·后端·mysql