java之http协议1

张开发
2026/6/15 23:27:42 15 分钟阅读
java之http协议1
HTTP协议介绍HTTP (全称为 超文本传输协议) 是一种应用非常广泛的 应用层协议我们在生活中经常用到。举个HTTP在日常生活中的用例打开一个网站我们通过浏览器来访问学校的教务系统时候我们输入一串网址的时候此时就是通过HTTP的方式和学校教务系统的服务器进行交互浏览器给学校教务系统的服务器发送一个HTTP请求然后学校服务器给浏览器回一个HTTP响应。当这个响应被浏览器解析后浏览器上就会显示页面内容这个过程中浏览器可能会给服务器发送多个 HTTP 请求, 服务器会对应返回多个响应, 这些响应里就包含了页面 HTML, CSS, JavaScript, 图片,字体等信息所谓 “超文本” 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些其他的资源, 比如图片, 视频, 音频等二进制的数据虽然HTTP的作用很大应用很广但是实际开发中不一定是真的直接使用HTTP更大的概率是使用HTTPS本质上是HTTP引入的加密层s指安全即叫做超文本安全传输协议。很少直接使用HTTPHTTP 往往是基于传输层的 TCP 协议实现的. (HTTP1.0, HTTP1.1, HTTP2 .0 均为TCP, HTTP3 基于 UDP实现)目前我们主要使用的还是 HTTP1.1 和 HTTP2.0 . 该文章主要讲述HTTP1.1Fiddler抓包当我们在浏览器中输入一个 “网址”此时浏览器就会给对应的服务器发送一个HTTP 请求。 对方服务器收到这个请求之后经过计算处理 就会返回一个 HTTP 响应。也就是典型的一问一答模式请求和响应是一一对应的。事实上, 当我们访问一个网站的时候, 可能涉及不止一次的 HTTP 请求/响应的交互过程会有超多的请求。那么要想进一步的理解HTTP协议工作过程以及理解HTTP的报文格式就需要用到抓包工具这样才能更好了解HTTP协议HTTP抓包工具种类有很多比如 wireshark它功能非常强大,使Fi用起来也比较复杂的用这个也能抓 HTTP, 但是不太方便。这里我们推荐使用Fiddler它是专门抓HTTP的工具打开Fiddler页面左侧包含你主机上所有进程http请求/响应数据右侧是对左侧某个数据包双击之后的一个详细信息一个网页打开的时候,往往不只是和服务器进行一次操作是很多次操作比如我们对csdn来进行抓包这些结果都是浏览器打开csdn的时候给csdn发送的http/https的请求数据。这里很多数据我们主要关注的是蓝色的数据其他可以不用关心现在我们就可以观察蓝色数据的报文格式右侧上方的是请求报文我们点击raw则可以观察到原始的请求数据如果觉得字体小了还可以点击view in notepad(右下角)右侧下方则是响应报文这里有个疑问为什么看不懂该报文这是因为此时它是二进制协议报文所以看不懂数据。但是HTTP 协议是文本格式的协议TCP, UDP, IP才是二进制格式的协议这里为什么好端端的文本格式协议变为二进制格式的协议文本格式协议和二进制格式协议区别在于看不看得懂内容这是因为HTTP 响应通常会被压缩为二进制格式的协议压缩之后体积变小,传输的时候节省网络带宽一台服务器最贵的就是网络带宽此时想要看清楚原本的内容我们只需点击黄色的内容即可解压变为文本格式协议内容之后的操作就跟请求报文时一样不多说了除此以外还有一个小技巧可以使用 ctrl a 全选左侧的抓包结果, delete 键清除所有被选中的结果快捷键对于Fiddler其实相当于一个 “代理服务器”.浏览器访问 csdn.com 时, 会把 HTTP 请求先发给 Fiddler, Fiddler 再把请求转发给 csdn 的服务器.当 csdn 服务器返回数据时, Fiddler 拿到返回数据, 再把数据交给浏览器.因此 Fiddler 对于浏览器和 sogou 服务器之间交互的数据细节, 都是非常清楚的所以才能抓取包。代理也有正向代理和反向代理可以简单的理解为帮助客户端跑腿的为正向代理帮助服务器跑腿的为反向代理。反向代理我们这里先不说除了 fiddler 之外, 有的程序也是代理如加速器和vpn。这些代理程序之间,可能是冲突的。所以使用 fiddler抓包前, 一定要检査关闭之前的代理软件否则可能会抓包不成功。HTTP协议格式学习一个协议我们肯定要知道它的格式HTTP协议格式跟其他协议不同它的请求报文格式和响应报文格式是不同的我们可以通过刚学的Fiddler去抓包看下请求和响应的内容。学习一个协议我们肯定要知道它的格式HTTP协议格式跟其他协议不同它的请求报文格式和响应报文格式是不同的我们可以通过刚学的Fiddler去抓包看下请求和响应的内容。请求报文格式请求报文格式由首行请求头header空行正文body 组成首行——URLHTTP 请求的第一行.有三个部分信息,三个部分使用 空格 分割下图是一个经典例子我们来分析下1.GET, HTTP 请求的方法(method)2.URL 唯一资源定位符,描述了一个资源在网络上的位置。3.版本号 HTTP/1.1这里要重点讲述的由第一个信息方法 和 第二个信息URL 我们先讲URL平时我们俗称的 “网址” 其实就是说的 URL (Uniform Resource Locator 统一资源定位符)URL的详细规则由因特网标准RFC1738 进行了约定其详细格式如下1.协议方案名: 常见的有 http 和 https,告诉你是哪个协议 也有其他的类型.(例如访问 mysql 时用的jdbc:mysql )2.登陆信息: 现在的网站进行身份认证一般不再通过 URL 进行了, 一般都会省略属于上古时期的方式现在都没有人这么进行登录了3.服务器地址: 要访问的服务器是哪个此处是一个 “IP地址/域名”, 域名会通过 DNS 系统解析成一个具体的 IP 地址4.端口号: 上面的 URL 中端口号可以被省略, 当端口号省略的时候, 浏览器会根据协议类型自动决定使用哪个端口 (例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口)5.带层次的文件路径: 描述了要访问服务器的哪个资源一个服务器可提供很多资源供外界访问比如web服务器网站就可能会包含很多不同的网页就可以通过这里的路径区分不同的网页。6.查询字符串(query string): 本质是一个键值对结构它以开头 键值对之间使用 分隔, 键和值之间使用 分隔1个 url 中的 query string 里可以包含 N 个键值对甚至可能更长。查询字符串是程序猿自定义的不像 header 中的键值对是标准规定的。我们可以通过这样的方式来自定制传输我们需要的信息给服务器。请求报文中的body作用也是如此自定制传输我们需要的信息之后在讲方法时我们会讲这里还要提一点对于 query string 来说,如果 value 部分要包含特殊符号或者中文字符的话,往往需要进行 urlencode 操作urlencode 本质上是一种转义字符如进行urlencode操作后就是2B%2B为什么要urlencode操作呢因为像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.query string里面的value部分一旦也包含这些符号不就乱套了吗就会使url的解析出现问题如果不处理好,有些浏览器就可能会解析失败,导致请求无法正常进行.另外我们在游览器网址上可能看到该现象有中文汉字出现那这是什么情况实际上如果把这串url复制粘贴到记事本那么就又回到了urlencode编码状态这是因为浏览器为了让用户看起来更加直观所以就按照转码之前的方式进行显示的实际上网络传输的请求依旧是转码之后的状态。7.片段标识符有的网页内容比较长,就可以分成多个片段”,通过片段标识符,就可以完成页面内部的跳转这个一般应用于技术文档普通网站都不会存在片段标识符首行——方法对于这些方法最常用的是Get和Post方法其他方法很少使用。Get方法GET 是最常用的 HTTP 方法常用于获取服务器上的某个资源.网络上大部分请求都是GET方法。GET请求中程序员自定制想要传输的信息都存放在query string中里面不包含bodybody也是用于自定制传输信息Post方法POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆上传文件)Post请求中程序员自定制想要传输的信息都存放在body中url中不包含query stringGet与Post的区别这是一个经典的面试题开篇, 我们先盖棺定论, GET 和 POST 没有本质区别(双方甚至可以替换对方的场景)这是因为这些 HTTP 请求,最初的初心就是为了表示不同的语义”对于语法规定并没规定其有什么本质不同所以实际上程序员如何使用,可以更加随意因为语法上没有严格规定不同所以就算乱用也不会报错。GET和POST没有本质区别其实也可以说上述所有方法就没有本质区别可以乱着用虽然GET和POST没有本质区别但使用习惯上我们程序员还是普遍达成了一个共识使它们存在一些差异1.GET 经常是把自定制传递给服务器的数据放到 query string 中; POST 则是经常放到 body 中.(使用习惯上最大的差别)2.语义上的差异 GET用来获取数据POST 用来提交数据上述这些习惯虽然我们可以不遵循但还是建议大家遵守上述的约定俗称的习惯因为大家都用该习惯。请求头header它是一个键值对结构的数据每个键值对都是独占一行的,键和值之间使用 :空格 来区分键值对之间以换行符分割。header中的键值对跟query string不同query string中的键值对是程序猿自己定义的而header中的键值对都是标准规定的内容。header中包含的键值对有很多但是大部分都不关键主要介绍几个关键的。HOST表示目标服务器的域名或 IP 地址。Conte-Length表示 body 中的数据长度单位是字节一旦有了body就需要知道body的长度才能知道一个完整的http请求。由于HTTP是基于TCP那么这里就会谈到粘包问题前面我们谈到的粘包问题有两种解决方案一个是指定分隔符一个是指定长度。如果是GET请求没有body通过空行如果是POST请求有body通过空行找到body的开始通过Conte-Length找到body的介绍位置。Content-Typent表示请求报文中body内部的数据类型有以下三种数据类型1.json具体类型为 application/json2.form表单的格式具体类型为application/x-www-form-urlencodedform3.form-data 的格式multipart/form-data: formUser-Agent (简称 UA)UA里的信息主要有两个部分浏览器版本操作系统版本在以前UA主要是描述你用啥样的设备啥样的浏览器。对于现在来说作用不是很大了以前的时候因为浏览器的版本差异太大有的不能接受图片视频等等所以来区分但是现在浏览器的版本其实大差不差现在主要是区分该设备是pc端还是移动端Referer表示当前页面是从哪个页面跳转过来的.如果直接在浏览器中输入URL, 或者直接通过收藏夹访问页面时是没有 Referer 的.在搜狗浏览器搜索信息时页面跳转此处的Referer就是表示从搜狗主页跳转过来的。用途对于网页上面的广告用户点击一次搜狗就能挣钱按点击计费那么在一个月之内某个广告被点击的次数就需要进行统计搜狗需要统计广告主也需要统计。每次点击就会把请求发送到搜狗服务器上搜狗的服务器就可以记录一条日志日志就是打印。广告主这边也会有服务器每次收到请求就会记录一条日志统计日志的数目即可。广告主可能有多渠道投放就需要对不同的渠道进行区分此时就可以通过Referer进行区分是从搜狗跳转过来的Referer就是搜狗的域名从百度跳转过来的Referer就是百度的域名。有没有一种可能,存在某个人把访问广告主服务器的请求的 referer 给修改了呢?运营商移动联通等完全有能力做这个事情修改成别人的refer自己再赚一笔在2015年存在非常多这样的现象,这叫做运营商劫持。运营商劫持每天都会对互联网公司造成巨大损失公司就从技术上进行反制HTTPS就是重要的反制手段HTTPS直接针对HTTP请求中的内容进行加密这样就不会再被修改了关于https如何加密后序介绍cookieCookie 可以认为是 浏览器 在本地存储数据的一种机制。在程序运行过程中,需要一些数据在浏览器这边存储,并且在后续请求的时候数据可能需要再发给服务器所以我们就利用cookie存储这些数据如上次登陆时间.上次访问时间.用户的身份信息累计的访问次数。实际上更容易想到的是,把这样的数据直接存储到本地文件中但是实际上不可行的.浏览器为了考虑到安全性,禁止网页直接访问你的电脑的文件系统网页代码中也就无法直接生成一个硬盘的文件来储数据了.为了保证安全性,又能进行存储数据,于是就引入了 Cookiecookie内部只能存储键值对键值对之间,使用;分割 键和值使用 分割,如下对于剩下的空行和body空行是作为请求头的结束标记而body我们之前也讲过了是我们自定义要传输的信息并且post中存在get并不存在body一般是这样规定的哈哈实际上语法并没有规定

更多文章