网络编程 - HTTP协议

目录

HTTP协议格式

 一,请求格式

1.1 URL的基本格式

1.2 方法(method)

1.3 请求头header 

 二,响应格式

2.1 状态码


HTTP协议格式

HTTP协议与之前讲的TCP/IP协议不同,HTTP协议要分为两个部分——请求和响应,也就是一种"一问一答" 结构模型的协议。

如何查看HTTP协议请求和响应的协议?在这里使用的是一款叫Fiddler的抓包工具。

 一,请求格式

1. 首行

请求的第一行,由三个部分组成,使用空格分开:

1)GET,HTTP请求的"方法"(method)

2)URL,唯一资源定位符,描述一个资源在网络上的位置,具体由什么构成下面再说。

3)版本号, HTTP/1.1

2.请求头(header)

是一个键值对结构的数据(可以有多组),每一个键值对都占一行,键和值之间使用:空格 来区分

3.空行

请求头header的结束标记

4.正文(body)

有的HTTP请求有,有的没有,上面的图就没有

1.1 URL的基本格式

url在计算机中十分重要,它不仅仅在HTTP中涉及,在Java中的jdbc设置数据源setUrl也使用过。URL是用来描述一个资源在网络上的所处位置。

  • 协议方案名:不必多说,类似的还有https://
  • 登录信息:现在几乎不会使用了
  • 服务器地址:可以是IP地址,也可以是域名
  • 服务器端口号:通过IP地址可以找到是哪台主机,但是一台主机可能有多个服务器程序,使用端口号来区分是哪个程序。这里的端口号可能会省略,例如:对于http请求,如果省略,就默认访问80端口;对于https请求,如果省略,就默认访问443端口。
  • 文件路径:描述你要访问服务器的哪个资源,这个看上去有点像目录结构,但实际上,服务器不一定是以目录形式来存储数据。
  • 查询字符串(query string) :一种键值对结构的数据,是以?开头,可以有多个键值对,键值对之间使用&来分割,键和值使用=来分割。(注意:这里的键值对是有程序员自己定义的,不像header中的键值对是有标准规定的)
  • 片段标识符:可以通过这个来实现页面的跳转,有点类似于看小说时,点章节名,就能跳转到那个章节。

注意:对于query string 来说,如果 value 部分要包含一些特殊符号的话,往往需要进行 urlencode操作,有点类似于转义字符。比如:+ ?:/ 等这些符号在url中有特殊用途,如果在value中使用,可能会使浏览器对于url的识别出现问题。所以要对这些符号进行"转义",+就要写成%2B。另外所有的中文都要转义。

1.2 方法(method)

方法说明
GET获取资源
POST传输实体主体

PUT

传输文件
HEAD获得报文首部
DELETE删除文件
OPTIONS询问支持的方法
TRACE追踪路径
CONNECT要求用隧道协议连接代理
LINK建立和资源之间的联系
UBLIKE断开连接的关系

这里最常用的方法只有两个—— GET和 POST,所以主要介绍这两种方法的区别:

  1. 这两种方法没有本质上的区别,但在使用习惯上,还是存在一些差异:GET经常把传递到服务器的数据放到 query string 中;POST 则是经常将数据放到 body 中。(注意:GET也可以使用body中,POST也可以使用 query string,但是使用的前提是服务器/客户端都是按照一样的方式处理,不能一边使用query string,另一边使用 body)
  2. 语义上的差异:GET大部分是用来获取数据;POST大部分是用来提交数据(比如:登录和上传操作)

这里还有一些错误说法需要区分:

  1. GET请求能传递的数据是有上限的,POST请求能传递的数据是无上限的。✖             该说法是一个"历史遗留"问题,因为早期的浏览器硬件资源匮乏,针对GET请求的URL长度做出了限制,而实际上RFC文档没有明确规定URL的长度,就目前来说,URL的长度也可以非常长。
  2. GET请求传递的数据不安全,POST请求传递的数据更安全。✖                                   错误的依据 :使用GET实现登录,点击登录会使用户名和密码放到url中,进一步显示到浏览器地址栏里,就会被人看到;而POST则是在body中,不会在界面上显示出来,所以更安全。                                                                                                                    但是实际上那些黑客也能通过抓包工具获取到body,通常来说,“安全”是指你传递的数据不容易被黑客获取,或者获取到之后不容易被破解。因为我们的密码会进行加密,所以即使黑客拿到也不容易破解。所以此处的安全与POST无关,关键在于加密。
  3. GET只能传递文本数据,POST可以传递文本和二进制数据。✖                                      1)GET也可以使用body,body中是可以放二进制                                                          2)GET也可以通过base64转码将二进制数据转换成文本数据,放到query string中
  4. GET是幂等的,POST不是幂等的。(不完全正确)                                                        幂等是指输入相同的值,输出的值都是一样的。而GET和POST是否幂等,这取决于它们的代码是如何实现的。只不过RFC文档建议GET幂等。
  5. GET可以缓存,POST不可以缓存。(不完全正确)                                                        这也取决于是否幂等,如果幂等则可以缓存

