HTTP 协议的基本格式(部分)

要想了解HTTP,得先知道什么是HTTP,那么HTTP是什么呢?HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的 **应用层协议。**那什么是超文本呢?那就是除了文本,还有图片,声音,视频等。

理解HTTP协议的工作过程

当我们在浏览器中输入一个 "网址", 此时浏览器就会给对应的服务器发送一个 HTTP****请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回一个 **HTTP 响应。**这个响应的内容往往是HTML内容。事实上, 当我们访问一个网站的时候, 可能涉及不止一次的 HTTP 请求/响应 的交互过程.

认识URL

平时我们俗称的 "网址" 其实就是说的 URL (Uniform Resource Locator 统一资源定位符). 互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它. URL 的详细规则由 因特网标准RFC1738 进行了约定:(https://datatracker.ietf.org/doc/html/rfc1738)

一个具体的 URL: https://v.bitedu.vip/personInf/student?userId=10000\&classId=100

https : 协议方案名. 常见的有 http 和 https, 也有其他的类型. (例如访问 mysql 时用的 jdbc:mysql ),省略后默认为http

user:pass : 登陆信息. 现在的网站进行身份认证一般不再通过 URL 进行了. 一般都会省略

v.bitedu.vip : 服务器地址. 此处是一个 "域名", 域名会通过 DNS 系统解析成一个具体的 IP 地址. (通过 ping 命令可以看到, v.bitedu.vip 的真实 IP 地址为 118.24.113.28 ),如果省略的话,则是访问当前服务器的地址,如访问博客的服务器,响应内容就是博客主页的HTML,这个HTML又触发一些其他的HTTP请求,这些后续触发的HTTP请求,就可以省略IP,省略IP就相当于使用和刚才获取的博客HTML一样的IP

端口号: 上面的 URL 中端口号被省略了. 当端口号省略的时候, 浏览器会根据协议类型自动决定使用 哪个端口. 例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口.用来区分应用程序

/personInf/student : 带层次的文件路径。**访问服务器上的哪个资源。**也可以省略,如果省略,相当于访问的就是服务器的根目录,如https://music.163.com/
userId=10000&classId=100 : 查询字符串 (query string). 本质是一个键值对结构 . 键值对之间使
用 & 分隔 . 键和值之间使用 = 分隔。查询字符串以问号开始。也可以省略。 像 / ? : 等这样的字符 , 已经被 url 当做特殊意义理解了 . 因此这些字符不能随意出现 . 比如 , 某个参数中需要带有这些特殊字符 , 就必须先对特殊字符进行转义. 转义的规则如下 : 将需要转码的字符转为 16 进制,然后从右到左,取 4 位 ( 不足 4 位直接处理 ) ,每 2 位做一 位,前面加上 % ,编码成 %XY格式。 urldecode 就是 urlencode 的逆过程; UrlEncode编码/UrlDecode解码 - 站长工具 (chinaz.com)
片段标识 : 此 URL 中省略了片段标识 . 片段标识主要用于页面内跳转 . ( 例如 Vue 官方文档 : https://c
n.vuejs.org/v2/guide/#起步 , 通过不同的片段标识跳转到文档的不同章节 )

HTTP****协议格式

Http由4个部分组成,第一个部分为首行,第二个部分为header,第三个部分为空行,第四个部分为正文。以下为HTTP请求:

首行:由三部分组成,第一个部分为method(方法),第二部分为URL,第三部分为版本号。这三个部分使用空格来分割。如:GET https://blog.csdn.net/nav/game HTTP/1.1

method:

GET请求一般没有正文,POST响应一般有正文。POSTt和GET最主要的区别为,GET将要上传的自定义的数据放到query string,body通常是空的,而POST是把一些自定义的文件放到body里,query string通常是空的。放在query string,用户能直接看到,放在body里,用户没法直接看到。GET请求的优点是可以被缓存,因为GET请求不会对服务器上的资源进行修改,所以多次请求同一个URL时,浏览器可以直接从缓存中获取数据,提高了页面的加载速度。POST请求的优点是可以传递大量数据,而GET请求由于URL长度的限制,只能传递少量数据。

header:也是键值对结构,每一行是一个键值对,键和值间用冒号分开。1)Host :表示服务器主机的地址和端口,通常情况下Host里的内容与URL里的内容是一致的,但是也有例外,比如如果使用了代理。2)Content-Length:表示 body 中的数据长度,单位为字节,没有body,这个就可以没有,有body,就必须有。解决粘包问题。3)Content-Type:表示请求的 body 中的数据格式.常见选项: application/x-www-form-urlencoded: form 表单提交的数据格式,multipart/form-data: form 表单提交的数据格式(在 form 标签中加上 enctyped="multipart/form-data" . 通常用于提交图片/文件。application/json: 数据为 json 格式。4)User-Agent (简称UA) :表示浏览器/操作系统的属性。如操作系统的版本和浏览器的版本。5)Referer:表示这个页面是从哪个页面跳转过来的。如果直接在浏览器中输入URL, 或者直接通过收藏夹访问页面时是没有 Referer 的。6)Cookie:Cookie 中存储了一个字符串, 这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据)。往往可以通过这个字段实现 "身份标识" 的功能.

