理解HTTP协议
文章目录
一、HTTP简介
HTTP:Hyper Text Transfer Protocol(超文本传输协议)
用于:从万维网服务器传输超文本到浏览器的传送协议
基于:TCP/IP协议
属于:应用层
超文本:包含指向其他文档的链接的文本,万维网是一个分布式的超媒体(hypermedia)系统,它是超文本系统的扩充
二、HTTP主要特点
简单快速
客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
灵活
HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态
无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
三、HTTP传输
客户向服务器请求服务时,只需传送请求方法和路径
1.请求路径
URI:uniform resource identifier(统一资源标识符)
URL:uniform resource locator(统一资源定位符)
- URL一般由三部组成:
①协议
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等
URN:uniform resource name(统一资源命名)
三者关系:
- URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。
- 在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。相反的是,URL类可以打开一个到达资源的流。
2.请求方法
方法 | 意义 |
---|---|
OPTION | 允许客户端查看服务器的一些选项的信息 |
GET | 请求读取由URL所标志的信息 |
HEAD | 请求读取由URL所标志的信息的首部 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中 |
PUT | 在指明的URL下存储一个文档 |
DELETE | 删除知名URL所标志的资源 |
TRACE | 用来进行环回测试的请求报文 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
GET和POST的区别:
- GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.(POST也可通过拼接URL传递数据)
- GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
- GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
- GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
四、HTTP报文结构
HTTP有两类报文:
-
请求报文:从客户向服务器发送请求报文
-
响应报文:从服务器到客户的回答
HTTP请求报文和响应报文都是三部分组成,区别就是开始行不同:
- 开始行:用于区分是请求报文还是响应报文,在请求报文中叫请求行,在响应报文中叫状态行
- 首部行:用来说明浏览器、服务器或报文主体的一些信息,注意整个首部行结束时,还有一空行将首部行和后面的实体主体分开
- 实体主体:在请求报文中可以添加任意的其他数据,在响应报文中是响应正文,这些都不是必须的
请求报文实例:
GET /dir/index.html HTTP/1.1 ----->请求行
Host: www.xyz.com ----->首部开始给出了主机的域名
Connection: close ---->告诉服务器发送完请求可以释放连接
User-Agent: Mozilla/5.0 ---->用户代理为FireFox浏览器
Accept-Language: cn ---->用户希望优先得到中文版本文档
---->空行
---->实体主体为空
响应报文实例:
HTTP/1.1 200 OK ---->状态行:http版本+响应码+状态信息
Date: Fri, 22 May 2009 06:07:21 GMT ---->Date:生成响应的日期和时间
Content-Type: application/json ---->MIME类型为json
---->空行
{
“id":10,
“name”: zhangsan ---->主体:响应的json内容
}
五、HTTP状态码
1xx 表示通知信息,如请求收到了或正在进行处理
2xx 表示成功,如接受或知道了
3xx 表示重定向,入药完成请求还必须采取进一步行动
4xx 表示客户的差错,如请求中有错误的语法或不能完成
5xx 表示服务器的差错,如服务器失效或无法完成请求
常见状态码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
六、HTTP工作原理
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是 HTTP 请求/响应的步骤:
-
客户端连接到Web服务器(建立TCP连接)
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
-
发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成
-
服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
-
释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
-
客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
七、补充
1.MIME Content-Type类型
MIME(通用物联网邮件扩充)标准规定Content-Type说明必须含有两个标识符,即内容类型和子类型,中间用”/“分开
举例说明:
内容类型 | 子类型举例 | 说明 |
---|---|---|
text(文本) | plain、html、xml、css | 不同格式的文本 |
image(图像) | gif、jpeg、tiff | 不同格式的文本 |
audio(音频) | basic、mpeg、mp4 | 可听见的声音 |
video(视频) | mpeg、mp4、quicktime | 不同格式影片 |
mocel(模型) | vrm | 3D模型 |
application(应用) | poctet-stream、pdf、javascript、zip | 不同应用程序产生的数据 |
message(报文) | hhtp、rfc822 | 封装的报文 |
multipart(多部分) | mixed、alternative、parallel、digest | 多种类型的组合 |
2.HTTP请求体body的常见几种数据格式
application/x-www-form-urlencoded:
以键值对的数据格式提交;当action为post时,浏览器将form数据封装到http body中,然后发送server
multipart/form-data:
以表单形式提交,主要用于上传文件
postman中的raw:
可以上传任意格式的文本
-
ext,则请求头是:text/plain
-
JavaScript,则请求头是:application/javascript
-
json,则请求头是:application/json
-
HTML,则请求头是:text/html
-
application/xml,则请求头是:application/xml
binary:
相当于Content-Type:application/octet-stream,从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件