• http协议


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    提示:这里可以添加本文要记录的大概内容:


    提示:以下是本篇文章正文内容,下面案例可供参考

    一.http协议的工作过程

    应用层协议有很多自定义的协议,也有很多现成的典型的是http协议

    例如:登录bing网站

    当我们在浏览器中输入一个 "网址", 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收
    到这个请求之后, 经过计算处理, 就会返回一个 HTTP 响应
     

     http协议属于典型的一问一答模型的协议

    主要学习报文格式:描述http请求是啥,响应是啥

    抓包工具的使用

    使用抓包工具:捕获请求交互的详细情况

    抓包工具相当于一个代理程序,浏览器给服务器发的请求经过这个代理程序,进一步分析出请求和响应的结果如何

    什么是代理,举个例子:

     代理分类:

    正向代理:和客户端关系紧密

    反向代理:和服务器关系紧密

    http协议是文本格式的协议

    我们通过借助抓包工具,分析http协议格式

    fiddler(代理工具)

    使用fiddler抓包工具分析http协议工作过程:

    1.如何下载

    下载地址

    https://www.telerik.com/fiddler/

    代理工具:fiddeer,使用经典版即可

    点击下载:

     

    打开进入后,左侧区域是抓到的请求列表,咱们电脑上,每时每刻都有应用程序,通过http传输数据,都能被fiddler抓到

    双击点击某个你想关注的请求详情,就会在右侧窗口显示出请求的具体情况

    抓包结果

    左上角点击raw最原始的请求

     

    点击右下角raw得到响应的原始样子

     由于响应数据体积较大,服务器通常会返回一个压缩后的结果,点击黄色指式条可以解压缩

    注意事项:

    1.需要开启fiddler抓取https功能,https可以理解成升级版本的http,在http基础上加了个加密层

          菜单栏tools options 全勾

     提示框点击允许安装

    2.如果开启了上述https,也安装了根证书,还是抓不到,检查电脑上是否安装了其他的代理程序/代理作用浏览器插件

    完整的http请求的格式

    构造一个http请求,本质上就是往一个tcp socket中, 按照下列格式来写入数据即可

    http是一个文本格式的协议

    以搜狗为例

    1.首行:

    get        https://www.sogou.com/     http/1.1

     包括 :  a.方法    b. url(描述了网络上唯一资源) c.版本号

    2.请求头header

    按行组织的键值对,键和值之间使用:空格来分割,键都是有固定含义的

    3.空行:

    一个http请求header可以有若干个,空行是请求结束的标记,类似链表的bull

    4.正文body

    有的请求有,有的没

    可能是json格式的,也可能是其他格式的

    以登录为例:

      完整的http响应的格式:

    1.首行

    版本号+状态码(一般使用200表示成功)+(ok状态码的描述,对状态码的解释说明)

    2.响应报头 header

    同样也是键值对结构

    3.空行

    作为header结束标记

    4.正文

    http协议的细节

    url:唯一资源定位符,用这个来找到网络上的资源(比如某个文件)

    uri:唯一资源标识符,这个来区分一个网络上的资源)

    url基本格式

    1.协议名:url并非是http独有的,很多协议都有,所以前面加上:

    2.登录信息:这种用法基本没了

    3.服务器地址:服务器地址. 此处是一个 "域名", 域名会通过 DNS 系统解析成一个具体的 IP 地址

    4.服务器端口号:基础开发中常用:标识了要访问目标服务器的哪个进程

    通过3,4就能确定互联网上哪个主机的哪个进程

    5.带层次的文件路径,服务器进程可能会提出很多资源,这些文件可能会放在一个目录中,在url写的路径不一定真的对应到服务器上某个硬盘目录,服务器提供的资源可能是真实存在的也可能是虚拟出来的(直接访问硬盘数据))【开发中常用】

    真实存在:访问静态资源

     虚拟出来:访问动态资源

    例如:可以直接在内存中构造出一个html,(程序员实现的)返回到浏览器这边

    6.查询字符串,

    query string 中的内容本质是键值对结构. 其中的 key 和 value 的取值和个数, 完全都是程序猿自己约定的. 我们可以通过这样的方式来自定制传输我们需要的信息给服务器.
     

    注意url里的键值对完全是自定义的,程序源决定,header是标准库的

    如果特殊符号比如:/?@...也包含在query 里的value,和url的符号产生歧义,浏览器可能会错误的识别,服务器错误的解析,就需要url encode来进行转义(特殊符号,汉字中文),例如,输入c++经过转义会变成

     把原始的字符,转成转义后的字符--》url encode(编码)

    把转义后的字符还原成原始的字符--》url encode(解码)

    作为程序源必须要有这个意识

    必须放一个urlencode之后的地址才可以 ,如果不加有些浏览器可能无法正常跳转

    因此,查询字符串,是前后端交互数据的重要桥梁

    7.片段标识符:

    用来区分一个网页中的哪个部分,常见于小说网站或文档网站,借助片段标识符,快速跳转到网页的某个部分

    二.认识方法

    http中非常重要的部分

    把方法理解成你这个请求想干啥

    get 最常用的http请求方法

    GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源.

    触发方式:

    1.在浏览器地址栏直接输入url此时就会触发get

    2.在html里面link,a,img,script标签也会触发get请求

    href/src都会引用一个外部的资源,本质上就是浏览器就会重新发一个浏览器get请求,来从服务器拿出对应的数据

     3.form表单触发get

    4.ajax(后面讲)触发get请求

    一个浏览器加载出一个页面,往往经过多重http请求的交互(自身和外部资源)

    网页缓存:

    GET 请求的特点

    • 首行的第一部分为 GET
    • URL 的 query string 可以为空, 也可以不为空.
    • header 部分有若干个键值对结构.
    • body 部分为空
       

    post方法

    多用于提交用户输入的数据给服务器(例如登陆页面)

    1.form 来post

    2.ajax 来post

    post没有get用的多但是也是有的,产生post途径

    特点:

    • 方法叫做Post
    • url通常是没有query string的
    • 也是有若干header,键值对形式
    • body通常有的,数据格式很多种
    • post在传递信息给服务器时候,通常会把信息放到body中

    熟悉以上方法俩中足够应对90%以上场景

    经典面试题:谈谈get和Post区别

    1.先盖棺定论:

    get和post没有本质区别(使用get实现的常警,基本都可以使用post代替,post也能用get代替)

    2.再来谈细节上的区别

    a.get的语义:是从服务器上获取某个数据

    post的语义,是往服务器上提交个数据

    http协议设计的初心,但是在实践中,很多程序员没有遵守,这里是建议设计的时候,采用这样的语义。

    b.使用习惯上,给服务器传递的数据,get通常是放在url 的query string中,post通常放在body中

    get能否把数据放在body里,也是可以的(很少见,浏览器不一定能支持,其他的http客户端可以支持)

    post能否把数据放在query string里,完全可以的(也少见,浏览器啥的都是支持的)

    c.get请求建议实现成幂等的,post一般不要求实现成幂等

    幂等:输入是确定的输出结果也是确定的

    设计服务器的时候,就需要提供一些接口api,传入的参数视为输入,返回的结果是输出,

    基于get的api建议设计成幂等,基于post api则无要求

    4)在幂等的基础上,get的请求结果是可以被缓存的,post则一般不会缓存

     这些缓存是 浏览器默认的行为(如果当前get确实是幂等的,就不必处理,就让浏览器缓存,没问题,如果不是幂等,需要通过特殊技巧避免浏览器产生缓存(典型的技巧就是让每次get请求的url不同(不一样的querystirng)))

  • 相关阅读:
    贪心算法 Greedy Algroithm
    华云数据蝉联中国大数据50强 入选《2022数字化转型生态建设百佳案例》
    山东省如何准备申报“专精特新”?
    TiDB整体架构详解TiDB核心特性
    自动跳过APP启动页广告
    10:00面试,10:06就出来了,问的问题有点变态。。。
    BetterJoy蓝牙将switch转化为xbox玩游戏,例子:双人成行(俄区版)
    QT的按钮按钮控件
    国产AD+全志T3开发案例,为能源电力行业排忧解难!8/16通道
    JavaIO系列——文件操作类(File)
  • 原文地址:https://blog.csdn.net/panpanaa/article/details/127994532