1 HTTP简介
Http协议即超文本传送协议 (HTTP-Hypertext transfer protocol) 。它定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。并且详细的规定了客户端浏览器与服务器之间互相通信的规则。
这些通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。如下:
- 客户端发送给服务器的"信",我们称之为"请求协议"。
- 服务器端发送给浏览器的"信",我们称之为"响应协议"。
注意:使用Fiddler抓包工具可以抓取HTTP协议的内容。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
1.1 主要特点
-
基于TCP/IP的高级协议
-
默认端口 :80
-
基于请求/响应模型的,无连接:一次请求对应一次响应
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
-
无状态的:每次请求之间相互独立,不能交互数据
HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
-
支持 B/S C/S模式
-
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
-
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
1.2 历史版本
- HTTP 1.0:每次请求响应都会建立一次连接
- HTTP 1.1:复用连接
- 请求头中 Connection : keep-alive
1.3 URL
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息。
URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。
以下面这个URL为例,介绍下普通URL的各部分组成:
http
http://httpbin.org:80/get?username=mickey&password=123456
从上面的URL可以看出,一个完整的URL包括以下几部分
-
协议部分:该URL的协议部分为"http:",这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的"//"为分隔符
-
域名部分:该URL的域名部分为"httpbin.org"。一个URL中,也可以使用IP地址作为域名使用
-
端口部分:跟在域名后面的是端口,域名和端口之间使用":"作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口
-
虚拟目录部分:从域名后的第一个"/"开始到最后一个"/"为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是"/"
-
文件名部分:从域名后的最后一个"/"开始到"?"为止,是文件名部分,如果没有"?",则是从域名后的最后一个"/"开始到"#"为止,是文件部分,如果没有"?"和"#",那么从域名后的最后一个"/"开始到结束,都是文件名部分。本例中的文件名是"index.asp"。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名
-
锚部分:从"#"开始到最后,都是锚部分。本例中的锚部分是"name"。锚部分也不是一个URL必须的部分
-
参数部分:从"?"开始到"#"为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为"boardID=5&ID=24618&page=1"。参数可以允许有多个参数,参数与参数之间用"&"作为分隔符。
1.4 URI,URL,URN
URL 中华人民共和国
URI 共和国
\1. URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的,URI一般由三部组成:
-
访问资源的命名机制
-
存放资源的主机名
-
资源自身的名称,由路径表示,着重强调于资源。
\2. URL是、uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
-
协议(或称为服务方式)
-
存有该资源的主机IP地址(有时也包括端口号)
-
主机资源的具体地址。如目录和文件名等
\3. URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com
URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。上面的 mailto、news 和 isbnURI 都是 URN 的示例。
在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。
在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。相反的是,URL类可以打开一个到达资源的流。
2 HTTP请求消息Request
Request请求消息格式
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
- 请求行(Request Line):请求行包含了请求的方法、URL和HTTP协议的版本。常见的请求方法有GET、POST等,URL指定了请求的资源路径,HTTP协议的版本通常是HTTP/1.1。
- 请求头部(Request Headers):请求头部包含了与请求相关的一些元信息,以键值对的形式表示。常见的请求头部包括Content-Type(指定请求体的数据类型)、User-Agent(客户端标识信息)、Authorization(身份验证凭据)等。
- 空行:请求头部与请求体之间必须用一个空行进行分隔。
- 请求体(Request Body):也就是请求数据,请求体在某些请求中可能存在,主要用于传递一些数据给服务器,比如表单数据或者JSON数据等。
不是所有的HTTP请求都会包含请求体 ,比如GET请求通常不需要请求体。而请求头部是可选的,至少需要一个请求行来表示请求的方法和资源路径。具体的请求结构会根据实际需求和协议规范进行定义。
3 HTTP响应消息Response
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文
- 状态行(Status Line):状态行包含了响应的状态码和原因短语。状态码是三位数字,用于表示响应的状态,常见的状态码有200(成功)、404(未找到资源)和500(服务器内部错误)等。
- 响应头部(Response Headers):响应头部包含了与响应相关的一些元信息,以键值对的形式表示。常见的响应头部包括Content-Type(指定响应的数据类型)、Content-Length(指定响应体的长度)、Server(指定服务器信息)等。
- 空行:用于分隔响应头部和响应体。
- 响应体(Response Body):响应体是请求所期望获得的实体主体。响应体的格式和内容取决于响应头部中的Content-Type字段,比如可以是HTML、JSON、图片或者二进制数据等。
不是所有的HTTP响应都会包含响应体 ,比如204状态码表示成功但没有实体主体。而响应头部是可选的,至少需要一个状态行来表示响应的状态。具体的响应结构会根据实际需求和协议规范进行定义
5 案例:请求表单
html
<h4>get</h4>
<form action="http://httpbin.org/get" method="get">
<input type="text" name="username" value="mickey"><br>
<input type="text" name="password" value="123456"><br>
<input type="submit" value="提交">
</form>
<h4>post</h4>
<form action="http://httpbin.org/post" method="post">
<input type="text" name="username" value="mickey"><br>
<input type="text" name="password" value="123456"><br>
<input type="submit" value="提交">
</form>
打开之后点击按钮,使用Fillder抓包,查看http协议数据
-
post请求
-
get请求
6 HTTP状态码(响应码)
HTTP 响应码是服务器返回给客户端的一个三位数字状态码,用于表示请求的处理结果。以下是常见的HTTP响应码及其含义:
- 1xx:临时性响应,表示客户端继续请求即可完成。
- 100 Continue:服务端已接收到请求头,并且客户端应该继续发送请求主体(如果有的话)。
- 2xx:成功响应,表示服务器已成功理解请求并返回所请求的资源。
- 200 OK:请求已成功完成,响应包含所请求的资源。
- 201 Created:请求已被成功处理,并且一个新的资源已经被创建。
- 204 No Content:请求成功,但是响应不包含任何内容。
- 3xx:重定向,表示需要采取进一步的操作才能完成请求。
- 301 Moved Permanently:所请求的资源已永久移动到新的位置,客户端应该使用新的 URI 发起后续请求。
- 302 Found:所请求的资源暂时性移动到新的位置,客户端应该使用新的 URI 发起后续请求。
- 304 Not Modified:客户端已经缓存了资源,并且服务器确认它没有被修改,可以直接使用缓存的数据。
- 4xx:客户端错误,表示客户端发生了错误。
- 400 Bad Request:请求无效,可能是请求中包含无效的参数或语法错误。
- 401 Unauthorized:请求需要身份验证,客户端应该提供有效的凭据(如用户名和密码)。
- 403 Forbidden:服务器拒绝了请求,客户端没有访问资源的权限。
- 404 Not Found:所请求的资源不存在。
- 405 Method Not Allowed:方法不允许。这个状态码表示服务器已经理解了客户端发出的请求,但是不支持该请求方法。
- 例如,如果向服务器发送了一个使用POST方法的请求,但是服务器只允许使用GET方法,则服务器将返回405状态码。当您在网络请求中收到405状态码时,意味着您正在使用的请求方法不被服务器接受。您可以尝试使用其他适合的请求方法来处理您的请求,或者联系服务器的管理员以获得更多关于允许使用的请求方法的信息。
- 5xx:服务器错误,表示服务器在处理请求时发生了错误。
- 500 Internal Server Error:服务器遇到了一个意料之外的错误,无法完成请求。
- 502 Bad Gateway:服务器充当网关或代理时,从上游服务器接收到无效的响应。
- 503 Service Unavailable:服务器暂时无法处理请求,通常是由于服务器过载或正在进行维护。
HTTP响应码提供了一种标准化的方式来表示请求处理结果,帮助客户端和服务器进行通信,更好地协作和共同工作。
7 HTTP请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
8 HTTP工作原理
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是**HTTP 请求/响应的步骤**:
- 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
- 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
- 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
- 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
- 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
-
浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
-
解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
-
浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
-
服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
-
释放 TCP连接;
-
浏览器将该 html 文本并显示内容;
9 GET和POST请求的区别
GET和POST是HTTP协议中常用的两种请求方法,它们主要有以下几个区别:
- 数据传输方式 :GET方法通过URL参数传输数据,而POST方法通过请求体传输数据。在GET请求中,参数会附加在URL的末尾,以键值对的形式表示,例如:
http://example.com/user?id=123&name=John
。而在POST请求中,参数会放在请求体中,可以是表单数据、JSON数据等格式。 - 数据长度限制:由于GET方法将数据放在URL中,因此对数据的长度有限制。不同的浏览器和服务器都有对URL长度的限制,常见的限制值为2048个字节(2KB)。而POST方法没有固定的限制,可以传输更大量的数据。
- 安全性 :虽然HTTP请求本身是不安全的,但相对而言,POST方法比GET方法更安全。因为GET请求中的参数会被包含在URL中 ,容易被拦截和查看,而POST请求中的参数在请求体中进行传输,相对隐私性更高。
- 缓存处理:GET请求会被浏览器缓存,下次再次请求相同的URL时,浏览器可能直接从缓存中获取响应,而不发送请求到服务器。而POST请求不会被浏览器缓存,每次提交都会发送请求到服务器。
- 幂等性 :GET方法是幂等的,即无论进行多少次请求,结果都是相同的。而POST方法在每次请求时可能会有副作用,并非幂等。
根据实际需求,选择GET还是POST取决于数据的安全性、大小以及是否需要缓存处理等因素。通常情况下,GET方法适用于获取数据,而POST方法适用于提交数据。
物理层,数据链路层,网络层,传输层,会话层,表示层,应用层