# HTTP协议 **Repository Path**: ouzai-zai/http-protocol ## Basic Information - **Project Name**: HTTP协议 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-19 - **Last Updated**: 2021-11-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HTTP 协议 [TOC] ## HTTP 协议原理 HTTP通信不受限于特定的系统平台和编程语言,因为HTTP协议严格规定了HTTP请求和HTTP响应的数据格式。所以HTTP客户端(浏览器)和Web服务器遵守HTTP协议,那么就可以看懂双方的数据,从而顺利地通信。 ## HTTP 协议简介 ### 简介 - HTTP 只要用于网页的传输,现在也常应用网络API的开发 - HTTP是一个**TCP / IP** 通信协议的最上层的协议之一 ### 基本工作原理 - HTTP 是浏览器或者其他客户端和网站服务器之间沟通的协议 - 浏览器作为**HTTP客户端**通过**URL**向HTTP服务器即**Web服务器**发送所有请求 - 常用的Web服务器有:**Nginx**、**Apache**、**IIS**服务器等 - Web服务器接收到请求之后,向客户端发送响应信息 - HTTP默认端口号为80 ### HTTP 三个要点 - **HTTP是无连接**:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户端的请求,并收到客户端的应答后,即断开连接。采用这种方式可以节省传输时间 - **HTTP是媒体独立**:意味着只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用合适的MIME-type内容类型 - **HTTP是无状态**:HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力,缺少状态意味着如果后续需要前面的消息,必须重新传,这样可能导致每次连接传送的数据量增大,另一方面,在服务器不需要前面信息时应答就较快 ## HTTP 消息结构 ### 主要流程和概念 > 请求 - **地址**和关键词:例如 GET https://www.baidu.com - **请求头**(header):用来描述请求和发送者的一些信息 - **请求参数**:百度为例,就是要搜索的关键词 > 响应 - **响应代码**:200表示成功,404表示不存在 - **响应头**:描述相应内容的一些信息 - **响应内容**:HTML、JSON、图片等 ## HTTP 请求 ### 请求行 > 下面第一行就是请求行,主要包含几个信息: - 请求方法:如GET,表示你要干什么 - 请求的资源地址 - 使用的HTTP协议的版本号 - ``` GET /hello.txt HTTP/1.1 Host: www.abc.com // 表示请求的地址 Accept-Language:en,mi // 表示请求接受什么语言 ``` ### 请求方法 > 根据HTTP标准,HTTP请求可以使用多种请求方法,这些方法表示这个请求要做什么 HTTP1.0 定义了三种请求方法: **GET**、**POST**、**HEAD**方法 HTTP1.1 新增了六种方法:OPTIONS、**PUT**、PATCH、**DELETE**、TRACE 和 CONNECT 方法 > 最**常用**的请求方法是: - GET 请求表示获取内容,它不会修改服务器上的数据 - POST 请求表示提交内容,通常会修改服务器上的内容 > **完整的HTTP请求方法** | 序号 | 方法 | 概述 | | ---- | -------- | ------------------------------------------------------------ | | 1 | **GET** | 请求置顶的页面信息,并返回实体主体 | | 2 | HEAD | 类似于GET请求,只不过返回的响应中没有具体内容,用于获取报头 | | 3 | **POST** | 向指定资源提交数据进行请求处理。数据被包含在请求体中。POST请求可能会导致新的资源的建立和已有资源的修改 | | 4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容 | | 5 | DELETE | 请求服务器删除指定的页面 | | 6 | CONNECT | HTTP/1.1 协议中预留给能够连接改为管道方式的代理服务器 | | 7 | OPTIONS | 允许客户端查看服务器的性能 | | 8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断 | | 9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 | ### 请求参数 > **GET** 请求的参数 > > - GET 请求的参数都是放在URL中的, > > ![image-20211119104009520](README.assets/image-20211119104009520.png) > > - 请求参数一般以键值对形式出现: > - 网址后面紧跟一个问号【?】 > - 问号后面是一对对参数,形式为:键 = 值 > - 多个参数之间用 【&】 符号隔开 > **POST** 请求的参数 > > - POST 请求的参数放在请求体中 > - 网页上看不见 > - 可以通过开发者工具或者抓包工具看见 格式: ``` GET /abc.txt HTTP/1.1 Host: www.abc.com Acetp-Language:en,mi {'name':'lel','features':'beautful','from':'shenzhen'} ``` ### 请求头 请求头是爬虫的关键技术之一,服务器通常通过请求头来判定: - 判定请求是否合法,是基本的反爬措施,爬虫通过需要添加多几个请求头来模拟真实的网页请求 - 判断用户是否登录,一般通过**Coolie**这个特殊的请求头的内容来判定,只要我们给出合理的**Cookie**,服务器就认为我们登录过 比较重要的请求头: - User-Agent:代表发起访问的是什么浏览器,如果不写,基本会被判定为爬虫,直接被拒 - Cookie:里面记录了登录信息,或者上一次请求服务器设置的信息,也是常用的反爬判定点 - Referer:表示这次请求是从那里点过来的,有点网站不允许你直接访问某个网页,必须是从它的其他网页点过来才行,这时就要设置有一个Referer值,模拟是从别的网页点过来的 ## HTTP 响应 ### 状态码 当浏览者访问一个页面时,浏览者的浏览器会向网页所在的服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头,用以响应浏览器的请求 > 常见的状态码 > > - 200 —— 请求成功 > - 301 —— 资源(网页等)被永久转移到其他URL > - 404 —— 请求的资源(网页)不存在 > - 500 —— 内部服务器错误 Http状态码由三个数字组成,第一个数字定义了状态码类型,后两个表示具体状态,共分为五种类型: | 分类 | 分类描述 | | ---- | -------------------------------------------- | | 1** | 信息,服务器接收请求,需要请求者继续执行操作 | | 2** | 成功,操作被成功接收并处理 | | 3** | 重定向,需要进一步的操作完成请求 | | 4** | 客户端错误,请求包含语法错误或者无法完成请求 | | 5** | 服务器错误,服务器在处理请求过程中发送错误 | ### 响应头 Http响应头包含了网页的重要描述信息,比如网页的格式,网页的过期时间 ![image-20211119111548395](README.assets/image-20211119111548395.png) ### 响应内容和Content type > 最常见的网页的内容格式: > > - HTML 人看的 > - JSON 数据格式,一般是API,给程序用的, > - XML 也是数据格式 > > 除此之外还有图片、样式表、JavaScript等 Content-type就表示了网页的内容类型,告诉浏览器文件类型,网页编码,帮助浏览器决定以什么形式、什么编码读取这个文件 Content-type 标头告诉客户端实际返回的内容的内容类型 > 语法格式: > > ``` > Content-Type:text/html; charset=utf-8 > Content-Type: multipart/form-data; boundary=something > ``` ![image-20211119112136180](README.assets/image-20211119112136180.png)