HTTP 协议详解

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

前言

1、HTTP 介绍

2、URL介绍

1了解 URL 和 URI

2URL 格式 

 3URL encode

3、HTTP 协议格式

1请求报文格式

2响应报文格式

3协议格式总结

4、HTTP 请求Request

1请求方法

 2请求的网址Request URL

 3请求头Request Headers

4请求体Request Body

 5、HTTP响应Response

1响应状态码Resqonse Status Code

2响应头Response Headers

3响应体Response Body


前言

    什么是协议就是一种规定描述了通信双方要按照什么样的格式传输信息。而本文讲解的HTTP 也是协议中的一种。

1、HTTP 介绍

HTTP全称为“超文本传输协议”是一种应用非常广泛的 应用层协议

 应用层很多时候需要程序员自定义应用层协议也有一些现成的协议供我们使用其中 HTTP 就是其中的佼佼者。

       我们日常的一些操作其实都涉及到 HTTP协议 运用比如我们在浏览器打开一个网页背后浏览器和服务器的交互大概率使用的就是 HTTP 协议。此外手机APP和服务器之间的交互、服务器之间的相互调用也会使用 HTTP 协议所以 HTTP协议 与我们的生活息息相关。

HTTP 协议是个最典型的 “一问一答”模型的协议

比如当我们在浏览器中输入一个 “网址”之后看到一个网页这个过程其实分为三步

  1. 客户端向服务器发送 HTTP 请求 
  2. 服务器收到后根据请求找到客户端想要的资源一般是html并把这个资源通过 HTTP响应返回给 浏览器        
  3. 客户端收到 HTML 之后对页面进行渲染

 以上就是 HTTP 传输信息大致方式典型的一问一答型。接下来将重点介绍 HTTP 报文格式也是我们学习的重点 

报文格式简单概括就是了描述 HTTP 请求是什么样的响应是什么样的

在学习HTTP报文格式之前我们需要安装一下抓包工具

大家可以参考这篇安装抓包工具简单介绍和 fiddler 安装

2、URL介绍

1了解 URL 和 URI

URI 全称 Uniform Resource Identifier即统一资源标志符

URL 全称 Universal Resource Locator即统一资源定位符

   什么是URLURL 就是我们平常所说的网址例如 https://www.baidu.com 是一个 URL而 URI 与 URL 概念类似只不过 URL 是 URI 的一个子集也就是说每个 URL 都是 URI但并非每个URI都为URL。

    URI 除了URL之外还包括一个子集叫作 URN全称为 Universal Resource Name即统一资源名称。URN 只为资源命名而不指定如何定位资源例如 urn:isbn:0451450642 指定了一本书的 ISBN可以标识这本书但没有指定到哪里获取这本书。

    在互联网中URN 使用的非常少几乎所有的 URI 都是 URL所以对于一般的网页链接我们既可以称为 URI也可以称为 URL在日常生活中是称 URL 的多一点。

2URL 格式 

   URL 的书写并不是随意书写的它是由因特网标准RFC1738进行约定的具体格式如下

RFC 1738 - Uniform Resource Locators (URL)

   在URL规定格式中括号包括内容是非必要部分例如  https://www.baidu.com 就只包含了 scheme 和 hostname 两部分。但是哪些非必要的部分并不代表不重要接下来我将分别介绍每一部分代表的含义。

  • scheme协议。常用的协议有 http、https、ftp等另外 scheme 也常常被称为 protocol。
  • usernamepassowrd用户名和密码有时候登陆时会显示现在用到比较少
  • hostname主机地址该地址可以是域名也可以是IP地址比如 https://www.baidu.com 这个 URL 中的 hostname 就是 www.baidu.com百度的二级域名。
  • port端口这个就是服务器设定的服务端口例如 https:127.0.0.1:8080 这个 URL 中的端口就是 8080。但是有些 URL 中没有端口信息这是使用了默认端口例如 http 协议的默认端口是 80https 协议的默认端口是443。
  • path路径指的就是网络资源在服务器中的指定地址
  • parameters参数用来指定访问某个资源时的附加信息
  • query查询用来查询某个类资源如果又多个资源则用 & 隔开
  • fragment片段是对资源描述的部分补充。

 3URL encode

     在URL格式中像 / ? : @ 等这样的字符已经被URL当做特殊字符使用。如果 URL 中查询部分涉及到这些特殊字符就可能导致该 URL 解析错误。

这个原理就像编程语言中的 变量名 不能是“关键字”一样。例如在java中我们不能给一个变量起名为 ‘int’。

   针对这种情况的发生我们就会对 URL 中的特殊字符进行转义这个转义过程就叫 URL endcode。

例我在百度中搜索“C++”在URL中 ‘+’ 就被转义为 “%2B”。

   

 除了特殊字符之外中文也会进行转义

 查看转义编码网站查看字符编码UTF-8

3、HTTP 协议格式

HTTP协议格式可以分为两种HTTP请求报文格式 和 HTTP响应报文格式。 

我们打开 fiddler在浏览器访问 www.baidu.com在 fiddler 中查看请求和响应

1请求报文格式