1.3 请求头header 

这里的键值对有很多,这里挑一些重要的讲一下:

1.)host:表示服务器主机地址和端口

2)Content-Length:body中的数据长度

3)Content-Type:body中的数据格式

body中的格式有很多种:

请求中:1. json 2. form表单格式 3. form-data格式...

响应中:1. html 2. css 3. js 4. json 5. 图片....

4)User-Agent:描述你使用什么设备上网

5)Referer:描述当前页面是从哪个页面跳转过来的

6)Cookie

浏览器在本地存储数据的一种机制,浏览器中的数据来自服务器,但是在程序运行过程中也是有一些数据需要在浏览器这边存储,并在下次访问时再发给服务器,比如说,上次访问时间,用户身份信息,累计访问次数....这些临时数据都存储在浏览器。

但是为什么不把这些数据存储在本地文件中呢?这是因为浏览器考虑到安全性,禁止网页直接访问你电脑中的文件系统,造成你自身用户数据的泄露。为了保证安全性,又能进行数据存储,所以引入了Cookie(实际上也是按照硬盘文件的方式存储,但是浏览器把操作文件给封装了,网页只能往Cookie中存储键值对,也就是字符串)。

Cookie往往是从服务器返回的数据(也可以是网页自己生成的)

Cookie存储到浏览器所在的主机的硬盘上,并且按照域名来存储(每一个域名多可以存自己当Cookie,彼此之间互不影响)

Cookie是按照键值对的形式来组织的,这里的键值对也是程序员自定义的,后续再请求这个服务器的时候,就会把 Cookie中内容自动昂带入到请求中,发给服务器,服务器通过 Cookie的内容做一些逻辑上的处理。

 二,响应格式

 1. 首行

1)版本号 HTTP/1.1

2)状态码(200)描述请求的结果

3)状态码描述(OK)

2.响应头(header)

也是一个键值对结构的数据(可以有多组),每一个键值对都占一行,键和值之间使用:空格 来区分。

3.空行

4.正文(body)

正文内容可能很长,也有很多种格式,比如:HTML,CSS,JS,JSON,XML,图片,字体....,响应也可以没有正文,看情况。

2.1 状态码

 这里重点讲一些常见的状态码:

  • 2XX:表示成功,200最常见
  • 3XX:表示重定向,比如:一个网站更换了网址,就可以给旧网址挂一个重定向响应,访问旧网址时就会自动跳转到新网站。 301表示永久重定向;302表示临时重定向。
  • 4XX:表示请求报错。404表示访问的资源在服务器上不存在;403表示访问的资源没有权限。
  • 5XX:表示服务器出错了。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尚硅谷Docker基础篇和Dockerfile超详细整合笔记

Docker基础篇DockerFile Docker:您要如何确保应用能够在这些环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?而这个就是使用容器。Docker解决了运行环境和配置问题…

linux 创建git项目并提交到gitee(保姆式教程)

01、git安装与初始化设置 mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ apt install mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ git config --global user.name "用户名" mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ git config --global user.ema…

Java 8 新特性 Stream 的使用场景(不定期更新)

方便在写代码的过程中直接使用,好记性不如好文章,直接 CV 改了直接用。提高 办(摸)公(鱼)效(时)率(间), 不然就直接问 GPT 也不是说不行。 只符合…

操作系统学习与思考

x86体系架构 x86是因特尔8086代芯片的CPU总线位数以及寄存器种类的规范,大部分操作系统都是以该规范作为基准来生产的 计算机组成 CPU,可以根据程序计数器进行取指令操作,并根据指令执行运算(加、减、乘、除)。运算所…

