HTTP基础

1 HTTP简介

1.1 简介

HTTP(Hypertext Transfer Protocol)是一种用于在互联网上传输数据的协议。它是一种客户端-服务器协议,用于在Web浏览器(客户端)和Web服务器之间传递请求和响应数据。HTTP通常用于获取和显示网页内容,但也可用于传输其他类型的数据,如图像、音频、视频和文本文件。

HTTP工作的基本原理是客户端发送HTTP请求,然后服务器响应该请求。HTTP请求通常包括一个请求方法(如GET、POST、PUT等)、请求的资源路径、HTTP版本号以及可选的请求头部信息。服务器收到请求后,会处理它并返回一个HTTP响应,其中包含HTTP状态码、响应头部信息和响应体(通常是请求的数据或网页内容)。

客户端发送给服务器的”信”,称之为”请求协议”。
服务器端发送给浏览器的”信”,称之为”响应协议”。

1.2 特点

HTTP的常见特点包括:

1.状态无关性:HTTP协议是无状态的,每个请求都是独立的,服务器不会保留先前请求的状态信息。这意味着每个请求都需要包含所有必要的信息,例如身份验证令牌。

2.明文传输:HTTP数据在传输过程中是明文的,不加密。这使得HTTP在安全性方面存在一些问题,因此常常需要与其他安全协议(如HTTPS)一起使用,以确保数据的加密和安全性。

3.请求-响应模型:HTTP基于请求-响应模型工作,客户端发送请求,服务器响应请求。这个模型适用于许多互联网应用,包括网页浏览、API调用等。

4.可扩展性:HTTP协议是可扩展的,允许通过HTTP头部信息传递额外的元数据,以支持各种不同的应用和功能。

5.支持B/S及C/S模式。

1.3 URL