我们先来看HTTP请求报文分为四个部分

 第一部分首行   

首行包括HTTP方法+URL+版本号

  1. HTTP方法也就是你想通过该请求做些什么事情常见的方法有 GET、POST 这些具体会在 请求头 中介绍。 
  2. URL 请求的网址
  3. 版本号一般情况下会省略

 第二部分请求头header

请求头主要由一个个键值对组成。每一行是一个键值对键和值之间使用 “: ” 来分割 。

  第三部分空行

空行 代表 header 的结束的标记。一个HTTP请求的 header 可以有若干个官方就用空行作为 header 的结束标记类似于链表的 null。

 第四部分正文 body 

 正文部分并不是所有的请求都有的一些需要提交数据的请求中就会包含。

例如我正在写这篇文章我抓取该网页请求就能看见请求中正文。 

        正文格式有很多格式常见的就是json

2响应报文格式

响应报文跟请求报文类似也分四个部分

  第一部分首行

首行包括版本号+状态码+状态码描述

  1. 版本号与请求首行里的版本号相同
  2. 状态码 描述当前请求的“状态”例如200请求成功、404未找到
  3. 状态码描述 对状态码的解释说明

  第二部分响应头 header

与请求中header一样都是由多个键值对组成。每个键值对占一行键和值之间使用空格来分割 。

  第三部分空行

header 的结束标记

  第四部分正文body

      正文格式有很多中常见的就是 json、html等此处访问百度的响应报文中正文就是html如果是登陆页面的话json格式的多一点。

3协议格式总结

这里简单介绍一下协议格式接下来具体介绍请求和响应报文内部细节。 

4、HTTP 请求Request

  请求由客户端发往服务器分为四部分请求方法Request Method、请求的网址Request URL、请求头Request Headers、请求体Request Body。下面分别介绍这四部分。

1请求方法

  请求方法用于标识请求客户请求服务端的方式常见的请求的方法有GET 和 POST。

① GET 

GET 是最常用的 HTTP 方法常用与获取服务器上的某个资源。GET 传递数据时会把数据放到 URL的 query 中。例如我们在百度中搜索“java”便发起一个GET请求地址中就会出现若干键值对其中一个就包含我们的输入的请求“java”。

 常见的构造GET请求的场景

  1. 浏览器地址栏直接输入URL
  2. html 里面的 link、a、img、script 
  3. form 表单
  4. ajax

② POST

POST 方法也是一种常见的方法常用于提交用户输入的数据给服务器例如登陆页面等。

常见的构造POST请求的场景

  1. HTML中from标签
  2. ajax

我们平常遇到的绝大部分请求是 GET 或 POST 请求。除了这个两个还有一些请求方法如下

方法说明支持的HTTP协议版本
GET获取资源1.0、1.1
POST传输实体主体1.0、1.1
PUT传输文件1.0、1.1
HEAD获取报文首部1.0、1.1
DELETE删除文件1.0、1.1
OPTIONS询问支持的方法1.1
TRACE追踪路径1.1
CONNECT要求用隧道协议连接代理1.1
LINK建立和资源之间的联系1.0
UNLINE断开连接关系1.0

 2请求的网址Request URL

请求网址可以唯一确定客户端想要请求的资源也就是URL。关于URL的各个细节这里就不再赘述了。

 3请求头Request Headers

请求头也叫报头用来说明服务器要使用的附加信息这些信息可能不止一条而且整体结构呈现“键值对”的格式每个键值对占一行键和值之间用分号分割。

这些信息的种类有很多以下主要介绍一些重要的。

   1. Host

表示服务器主机的地址和端口通俗点就是去哪里找到服务器。

例如在浏览器搜索www.baidu.com发送的请求中Host的值就为www.baidu.com

 一般Host的值就是 IP + 端口这里的端口可以省略。 

省略代表默认值HTTP 的默认值为 80Https 的默认值为 443

   2. Content-Length

表示body中的数据长度

如果发送报文没有body的话就没有该信息

   3. Content-type

表示请求的body中的数据格式。body 中的数据可以放很多中格式对于接收方来说解析方式是截然不同的。

