【HTTP】

news2024/11/20 7:04:42

目录

🎨1. HTTP 请求

🏰1.1 首行

👑1.2 URL 

🚩1.3 Content-Type 和 Content-Length

🍊1.4 User-Agent

🌽1.5 Referer 

⚽1.6 Cookie

🍩2. HTTP 响应

🌞2.1 HTTP 响应 首行 

🍘3. 如何构造 HTTP 请求?


HTTP,Hyper Text Transfer Protocol ,即超文本传输协议,是一种应用广泛的应用层协议。

我们平时打开一个网站, 就是通过 HTTP 协议来传输数据的。

当我们在浏览器中输入一个百度搜索的 "网址" (URL) 时,浏览器就给百度的服务器发送了一个 HTTP 请求,百度的服务器返回了一个 HTTP 响应。这个响应结果被浏览器解析之后,就展示成我们看到的页面内容。(这个过程中浏览器可能会给服务器发送多个 HTTP 请求,服务器会对应返回多个响应,这些响应里就包含了页面 HTML,CSS,JavaScript,图片,字体等信息)。
 

1. HTTP 请求

 一个 HTTP GET 请求包含以下四个部分:

header 内容为键值对结构,每个键值对占一行,键和值之间,使用 冒号+空格 来分割。键值对有 N 行,最后用空行作为结束的标记,空行类似于链表中的 null。

POST 请求:

所有的 HTTP 请求中,GET 请求占了绝大部分,其次是 POST,剩余的为其余方法。

POST 请求,body 一般不为空,而 GET 请求,body一般为空。

POST 和 GET 同为请求,那有什么区别吗?

GET 和 POST 表示不同的语义,HTTP 方法的语义,只是一种建议,程序猿实际使用的时候,不一定非要遵守。对于 body 有没有的问题,也不是上述说的那么绝对。GET 也可能有 body,但非常少见,而 POST 也可以没有 body,也只是比较少见。

那两者之间,到底有什么区别呢?没有本质区别!使用 GET 的场景,替换成 POST 也可以。而使用 POST 的场景,替换成 GET 也行。

但两者在使用习惯上存在区别:

1. GET 习惯上用来表示 “获取一个数据”,POST 用来表示 “提交一个数据”。

2. GET 一般没有 body,需要携带数据,则放到 URL 中。POST 一般有 body。

3. GET 请求通常会设计成幂等,而 POST 则无要求。

在编程中,幂等的理解就是,在数据不变的情况下,一个操作,无论执行多少次,结果都是一样的。幂等在服务器开发中非常关键,设计成幂等之后,请求就可以缓存,后续重复请求可以直接使用,提高了响应速度,节省运算资源。

4. GET 是可缓存的,POST 则不能

5. GET 请求可以被浏览器收藏,而 POST 不能。

1.1 首行

打开必应搜索,fildder 抓包之后的首行:

版本号有:

HTTP/1.0

HTTP/1.1

HTTP/2

HTTP/3

HTTP/1.1 是最主流的版本,绝大部分互联网的网站都是用的 1.1。

一般看到的请求大部分是 GET,但在登录时,或是上传文件时,可以看到 POST。

1.2 URL 

URL :唯一资源定位符,描述了网络上唯一的一个资源。这个概念并非专属于 HTTP,很多协议都会用到 URL。

URL 的结构大概是这几个部分:

 

 也可以举一个形象一点的例子:

在 URL 中,已经写了当前要访问的服务器是谁,为什么在 Host 中,还要再写一遍呢?

大多数情况下,Host 中的值和 URL 中的域名是一致的。但如果,当前我们访问的服务器,不是直接访问,而是通过 ”代理“ 来访问的,那么 Host 和 URL 就可能不一样。

1.3 Content-Type 和 Content-Length

Content-Type 描述了 body 的数据格式,Content-Length 描述了 body 的长度(字节)。这两个属性只有那些有 body 的请求才有。如果一个没有 body 的 GET 请求,它的 header 中就没有这两个属性。

application/json ,表示数据的格式,描述了数据是按照 json 格式来组织的。 json 格式,用

{ } 来表示,里面包含若干键值对,键和值之间,用:分割,而键值对间用,分割。

charset = utf-8,表示数据的字符集。

Content-Type 还有其他写法:Content-type: application/x-www-form-urlencoded。

Content-Type 作为请求时,最多只有上述两种写法。

而作为响应,Content-Type 还有以下几种写法:

text/html

text/css

application/javascript

application/json

image/jpg

image/png

......

 有了这两个属性之后,浏览器/http 服务器,才能够认识到当前的 body,并正确的进行解析。

1.4 User-Agent

User-Agent,简称 UA。这一属性用来描述用户使用的浏览器版本以及操作系统的版本。