URL(Uniform Resource Locator)是用于标识和定位互联网上资源的地址。在HTTP协议中,URL用于指定要请求的资源的位置。一个标准的URL通常包含以下几个部分:

  1. 协议(Protocol):这是URL的第一部分,通常是HTTP或HTTPS。HTTP用于标识不加密的HTTP连接,而HTTPS用于标识加密的HTTP连接。

  2. 主机名(Host):主机名指定了存储资源的服务器的地址。它可以是一个域名(例如,www.baidu.com)或一个IP地址(例如,192.168.1.1)。

  3. 端口号(Port):端口号是可选的,它指定了要连接到服务器的特定端口。如果未指定端口号,HTTP通常使用默认的端口80,而HTTPS通常使用默认的端口443。

  4. 路径(Path):路径部分指定了服务器上资源的位置。它以斜杠(/)开头,并包含资源的文件路径或目录结构。例如,/images/pic.jpg

  5. 查询字符串(Query String):查询字符串是可选的,它允许将参数附加到URL以传递给服务器。查询字符串通常以问号(?)开头,参数之间使用与号(&)分隔。
    例如,?page=2&category=tech

  6. 片段标识符(Fragment Identifier):片段标识符也是可选的,它允许将文档的特定部分标识为资源的一部分。片段标识符以井号(#)开头,例如,#section2

下面是一个示例URL:

https://www.baidu.com:80/products/item?id=12345#description

在这个示例中:

  • 协议是HTTPS。
  • 主机名是www.baidu.com。
  • 端口号是80,可以省略不写。
  • 路径是/products/item。
  • 查询字符串是?id=12345。
  • 片段标识符是#description。

URL在HTTP中起着关键的作用,它指定了客户端要请求的资源的位置,并允许服务器和客户端之间进行准确定位和通信。不同的URL可以指向不同的资源,包括网页、图像、文档、API端点等。

1.4 URI和URL的区别

URI(Uniform Resource Identifier)和URL(Uniform Resource Locator)是两个相关但不完全相同的概念,它们都用于标识和定位互联网上的资源,但具有不同的含义:

  1. URI(统一资源标识符)
  • URI是一个更广泛的概念,用于标识任何类型的资源,不仅限于互联网资源。
  • URI分为两个子集:URL和URN(Uniform Resource Name)。
  • URI的主要目的是唯一标识资源,而不一定提供资源的定位信息。
  1. URL(统一资源定位符)
  • URL是URI的一个特殊类型,它不仅标识资源,还提供了资源的定位信息,允许客户端通过指定的地址访问该资源。
  • URL包括协议(如HTTP、FTP、HTTPS)、主机名、端口号、路径、查询字符串和片段标识符,用于明确资源的位置和访问方式。
  • URL的主要目的是标识和定位互联网资源,以便客户端可以通过指定的地址访问它们。

简而言之,URI是一个通用的概念,用于唯一标识任何类型的资源,而URL是URI的一个具体实现,用于标识和定位互联网资源,提供了资源的定位信息。URL是URI的一种特例。而URN是URI的另一种特殊形式,它的目的是仅标识资源而不提供定位信息,例如,ISBN(国际标准书号)就是URN的一个示例,用于唯一标识书籍。

在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。

在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。相反的是,URL类可以打开一个到达资源的流。

2 HTTP的请求消息Request

HTTP请求消息(HTTP Request)是客户端发送给服务器以请求特定资源的消息。HTTP请求消息通常由以下几个部分组成:

  1. 请求行(Request Line):请求行包含了请求的方法、请求的目标资源(URL或URI),以及所使用的HTTP协议版本。常见的HTTP请求方法包括GET、POST、PUT、DELETE等。例如:

    GET /index.html HTTP/1.1
    
  2. 请求头部(Request Headers):请求头部包含了关于请求的元数据信息,例如客户端的用户代理、请求的主机、所接受的内容类型等等。请求头部通常以键值对的形式表示,每一对都以冒号分隔,例如:

    Host: www.example.com
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    
  3. 空行:请求行和请求头部之间必须由一个空行分隔。

  4. 请求体(Request Body)(可选):请求体包含了客户端发送给服务器的数据。它通常在使用POST、PUT等方法时才会包含,用于传输表单数据、JSON、XML等内容。

HTTP的get请求表单代码示例:

<form action="http://httpbin.org/get" method="get">
	<input type="text" name="username" value="kong"><br>
	<input type="password" name="password" value="123456"><br>
	<input type="submit" value="提交">
</form>

使用 Fidller 抓包,查看HTTP协议数据如下:
在这里插入图片描述

3 HTTP的响应消息Response

HTTP响应消息(HTTP Response)是服务器发送给客户端作为对客户端HTTP请求的响应的消息。HTTP响应消息通常包含以下几个部分:

  1. 状态行(Status Line):状态行包含了HTTP协议版本、数字状态码和状态消息。数字状态码表示请求的处理结果,常见的状态码包括200(成功)、404(未找到资源)、500(服务器内部错误)等。例如:

    HTTP/1.1 200 OK
    
  2. 响应头部(Response Headers):响应头部包含了关于响应的元数据信息,例如服务器信息、响应的内容类型、响应的日期等等。响应头部通常以键值对的形式表示,每一对都以冒号分隔,例如:

    Server: Apache/2.4.38 (Unix)
    Content-Type: text/html; charset=UTF-8
    Date: Mon, 12 Sep 2023 10:00:00 GMT
    
  3. 空行:状态行和响应头部之间必须由一个空行分隔。

  4. 响应体(Response Body)(可选):响应体包含了服务器发送给客户端的实际数据,通常是请求的资源的内容。响应体的格式和内容类型取决于服务器和客户端之间的约定,可以是HTML、JSON、XML、图像等等。

HTTP的post请求表单代码示例:

<form action="http://httpbin.org/post" method="post">
	<input type="text" name="username" value="kdx"><br>
	<input type="password" name="password" value="123456"><br>
	<input type="submit" value="提交">
</form>

使用 Fidller 抓包,查看HTTP协议数据如下:
在这里插入图片描述

4 HTTP的状态码

HTTP状态码是服务器响应客户端请求时返回的数字代码,用于表示请求的处理结果。状态代码由三位数字组成,第一个数字定义了响应的类别,共分五种类别:

  • 1xx:指示信息,表示请求已接收,继续处理
  • 2xx:成功,表示请求已被成功接收、理解、接受
  • 3xx:重定向,要完成请求必须进行更进一步的操作
  • 4xx:客户端错误,请求有语法错误或请求无法实现
  • 5xx:服务器端错误,服务器未能实现合法的请求

常见状态码:

  • 200:OK,客户端请求成功
  • 400:Bad Request,客户端请求有语法错误,不能被服务器所理解
  • 401:Unauthorized,请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
  • 403:Forbidden,服务器收到请求,但是拒绝提供服务
  • 404:Not Found,请求资源不存在,输入了错误的URL
  • 500:Internal Server Error,服务器发生不可预期的错误
  • 503:Server Unavailable,服务器当前不能处理客户端的请求,一段时间后可能恢复正常

5 HTTP的请求方法

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT,DELETE, TRACE 和 CONNECT 方法。

HTTP请求方法是客户端向服务器发起请求以执行特定操作的一种指令或动作。每个HTTP请求都使用其中一个请求方法来定义要执行的操作。以下是一些常见的HTTP请求方法:

  1. GET:用于请求服务器获取特定资源的表示形式。GET请求不会修改服务器上的数据,仅用于读取数据。它通常用于获取网页、图像、文档等资源。

  2. POST:用于向服务器提交数据,通常用于创建新资源、提交表单数据、上传文件等。POST请求可能会修改服务器上的数据。

  3. PUT:用于向服务器上传或更新资源,通常用于更新已存在的资源。PUT请求要求客户端提供完整的资源表示形式,以替换服务器上的资源。

  4. DELETE:用于请求服务器删除指定的资源。DELETE请求会删除服务器上的资源。

  5. HEAD:与GET方法类似,但服务器不会返回资源的主体内容,仅返回响应头部信息。HEAD请求用于检索资源的元数据,如资源是否存在、最后修改时间等。

  6. OPTIONS:用于获取有关服务器支持的HTTP方法和其他通信选项的信息。通常用于跨域请求的预检测(CORS预检请求)。

  7. PATCH:用于部分更新服务器上的资源。PATCH请求只更新资源的一部分,而不是整个资源。它通常用于避免覆盖服务器上的其他数据。

  8. TRACE:用于在请求-响应链上执行一个回环测试。TRACE请求通常用于诊断和调试,以查看请求在通过代理服务器和中间件时如何被修改。

6 HTTP的工作原理

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户
端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

以下是 HTTP 请求/响应的步骤:

  1. 客户端连接到Web服务器
    一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn。
  2. 发送HTTP请求
    通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
  3. 服务器接受请求并返回HTTP响应
    Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
  4. 释放连接TCP连接
    若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
  5. 客户端浏览器解析HTML内容
    客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
  4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
  5. 释放 TCP连接;
  6. 浏览器将该 html 文本并显示内容;

7 GET和POST请求的区别

  1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456。POST方法是把提交的数据放在HTTP包的Body中。
  2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
  3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取
    变量的值。
  4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值