【hcie-cloud】【1】华为云Stack解决方案介绍、华为文档获取方式 【上】

文章目录 华为文档获取方式前言云计算发展背景国家政策、社会发展驱动数字经济开启新时代深化数字化转型提升效率,国家数字主权云进入落地阶段从Cloud-Based到Cloud-Native,两种模式长期并存适合政企智能升级的云华为云Stack,政企智能升级首选…

MySQL InnoDB数据存储结构

1. 数据库的存储结构:页 索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的存储引擎负责对表中数据的读…

如何远程访问WAMP搭建的内网Web站点?

花生壳是由贝锐自主研发的域名解析工具,可帮助用户实现外网访问到局域网内搭建的各类办公系统。以发布网站服务为例,下面就给大家演示下如何通过花生壳实现外网访问WAMP站点。 1. 搭建WAMP站点 (1)首先,用户需在本地…

Photoshop图片处理

工具 Photoshop剪映 步骤 打开photoshop 工具主界面 2. 导入素材图片 或者直接将图片拖入主界面 3. 双击图层,将背景图改为可编辑图层 4. 使用多边形套索工具勾画需要搽除的区域 5. 希望删除的区域使用多边形套索工具勾画出来后, 按“del”键&a…

关于编程不得不说的事

这些年,互联网爆炸式的发展,促生了无数程序员,也促生了大量 IT培训机构。短短数年间,科班出生的程序员和培训机构出生的程序员呈指数增长。程序员的职业也不再是金饭碗。写了这么多代码,有些感触,所以写下来…

搭建WAMP网站教程(windows+apache+mysql+php)

之前为了学习网络安全,从搭建网站学起,对网站运行有个初步的了解。 今天翻到了之前的笔记,顺手发到csdn上了。 搭建网站步骤 一、Apache 安装Apache,下载Apache之后把Apache解压,此处解压到C:\目录下 2.然后要记得安…

【Java 进阶篇】Java Cookie共享:让数据穿越不同应用的时空隧道

在Web开发中,Cookie是一种常见的会话管理技术,用于存储和传递用户相关的信息。通常,每个Web应用都会在用户的浏览器中设置自己的Cookie,以便在用户与应用之间保持状态。然而,有时我们需要在不同的应用之间共享Cookie数…

Docker DeskTop安装与启动(Windows版本)

一、官网下载Docker安装包 Docker官网如下: Docker官网不同操作系统下载页面https://docs.docker.com/desktop/install/windows-install/ 二、安装Docker DeskTop 2.1 双击 Docker Installer.exe 以运行安装程序 2.2 安装操作 默认勾选,具体操作如下…

【安全】Java幂等性校验解决重复点击(6种实现方式)

目录 一、简介1.1 什么是幂等?1.2 为什么需要幂等性?1.3 接口超时,应该如何处理?1.4 幂等性对系统的影响 二、Restful API 接口的幂等性三、实现方式3.1 数据库层面,主键/唯一索引冲突3.2 数据库层面,乐观锁…

TensorFlow案例学习:使用 YAMNet 进行迁移学习,对音频进行识别

前言 上一篇文章 TensorFlow案例学习:简单的音频识别 我们简单学习了音频识别。这次我们继续学习如何使用成熟的语音分类模型来进行迁移学习 官方教程: 使用 YAMNet 进行迁移学习,用于环境声音分类 模型下载地址(需要科学上网&…

Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)

目录 前言初始化数据库Docker 部署 xxl-job下载镜像创建容器并运行访问调度中心 SpringBoot 整合 xxl-jobpom.xmlapplication.ymlXxlJobConfig.java执行器注册查看 定时任务测试添加测试任务配置定时任务测试结果 结语附录xxl-job 官方文档xxl-job 源码测试项目源码 前言 xxl-…

在ffmpeg中,如何把h264转换为rgb格式

在ffmpeg中,网络视频流h264为什么默认的转为YUV而不是其他格式 文章中介绍了,h264解码的时候是直接解码为yuv的,如果在使用的过程中 需要用到rgb的格式,我们该如何来转换这种格式呢? 在上面的文章中,我们已…

【10套模拟】【1】

关键字: 快排空间复杂度、算法目标、广义表与树、后缀表达式、AOV网、完全图、子表

四、数据库系统

数据库系统(Database System),是由数据库及其管理软件组成的系统。数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统,也是一个为实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介…