早期浏览器种类繁多,功能参差不齐,于是人们便发明了 User-Agent,这样就可以在请求中,告诉网站服务器,当前的上网设备是什么,这样一来,服务器就可以根据客户端的种类,返回相应的页面了。但随着时间的推移,浏览器发展到如今,相互间的差别越来越小,UA 也没必要区分浏览器类型。现在 UA 的一个重要用途,就是区分用户是手机/PC/平板。

1.5 Referer 

Referer,描述了当前这个页面,是从哪个网页跳转过来的。如果直接在地址栏输入 url,此时请求中没有 referer。从收藏夹中点开某个链接,请求里也是没有 referer 的。

1.6 Cookie

Cookie 也是键值结构,键和值之间使用 = 分割,而键值对之间只用;分割。键值对具体意思,只有这个网站的开发者知道,这里的键值对是程序员自定义的数据,不同网站有不同的键值对,也就有了不同的含义。

Cookie 从服务器中来——当浏览器访问服务器时,服务器会在 HTTP 响应中,通过 Set-Cookie 字段,把 Cookie 的键值对返回给浏览器,浏览器接收这个数据,会在本地存储。

Cookie 再到服务器中去——浏览器在下一次请求时,把 cookie 带回给服务器。cookie 是由服务器来使用的。cookie 在浏览器这边,只能算 ”暂存“。

Cookie 是浏览器本地存储数据的机制,最典型的应用,就是存储用户的身份信息。

Cookie 的作用跟我们去医院看病使用的就诊卡很相似。第一次去医院看病,医院会让你办理就诊卡。办理就诊卡需要你的身份证、电话等信息。不管看什么科,医生见你的第一句话就是,刷一下就诊卡。那是因为,在就诊卡中有一个简单的芯片,存储了一个身份标识。在医院的机子一刷,电脑就会出现你的身份信息,包含姓名,身份证,年龄,性别,以及以往病例,当前开出的诊断,当前开出的药等。身份信息存储在医院的信息系统中。就诊卡就相当于 Cookie!!

2. HTTP 响应

响应可能是经过压缩的,本身是 http 文件,压缩成了二进制,能减少网络传输的数据量,节省带宽。把数据压缩,本质上是用 cpu 资源,换带宽资源。

响应中的 body ,不仅包含 html,还包括 css、js、图片、字体等,那些浏览器上显示出来的内容,都是服务器返回的响应,携带的数据交给浏览器。

2.1 HTTP 响应 首行 

HTTP 响应首行中,包含版本号以及状态码。

状态码就是数字,用来表示这次请求执行成功还是失败以及失败的原因。HTTP 中提供了很多状态码:

类别原因短语
1XXInformational (信息性状态码)接收的请求正在处理
2XXSuccess (成功状态码)请求正常处理完毕
3XXFedirection (重定向状态码)需要进行附加操作以完成请求
4XXClient Error (客户端错误状态码)服务器无法处理请求
5XXServer Error (服务器错误状态码)服务器处理请求出错

 上述请求和响应的格式,可用下图表示:

3. 如何构造 HTTP 请求?

我们可以通过什么方式来构造一个 HTTP 请求?

1. 直接通过浏览器地址栏,输入一个 url,来构造出一个 GET 请求

2. html 中,一些特殊标签,也会触发 GET 请求,如

1) link

2) script

3) img

4) a

3. form 表单,可以触发 GET 和 POST 请求。

前两种,我们比较熟悉了,下面介绍第三种:

<form action="https://www.sogou.com/abc" method="get">
        <input type="text" name="aaa">
        <input type="text" name="bbb">
        <input type="submit" value="提交">
</form>

 

<form action="https://www.sogou.com/abc" method="post">
        <input type="text" name="aaa">
        <input type="text" name="bbb">
        <input type="submit" value="提交">
</form>

4. Ajax

Asynchronous JavaScript and XML ,缩写 Ajax,即异步的 JavaScript 和 XML 。

异步可能大家不熟悉,可是同步 (synchronized) 呢?在线程那篇文章中介绍的锁概念,它的英语单词也是 synchronized 。在计算机中,一个术语,在不同的场景下会有多种含义。synchronized 在加锁场景下,意味着多线程环境下,同一个资源,被一个线程访问时,其他也想访问的线程只能阻塞等待。只有等到这个线程解锁之后,其他线程才能抢占式访问。它的反义词是,互斥。而在 IO 场景下,synchronized 意味着请求的发起者,自行获取响应。而 Asynchronous 意味着请求的发起者不关心结果,而是由被请求者计算出结果之后,把结果推送给发起者。

XML 位于网络应用层的一种自定义的数据格式,同 html 一样,都是由标签构成的。 区别就在于,html 支持哪些标签,且这些标签具体啥含义,都是标准委员会规定的;而 xml 的标签都是自定义的。

