网络编程 - HTTP协议

news2024/11/29 0:32:34

目录

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.coloradmin.cn/o/1174780.html

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

相关文章

过了面试,后面的在线测评还会刷人吗?

过了面试,后面的在线测评还会刷人吗?完全有可能刷,如果不是为了刷,何必要给你做线上测评,我说的有道理不? 好吧,说到为什么在线测评要刷人,怎么刷? 怎么才能确保不被刷&…

教你快速阅读java简单字节码

我们举例代码 public class Read {public static void main(String[] args) {int a20;int b30;a1;b15;System.out.println((ab)/2);}}我们将他进行运行,我们就会在target 里面出现.class文件,我们需要进入 执行这个代码 javap -c Read.class就会出现…

【ICN综述】信息中心网络隐私安全

ICN基本原理: 信息中心网络也是需要实现在不可信环境下可靠的信息交换和身份认证 信息中心网络采用以数据内容为中心的传输方式代替现有IP 网络中以主机为中心的通信方式,淡化信息数据物理或逻辑位置的重要性,以内容标识为代表实现数据的查找…

基于java+springboot+vue城市轨道交通线路查询系统-公交车线路查询

项目介绍 本系统是针对目前交通管理的实际需求,从实际工作出发,对过去的市轨道交通线路查询系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率…

webgoat-(A1)injection

SQL Injection (intro) SQL 命令主要分为三类: 数据操作语言 (DML)DML 语句可用于请求记录 (SELECT)、添加记录 (INSERT)、删除记录 (DELETE) 和修改现有记录 &#xff…

随机微分方程的分数扩散模型 (score-based diffusion model) 代码示例

随机微分方程的分数扩散模型(Score-Based Generative Modeling through Stochastic Differential Equations) 基于分数的扩散模型,是估计数据分布梯度的方法,可以在不需要对抗训练的基础上,生成与GAN一样高质量的图片。…

【JavaEE初阶】 UDP服务器与客户端的搭建

文章目录 🌳前言🌲DatagramSocket API🎄DatagramPacket API🍀InetSocketAddress API🎍回显客户端与服务器📌建立回显服务器📌回显客户端📌成果展示 🎋翻译小助手服务器与…

NTFS文件系统解析(三)

1、引言 对于NTFS文件系统而言,无论文件内容本身,抑或真实的文件属性,都被称之为属性。 而正如前文说到的,NTFS预定义了16种属性用于文件系统的管理。 而通常情况下,往往只需要关注其中的某些属性即可。 2、属性头 …

用户自定义消息及层次划分

有些人对术语 WM_USER 表示消息范围基的名称有不同的意见,因为 WM_USER 是由窗口类的实现者来定义的。他们抱怨的是,用户不能使用它们,因为它们属于窗口类定义的一部分。 但是,问题是,”这里的用户是谁?”…

【Mybatis小白从0到90%精讲】10:Mybatis动态SQL:foreach、choose标签

文章目录 前言一、foreach 标签二、choose、when、otherwise 标签前言 动态SQL 是 Mybatis的亮点功能之一,如果你经历过 拼接SQL 的繁琐痛苦,那么你就能切身感受到动态SQL到底有多爽!真香哈~ 另外,Mybatis将动态SQL设计的如此自然,让人看看就能理解和接受,我想这也是My…

谁说 Linux 不能玩游戏?

在上个世纪最早推出视频游戏的例子是托马斯戈德史密斯(Thomas T. Goldsmith Jr.)于1947年开发的“「Cathode Ray Tube Amusement Device」”,它已经显着发展,并且已成为人类生活中必不可少的一部分。 通过美国游戏行业的统计数据&…

【iOS】知乎日报前三周总结

这几天一直在进行知乎日报的仿写,仿写过程中积累了许多实用的开发经验,并对MVC有了更深的了解,特撰此篇作以总结 目录 第一周将网络请求封装在一个单例类Manager中SDWebImage库的简单使用运用时间戳处理当前时间自定义NavigationBar 第二周在…

求极限Lim x->0 (x-sinx)*e-²x / (1-x)⅓

题目如下: 解题思路: 这题运用了无穷小替换、洛必达法则、求导法则 具体解题思路如下: 1、首先带入x趋近于0,可以得到(0*1)/0,所以可以把e的-x的平方沈略掉 然后根据无穷小替换,利用t趋近于0时&#xf…

容器核心技术-Namespace

一、容器 基于Linux 内核的 Cgroup, Namespace,以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。 1.1 容器主要特性…

皮肤病辅助诊断软件,基于Android编写

1.系统介绍 编写的皮肤病辅助诊断软件,包括皮肤病识别、皮肤病区域分割、皮肤病信息介绍、识别历史记录查询、简单图像处理操作以及本机信息查询等功能 2.登录界面 运行之后首先显示登录界面 3.注册界面 注册一个账号 4.主界面 输入用户名密码点击登录按钮…

C语言——通讯录管理系统2.0版

对比之前C语言——通讯录管理系统初始版本,2.0版本有以下优化: 1.采用链表实现(之前版本是顺序表实现的,导致通讯录容量有限,现在使用链表实,实现了动态开辟空间,不浪费空间,也不会出…

用于3D Visual Grounding的多模态场景图

文章目录 引言方法1. Language Scene Graph Module Paper:《Free-form Description Guided 3D Visual Graph Network for Object Grounding in Point Cloud》【ICCV’2021】 Code:https://github.com/PNXD/FFL-3DOG 引言 3DVG任务有以下三个挑战&#x…

关于笔记平台的使用感受分享

关于笔记平台的使用感受分享 前言我用过的笔记平台笔记平台简单评价巴拉巴拉WPS文档/OneNote/TowerNotion/语雀各种博客平台 个人使用率最高的平台 前言 最近也有部分同学问我平常用的笔记平台是什么,以及我比较推荐的平台是什么。这里不是广告哈,因为我…

Spring AOP 简介

一、Spring AOP AOP 是一种思想,而 Spring AOP 是一个框架,提供了一种对 AOP 思想的实现。 1、什么是 AOP? AOP(Aspect Oriented Programming):是一种编程思想,表示面向切面编程。指的是对某…

<Vue>使用依赖注入的方式共享数据

什么是vue依赖注入? Vue是一个用于构建用户界面的渐进式框架。 它提供了一种简单而灵活的方式来管理组件之间的数据流,即依赖注入(Dependency Injection,DI)。 依赖注入是一种设计模式,它允许一个组件从另一…