空行:相当于一个分隔符,分割了header和(正文)body,描述了body是从哪里开始。

body:格式于query string的格式相似,同样也要经过urlencode,是要上传的数据。
认识 " 状态码 " (status code)
状态码表示访问一个页面的结果。
1) 200 OK: 这是一个最常见的状态码 , 表示访问成功 .
2) 404 Not Found: 没有找到资源 .
3)403 Forbidden: 表示访问被拒绝 . 有的页面通常需要用户具有一定的权限才能访问 ( 登陆后才能访问 ). 如果用户没有登陆 直接访问 , 就容易见到 403。
4) 405 Method Not Allowed: 前面我们已经学习了 HTTP 中所支持的方法 , 有 GET, POST, PUT, DELETE 等 . 但是对方的服务器不一定都支持所有的方法 ( 或者不允许用户使用一些其他的方法 ).
5) 500 Internal Server Error: 服务器出现内部错误 . 一般是服务器的代码执行过程中遇到了一些特殊情况 ( 服务器异常崩溃 ) 会产生这个 状态码 .
6) 504 Gateway Timeout: 当服务器负载比较大的时候 , 服务器处理单条请求的时候消耗的时间就会很长 , 就可能会导致出现超时的 情况 .
7) 302 Move temporarily: 临时重定向。 在登陆页面中经常会见到 302. 用于实现登陆成功后自动跳转到主页 . 响应报文的 header 部分会包含一个 Location 字段 , 表示要跳转到哪个页面 .
8) 301 Moved Permanently: 永久重定向 . 当浏览器收到这种响应时 , 后续的请求都会被自动改成新的地址 . 301 也是通过 Location 字段来表示要重定向到的新地址 .


认识响应 " 报头 " (header)
响应报头的基本格式和请求报头的格式基本一致. 类似于 Content - Type , Content - Length 等属性的含义也和请求中的含义一致 .
Content-Type
响应中的 Content-Type 常见取值有以下几种 :
1)text/html : body 数据格式是 HTML
2)text/css : body 数据格式是 CSS
3)application/javascript : body 数据格式是 JavaScript
4)application/json : body 数据格式是 JSON

相关推荐
觉醒法师1 分钟前
HarmonyOS开发 - 电商App实例二( 网络请求http)
前端·http·华为·typescript·harmonyos·ark-ts
23级二本计科5 分钟前
NAT NAPT
运维·服务器·网络
9稳2 小时前
基于单片机的智能楼宇门禁系统设计
网络·单片机·嵌入式硬件
Bright Data3 小时前
在 Axios 中设置代理
http·https·axios·api·socks·代理服务器·proxy server
熬了夜的程序员3 小时前
Go 语言封装 HTTP 请求的 Curl 工具包
后端·程序人生·http·golang
网络安全指导员3 小时前
kali linux 漏洞扫描
linux·运维·开发语言·网络·安全·web安全
写完这行代码打球去4 小时前
为什么大模型网站使用 SSE 而不是 WebSocket?
网络·websocket·网络协议
起床学FPGA5 小时前
wireshark点击快捷无法打开
网络·测试工具·wireshark
Wlq04155 小时前
计算机网络概述
网络·计算机网络
q567315235 小时前
用Haskell语言和wreq库配合HTTP写个爬虫程序
爬虫·网络协议·http