ajax 是前端和后端异步交互的一种方式。推荐使用 jQuery 里面提供的 ajax api。

 

前端引入第三方库十分方便,可以直接写网络地址。

<script>
        jQuery.ajax({
            // ajax 可以有以下属性:
            // url 当前请求要发给谁
            url:"https://www.baidu.com/",
            type:"get",
            // 请求成功的话,使用回调函数来处理响应
            success:function(body){
                // 写处理响应的代码
            }
        });
</script>

success 后面是回调函数,会在服务器返回一个正确的响应时,被浏览器自动执行。这个执行过程就是 “异步” 的。

在上述 js 代码中,把请求发出去之后就不管了,继续执行后续代码,直到响应回来了,浏览器会调用上述的 success 回调函数,执行处理响应的逻辑。

<script>
        jQuery.ajax({
            // ajax 可以有以下属性:
            // url 当前请求要发给谁
            url:"https://www.baidu.com/",
            type:"post",
            data:"这是body",
            contentType:"text/plain",
            // 请求成功的话,使用回调函数来处理响应
            success:function(body){
                // 写处理响应的代码
                console.log(body);
            }
        });
</script>

这是 ajax 的一个非常典型的问题,跨域问题。举例子:现在运行 ajax 的代码的页面域名为 abc.com,但是 ajax 里的请求,访问的域名是 def.com。两个域名不一样的话,哪怕服务器响应了数据,浏览器还是不能处理,还是要报错。这不是 bug,而是浏览器为了限制安全问题引入的保护机制,防止 a 网站的页面请求 b 网站的数据。 

上述构造请求,都是要写代码的,但我们也可以用一些现成的工具,直接构造出 HTTP 请求,比如 postman。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/568800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件工程学习1:软件项目项目管理

假设你被指派作为一个软件公司的项目负责人&#xff0c;任务是开发一个管理系统&#xff0c;人员规模大约为8人&#xff0c;人员角色应如何确定&#xff1f;应如何进行项目管理&#xff1f;&#xff08;从软件项目管理估算、软件规模、工作量估算、进度计划安排、软件过程模型等…

入行4年,跳槽2次,我好像摸透了软件测试这一行!

很多测试人在行业中摸爬滚打了很多年&#xff0c;时不时给身边新入职的伙伴们一些好的建议&#xff0c;对一部分刚入职起步的测试小白来说&#xff0c;这些建议都是让你少走弯路的捷径&#xff0c;废话不多说&#xff0c;让我们来了解一下&#xff0c;一位入行4年跳槽2次的老测…

JSONException: illegal identifier : \pos 1 异常报错问题

JSONException: illegal identifier : \pos 1 异常报错问题 1.常见情况&#xff1a;1.1 JSON 字符串格式不正确1.2 JSON 字符串中包含了非法字符1.3 解析 JSON 字符串的方式不正确 2.解决办法&#xff1a;2.1 工具类2.2 StringEscapeUtils.unescapeJava3. JSONObject.parseObje…

黑客入门教程从零基础入门到精通,看完这一篇就够了

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解决…

Revit建模|怎么创建轴网标高?

大家好&#xff0c;这里是建模助手&#xff0c;今天给大家讲一讲怎么创建轴网标高。 标高用来定义楼层层高以及生成平面视图&#xff0c;轴网用于为构件定位&#xff0c;在Revit中轴网确定了一个不可见的工作平面&#xff0c;轴网编号以及标高符号样式均可定制修改。目前&…

每日练题---C语言

目录 前言&#xff1a; 一.求最小公倍数 1.1公式法 1.2遍历法 1.3乘除法 二.倒置字符串 前言&#xff1a; 今日份题目有&#xff1a;求两个整数的最小公倍数&#xff0c;求倒置字符串&#xff0c;。 一.求最小公倍数 牛客网链接&#xff1a;OJ链接 百度词条&#xff1a;…

Python自动化测试框架怎么搭建?完整框架源码给到你

目录 前言 搭建过程&#xff1a; 一阶段&#xff0c; 二阶段&#xff0c; 三阶段&#xff0c; 四阶段 下面具体的说一下搭建过程 一阶段&#xff1a; 二阶段&#xff1a; 三阶段&#xff1a; 四阶段 前言 背景&#xff1a;公司需要每一个项目组都搭建自己的一套自动…

Vue企业级项目开发思路,附带源码

项目的技术栈展示 以及项目的核心重点部分 项目搭建使用element实现首页布局 顶部导航菜单及与左侧导航联动的面包屑实现 封装一个ECharts组件 封装一个Form表单组件和Table表格组件 企业开发之权限管理思路讲解 项目搭建使用element实现首页布局 顶部导航菜单及与左侧导…

技术分享 | OB 慢查询排查思路