常见的形式

  • application/x-www-form-urlencoded: form 表单提交的数据格式. 此时 body 的格式形如:

  •  multipart/form-data: form 表单提交的数据格式( form 标签中加上enctyped="multipart/form-data" 通常用于提交图片/文件。body 格式形如:

  •  application/json: 数据为 json 格式。body 格式形如

 Content-type 更多细节MIME types (IANA media types) - HTTP | MDN

  4. User-Agent

简称UA这是一个特殊的字符串头可以是服务器识别客户端使用的操作系统即版本、浏览器即版本等信息。

 关于 User-Agent  https://www.nowamagic.net/librarys/veda/detail/2576

   5. Referer

用于标识请求是从哪个页面发送过来的服务器可以拿到这一信息并做相应的处理如做来源设计、防盗链处理等。

 注如果直接在浏览器中输入URL或者直接通过收藏夹访问页面时是没有Referer的。

   6. Cookie

Cookie 是浏览器在本地存储数据的一种机制。这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据。主要是用来保持本地访问会话。

例如我们访问B站页面并登陆我们的账号此时服务器就会用会话保存登陆信息当我们观看各种鬼畜视频时在该站点访问其他页面就会处于登陆状态这就是 Cookie 的功劳。

4请求体Request Body

请求体一般承载的内容是 POST 请求中的表单数据对于 GET 请求请求体为空。

如下我登录B站时抓取到的请求

   输入账号和密码之后点击登录我的账号和密码加密之后就会放在请求体中发送给服务器。查看上张图会发现发送请求中 Content-type 为 application/json 所以发送的请求体格式就为 json。

     除此之外Content-type 还可以设为 application/x-www-form-urlencoded这样内容就会以表单数据的形式放在请求体中提交同时 Content-type 也可设为 multipart/from-data 来上传文件。

Content-typePOST 提交数据的方式
application/x-www-form-urlencoded表单数据
multipart/from-data表单文件上传
application/json序列化 json 数据
text/xmlXML 数据

 5、HTTP响应Response

   响应就是由服务器返回给客户端可以分为三个部分 响应状态码、响应头、响应体。

1响应状态码Resqonse Status Code

状态码是一个数组。这个数字描述了当前这次请求的“状态”成功失败失败的原因

例如我们在百度页面访问 123 这个资源不存在服务器就会响应一个404 Not Found。

 状态码有很多种主要分为五类1xx、2xx、3xx、4xx、5xx

下面列举出各个分类常见的状态码

 1xx信息响应 

状态码说明详情
100继续请求者应当继续提出请求。服务器已收到请求的一部分正在等待其余部分
101切换协议请求者已要求服务器切换协议服务器已确认并准备切换

 2xx成功响应 

状态码说明详情
200成功服务器已成功处理请求
201已创建请求成功并且服务器创建了新的资源
202已接收服务器已接收请求但尚未处理
203非授权信息服务器已成功处理了请求但返回的信息肯来自另一个源
204无内容服务器成功处理了请求但没有返回任何内容
205重置内容服务器成功处理了请求内容被重置
206部分内容服务器成功处理了部分请求

 3xx重定向 

状态码说明详情
300多种选择针对请求服务器可执行多种操作
301永久移动请求的网页已永久移动到新位置即永久重定向
302临时移动请求的网页暂时跳转到其他页面即暂时重定向
303查看其他位置如果原来的请求是POST重定向目标文档应该通过GET提取
304未修改此处请求返回的网页未经修改继续使用上次的资源
305使用代理请求者应该使用代理访问该页面
307临时重定向临时从其他位置响应请求的资源

 4xx客户端错误 

状态码说明详情
400错误请求服务器无法解析该请求
401未授权请求无法解析该请求
403禁止访问服务器拒绝此请求
404未找到服务器找不到请求的页面
405方法禁用服务器禁用了请求中指定的方法
406不接收无法使用请求的内容响应请求的页面
407需要代理授权请求者需要使用代理授权
408请求超时服务器请求超时
409冲突服务器在完成请求时发送的冲突
410已删除请求的资源已永久删除
411需要有效长度服务器不接收不含有效内容长度标头字段请求
412未满足前提条件服务器未满足请求者在请求中设置的某一个前提条件
413请求实体过大请求实体过大超出服务器的处理能力
414请求 URI 过长请求的网址太长服务器无法处理
415不支持类型请求格式不被请求页面支持
416请求范围不符页面无法提供请求范围
417未满足期望值服务器未满足期望请求标头字段的要求
418彩蛋愚人节笑话

 5xx服务器错误 

状态码说明详情
500服务器内部错误服务器遇到错误无法完成请求
501未实现服务器不具备完成请求的能力
502错误网关服务器作为网关或代理接收到上游服务器的无效响应
503服务不可用服务器目前无法使用
504网关超时服务器作为网关或代理没有及时从上游服务器收到请求
505HTTP版本不支持服务器不支持请求中使用 HTTP 协议版本

更多细节请参考官方文档HTTP 状态码 | 菜鸟教程

2响应头Response Headers

  响应头包含了服务器对请求的应答信息如 Content-Type、Server、Set-Cookie等。下面简要介绍一些常用的响应头信息

  • Date 用于表示响应产生的时间。
  • Last-Modified用于指定资源的最后修改时间。
  • Content-Encoding用于指定响应内容的编码。
  • Server包含服务器的信息例如名称、版本号...
  • Content-Type文档类型指定返回的数据是什么类型也就是响应报文 body 中的数据格式。常见有 text/html  格式为 HTMLtext/css 格式为 CSSapplication/javascript 格式为 Javascriptapplication/json 格式为 JSON。
  • Set-Cookie设置 Cookie。响应头中 Set-Cookie 用于告诉浏览器需要将次内容放置 Cookie 中下次请求将 Cookie 带上。

3响应体Response Body

        响应体也能叫正文响应的数据都存在正文中例如请求一个网页正文就是网页的 HTML代码。

以上就是HTTP的一些基本原理和具体细节大家需要好好掌握涉及到的知识点为学习Servlet打好基础。 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6