本文汇总了项目实践中前辈的经验和笔者的理解&#xff0c;旨在帮助初学 OceanBase&#xff08;以下简称 OB&#xff09;的工程师&#xff0c;快速解决 SQL 执行缓慢等性能问题。当遇到性能问题时&#xff0c;很多工程师可能会感到无从下手&#xff0c;本文将根据关键日志提供多…

14_Uboot图形化配置

目录 U-Boot图形化配置体验 make menuconfig过程分析 Kconfig语法简介 Mainmenu menu/endmenu条目 config条目 depends on和select choice/endchoice Menuconfig Comment Source 添加自定义菜单 U-Boot图形化配置体验 uboot或Linux内核可以通过输入"make menu…

计算机组成原理-存储系统-外部存储虚拟存储器

目录 一、外部存储 1.1磁盘组成 1.2性能指标 1.3磁盘地址 1.4硬盘的工作原理 1.5磁盘阵列 二、 固态硬盘SSD 三、虚拟存储器(存储系统详细知识点) 3.1 页式存储器 逻辑地址-》主存(物理)地址 加入块表(TLB)的转换过程 3.2 段式存储器 3.3 段页式存储器 一、外部存储 又称…

一个非系统工程师所关心的——Android开机流程

一、Loader层 1. Boot ROM: 上电后&#xff0c;BootRom会被激活&#xff0c;引导芯片代码开始从预定义的地方&#xff08;固化在ROM&#xff09;开始执行&#xff0c;然后加载引导程序到RAM。 2. Boot Loader引导程序 Android是基于Linux系统的&#xff0c;它没有BIO…

路由器端口映射-原理+图解

文章目录 1. 前言2. 内部服务器3. 内网IP3.1 含义3.2 查询内网IP方法3.3 直观法判断内网IP 4. 内部端口5. 外部端口6. 远程桌面连接7. 端口映射原理图8. 欢迎纠正~ 1. 前言 端口映射就是可将N台主机的内网IP地址映射成一个公网IP地址&#xff0c;从而让外网可以访问到局域网内…

Linux 学习笔记(九):基于 TSS 的进程切换

一、TSS 基本概念 1、什么是 TSS &#xff1f; TSS&#xff08;Task State Segment&#xff09;即任务状态段。具体的说&#xff0c;在设计 “Intel 架构”&#xff08;即 x86 系统结构&#xff09;时&#xff0c;每个任务&#xff08;进程or线程&#xff09;都对应有一个独立…

Java经典笔试题—day13

Java经典笔试题—day13 &#x1f50e;选择题&#x1f50e;编程题&#x1f36d;参数解析&#x1f36d;跳石板 &#x1f50e;结尾 &#x1f50e;选择题 (1)一个关系数据库文件中的各条记录 &#xff08;&#xff09; A. 前后顺序不能任意颠倒&#xff0c;一定要按照输入的顺序排…

测试4-数据库设计

测试4-数据库设计 目录 测试4-数据库设计选择题简答题1. 画E-R图并将其转换为适当的关系模型题目E-R图关系模型 2. 画E-R图并将其转换为关系模型题目E-R图关系模型 选择题 下列关于数据库运行和维护的叙述中&#xff0c;正确的是D。 A &#xff0e;只要数据库正式投入运行&…

网狐大联盟服务端源码分析之服务核心-ServiceCore-Base64编解码实现

工程属性分析: 1.工程属性->动态链接库 2.dll类型->MFC共享DLL 3.字符集->Unicode 4.库导出类型->使用模块定义文件def 5.生成的导出模块函数与对应的地址定义lib文件 源码分析: 头文件分析: 头文件与对应含义表示如下:

shell变量类型含义 长方形面积计算 截取相应字段方法

1.总结变量的类型及含义&#xff1f; 2.实现课堂案例计算长方形面积&#xff1f;&#xff08;6种方式&#xff09; 3.定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/103568815&#xff08;通过多种方法实现&#xff09; 1&#xff09;截取网站访问的协议 …

spring之spring入门程序

1.创建Maven Module 2.pom.xml引入依赖 此图引用于https://www.cnblogs.com/Zz-maker/p/11199331.html Maven种的依赖的传递性&#xff0c;spring-context依赖于core,beans,aop,expression等模块&#xff0c;但是在pom.xml中只引用spring-context即可&#xff1a; <?xml v…

WhatsApp与电子商务,最佳拍档

您可以通过将 WhatsApp 整合到您的电子商务业务策略中。首先&#xff0c;您可以从将WhatsApp集成到您的客服渠道&#xff0c;与您的其他客户沟通渠道形成交互&#xff0c;并统一进行客户管理与回复&#xff0c;您需要一个工具做到——SaleSmartly&#xff08;ss客服&#xff09…