admin 管理员组文章数量: 1086019
目录
定义
作用和特点
版本
组成
HTTP请求报文
请求行
get请求
POST请求
HEAD请求
DELETE请求
OPTIONS请求
PUT请求
TRACE请求
请求头
请求头属性
常见请求头
Referer:表示这个请求是从哪个url跳过来的,通常百度去搜索淘宝网,那么进入淘宝网的请求报文中,Referer的值:www.baidu。如果直接访问就没有这个头。
HTTP响应报文
响应行
状态码
由3位数字组成,第一个数字定义响应类型。
Content-Type详解
扩展
定义
HTTP(HyperText transfer Protocol)是互联网上应用广泛的一种网络协议,又称为超文本传输协议。所以的WWW文件都必须遵守这个标准。设计HTTP起初目的是提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelsol构思了一种通过计算机处理文本信息的方法。并称为超文本,这成为HTTP超文本传输协议标准结构的发展根基。并将RFC 2616定义为HTTP 1.1。
作用和特点
HTTP是一种客户端和服务端请求和应答的标准(TCP)。客户端是终端用户。服务端是网站。通过WEB浏览器、网络爬虫或其他工具,客户端发起一个服务器上指定端口的HTTP请求。我们叫客户端为用户代理(user agent)。应答的服务器会存储一些资源,如HTML文件和图像。我们叫这个应答服务器为源服务器。在用户代理和源服务器中间可能存在多个中间层。如代理,网关,或隧道。尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它或(基于)它支持的层。事实上,HTTP可以在任何其他互联网协议上,或在其他网络上实现。HTTP只假定(其下层协议提供)可靠传输,任何能够提供这个保证的协议都可以被其使用。
通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口的TCP连接。HTTP则在那个端口监听客户端发送过来的请求。一旦收到请求·,服务器会向客户端发回一个状态行, 比如“HTTP/1.1 200 OK”,和消息,消息的消息体可能是请求的文件、错误信息、或其他一些信息。HTTP使用TCP而不是UDP的原因在于一个网页必须传送很多数据,而TCP协议提供了传输控制,按顺序组织数据和错误纠正。
通过HTTP或HTTPS协议请求的资源由统一资源标识符(URLs)来标识。
1. 基于请求/响应模型的协议。请求和响应必须成对,先请求后响应。
2.默认端口:80
3.简单快速: 客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
4.灵活: HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加于标记
5.无连接: 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
6.无状态:HTTP协议是无状态协议,无状态是指协议对事务处理没有记忆功能。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
版本
HTTP/1.0,发送请求,创建一次连接,获取一个web资源,连接断开。
HTTP/1.1,发送一次请求,创建一次连接,获取多个web资源,连接断开。
组成
HTTP协议是由HTTP请求和响应组成,当在浏览器访问一个网址是,你的浏览器就会将你的请求封装成一个HTTP请求发送到服务器站点,服务器接收到请求后就会组织响应数据封装成一个HTTP响应返回给浏览器。即没有请求就没有响应。
HTTP请求包括:请求行、请求头,请求体
HTTP响应包括:响应行、响应头、响应体
HTTP请求报文
3部分组成:请求行、请求头,请求体
请求行
例如:POST /chapter17/user.html HTTP/1.1
格式:请求方式 资源路径 协议/版本
请求行必须在http请求格式的第一行。
get请求
将请求参数追加到url后面,不安全
url长度限制get请求方式数据的大小
没有请求体
一般HTTP请求大多是GET。
POST请求
请求参数在请求体处,较安全
请求数据大小不显示
只有表单设置为method = post才是POST请求,其他是get请求。
HEAD请求
HEAD跟GET相似,不过服务端接收到HEAD请求时只返回响应头,不发送响应内容。所以,如果只需要查看某个页面的状态时,用HEAD更高效,因为省去了传输页面内容的时间。
DELETE请求
删除某一个资源。
OPTIONS请求
用于获取当前URL所支持的方法。若请求成功,会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。
PUT请求
将一个资源存放到指定位置。
本资来说,PUT和POST极为相似。都是向服务器发送数据。但PUT请求通常是指定资源的存放位置,而POST的数据存放位置由服务器自己决定。
TRACE请求
回显服务器收到的请求,主要用于测试或诊断。
请求头
请求头从第二行开始,到第一个空格结束。请求头和请求体之间存在一个空格(如下)
POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1
User-Agent: Fiddler
Host: 39.108.107.149:8080
Content-Length: 11
name=城市
请求头通常以键值对{key:value}方式传递数据。
key为规范固定值。
value为key对应的取值,通常是一个值,可能是一组
请求头属性
常见请求头
Referer:表示这个请求是从哪个url跳过来的,通常百度去搜索淘宝网,那么进入淘宝网的请求报文中,Referer的值:www.baidu。如果直接访问就没有这个头。
常用于:防盗链。
Referrer Policy: no-referrer-when-downgrade
Accept:告诉服务器,该请求支持所能支持的响应数据类型,专业术语叫MIME类型。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
MIME格式:大类型/小类型[;参数]
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
if-Modified-Since:浏览器通知服务器,本地缓存的最后变更时间。与另一个响应头组合控制浏览器页面缓存。
Cookie: 客户端的Cookie就是通过这个属性传给服务器。
Cookie: JSESSIONID=15982C27F7507C7FDAF0F97161F634B5
User-Agent: 浏览器通知服务器,客户端浏览器与操作系统相关信息。
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Connection:表示客户端与服务器连接类型;Keep-Alive表示持久连接,close表示已关闭。
Connection: keep-alive
Host:请求的服务器主机名。
Host: sczpkj.f3322:3000
Content-Length:请求体的长度。
POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1
User-Agent: Fiddler
Host: 39.108.107.149:8080
Content-Length: 11
name=城市
Content-Type:请求的与实体对应的MIME信息,如果post请求,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码。
Content-Type: application/x-www-form-urlencoded
Accpet-Encoding:浏览器通知服务器,浏览器支持的数据压缩格式。如GZIP压缩
Accept-Encoding: gzip, deflate
Accpet-Language:浏览器通知服务器,浏览器支持的语言。各国语言。
Accept-Language: zh-CN,zh;q=0.9
Cache-Control:指定请求和响应遵循的缓存机制。
对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的。
Cache-Control: no-cache
更多请求属性参考文章:HTTP请求头大全 - 常用参考表对照表 - 脚本之家在线工具
HTTP响应报文
HTTP的响应报文也由三部分组成(响应行+响应头+响应体)
实例:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=E1352C5CCEAD7EA9A6F8DA253395781C; Path=/vk
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 26 Sep 2018 03:24:59 GMT
//此处有空格
1dd0
{"sessionToken":null,"code":"1","msg":null,"service":"iModelServiceImpl","method":"findModelByType","key":null,"paras":{},"result":{"pageInfo":{"pageNum":1,"numPerPage":20,"totalCount":28,"pageNumShown":2,"startNum":0,"endNum":20},"list":[{"id":1268735016960,"vkId":1098450468864,"name":"城市","status":"1","delStatus":"2","viewIndex":0,"remark":"","dataArea":"","tvName":"城市1.xlsx","resultLang":"","setLocal":"2","c":0,"cn":"","ct":1535351516000,"l":null,"ln":null,"ltt":1535351516000,"fullMapping":"1","vkdbName":"AQI城市","itemId":16694810509312},{"id":3843924426752,"vkId":84077923270656,"name":"AQI指数","status":"1","delStatus":"2","viewIndex":0,"remark":"","dataArea":"","tvName":"aqi_table","resultLang":"","setLocal":"2","c":0,"cn":"","ct":1534668644000,"l":null,"ln":null,"ltt":1534668644000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":10106414563328},{"id":4039492239360,"vkId":84077923270656,"name":"市场广告占有率","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":"advertising_share","resultLang":null,"setLocal":"2","c":null,"cn":null,"ct":1534668690000,"l":null,"ln":null,"ltt":1534668690000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":10106414563328},{"id":4194551463936,"vkId":84077923270656,"name":"注册客户增长趋势","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":"a_registered_customers_growth_trend","resultLang":null,"setLocal":"2","c":null,"cn":null,"ct":1534668727000,"l":null,"ln":null,"ltt":1534668727000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":10106414563328},{"id":4435954630656,"vkId":84077923270656,"name":"新业务增长分析","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":"a_new_business_growth_analysis","resultLang":null,"setLocal":"2","c":null,"cn":null,"ct":1534668785000,"l":null,"ln":null,"ltt":1534668785000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":10106414563328},{"id":4591269707776,"vkId":84077923270656,"name":"电商公司交易趋势","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":"a_electricity_supplier_trading_trend","resultLang":null,"setLocal":"2","c":null,"cn":null,"ct":1534668822000,"l":null,"ln":null,"ltt":1534668822000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":10106414563328},{"id":4742163988480,"vkId":84077923270656,"name":"预算开销对比","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":"a_budget_overhead_comparison","resultLang":null,"setLocal":"2","c":null,"cn":null,"ct":1534668858000,"l":null,"ln":null,"ltt":1534668858000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":10106414563328},{"id":4885466578944,"vkId":84077923270656,"name":"销售瀑布","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":"a_selling_waterfalls","resultLang":null,"setLocal":"2","c":null,"cn":null,"ct":1534668892000,"l":null,"ln":null,"ltt":1534668892000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":10106414563328},{"id":5021173284864,"vkId":84077923270656,"name":"自定义","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":null,"resultLang":"select * from zyy_emp","setLocal":"2","c":null,"cn":null,"ct":1535442352000,"l":null,"ln":null,"ltt":1535442352000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":236090615136256},{"id":5831709949952,"vkId":84077923270656,"name":"zy_test","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":"zy_test","resultLang":null,"setLocal":"2","c":null,"cn":null,"ct":1535874061000,"l":null,"ln":null,"ltt":1535874061000,"fullMapping":"1","vkdbName":"电商交易分析","itemId":16694810509312},{"id":6901450407936,"vkId":5891063545856,"name":"zy-stu","status":"1","delStatus":"2","viewIndex":0,"remark":"","dataArea":"","tvName":"zy-test.xlsx","resultLang":"","setLocal":"2","c":0,"cn":"","ct":1534676773000,"l":null,"ln":null,"ltt":1534676773000,"fullMapping":"1","vkdbName":"四川省2018年电力总分析","itemId":16694810509312},{"id":11079988019200,"vkId":84077923270656,"name":"zy-自定义sql-903","status":"1","delStatus":"2","viewIndex":0,"remark":"","dataArea":"","tvName":"","resultLang":"SELECT * from zy_test t ;","setLocal":"2","c":0,"cn":"","ct":1535944882000,"l":null,"ln":null,"ltt":1535944882000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":16694810509312},{"id":12502322642944,"vkId":2084980129792,"name":"zy-stu-excel-819","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":"stu.xlsx","resultLang":null,"setLocal":"2","c":null,"cn":null,"ct":1534680721000,"l":null,"ln":null,"ltt":1534680721000,"fullMapping":"1","vkdbName":"2018年计算机学员信息","itemId":16694810509312},{"id":24037057101824,"vkId":22646536273920,"name":"学生信息","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":"01.xlsx","resultLang":null,"setLocal":"2","c":null,"cn":null,"ct":1535080921000,"l":null,"ln":null,"ltt":1535080921000,"fullMapping":"2","vkdbName":"2018年软件工程学生基本信息","itemId":16694810509312},{"id":28477864542208,"vkId":84077923270656,"name":"自定义sql_3","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":null,"resultLang":"select d.*,e.*\nfrom zyy_dept d ,zyy_emp e\nwhere d.deptno = e.deptno","setLocal":"2","c":null,"cn":null,"ct":1535358003000,"l":null,"ln":null,"ltt":1535358003000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":236090615136256},{"id":30036178501632,"vkId":42125932625920,"name":"lllll","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":"t_1","resultLang":null,"setLocal":"2","c":null,"cn":null,"ct":1534753815000,"l":null,"ln":null,"ltt":1534753815000,"fullMapping":"1","vkdbName":"2018年风力分析","itemId":28899207544832},{"id":52815678406656,"vkId":84077923270656,"name":"kfeng_test_mysql","status":"1","delStatus":"2","viewIndex":0,"remark":"","dataArea":"","tvName":"sys_dictonary","resultLang":"","setLocal":"1","c":0,"cn":"","ct":1535978623000,"l":null,"ln":null,"ltt":1535978623000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":16694810509312},{"id":236320945340416,"vkId":84077923270656,"name":"单表本地化存储","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":"a_budget_overhead_comparison","resultLang":null,"setLocal":"1","c":null,"cn":null,"ct":1534903707000,"l":null,"ln":null,"ltt":1534903707000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":236090615136256},{"id":236841471049728,"vkId":236458682089472,"name":"excel本地化存储","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":"学院专业信息表1.xlsx","resultLang":null,"setLocal":"1","c":null,"cn":null,"ct":1534903831000,"l":null,"ln":null,"ltt":1534903831000,"fullMapping":"2","vkdbName":"学员信息表","itemId":236090615136256},{"id":240781818331136,"vkId":84077923270656,"name":"自定义sql本地化存储","status":"1","delStatus":"2","viewIndex":null,"remark":null,"dataArea":null,"tvName":null,"resultLang":"select d.*,e.*\nfrom zyy_dept d,zyy_emp e\nwhere d.deptno = e.deptno","setLocal":"1","c":null,"cn":null,"ct":1534904771000,"l":null,"ln":null,"ltt":1534904771000,"fullMapping":"2","vkdbName":"电商交易分析","itemId":236090615136256}],"businid":null},"page":null,"appName":null,"success":true,"model":"DEFAULT","files":null,"fail":false,"request":null,"response":null}
0
响应行
报文协议及版本,如
HTTP/1.1 200 OK
状态码
由3位数字组成,第一个数字定义响应类型。
1XX: 指示信息,表示请求已接收,继续处理
2XX: 成功,表示请求已被成功接受,处理。
200 OK: 客户端请求成功。
204 No Content: 无内容。服务器成功处理,但未返回内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面。
206 Partial Content: 服务器已经完成了部分GET请求(客户端进行了范围请求)。响应报文中包含Content-Range指定范围的实体内容.
3xx:重定向
301 Moved Permanently: 永久重定向,表示请求资源已经永久搬到其他位置。
302 Found: 临时重定向,表示请求资源临时搬到其他位置。
303 See Other: 临时重定向,应使用GET定向获取请求资源,303和302区别是303客户端应该使用GET请求。
307 Temporary Redirect :临时重定向,和302相同含义。POST不会变成GET.
304 Not Modified:表示客户端发送附带条件的请求(GET方法请求报文中的IF…)时,条件不满足。返回304时,不包含任何响应主体。虽然304被划分在3XX,但和重定向一毛钱关系都没有
4xx: 客户端错误
400 Bad Request: 客户端请求语法错误,服务器无法理解。
401 Unauthorized: 请求未经授权,必须和WWW-Authenticate报头域一起使用。
403 Forbidden:服务器接收请求,但拒绝访问服务。
404 Not Found :请求资源不存在。如错误的url
415 Unsupported media type:不支持的媒体类型
5xx :服务器错误,服务器未能实现合法的请求。
500 Internal Server Error: 服务器发生不可预期的错误。
503 Server Unavailable: 服务器当前不能处理客户端请求,一段时间后可能恢复正常。
响应头
参考文章: HTTP请求头大全 - 常用参考表对照表 - 脚本之家在线工具
Content-Type详解
Content-Type | 解释 |
---|---|
text/html | html格式 |
text/plain | 存文本格式 |
text/css | css格式 |
text/javascript | js格式 |
image/gif | git图片格式 |
image/jpeg | jpg图片格式 |
image/png | png图片格式 |
application/x-www-form-urlencoded | POST专用:普通表单提交默认方式,form表单数据被编码key/value格式传给服务器 |
application/json | POST专用:用来告诉服务器消息主体是序裂化后的JSON字符串 |
text/xml | POST专用:发送xml数据 |
multipart/form-data | 下面讲解 |
multipart/form-data
常见的POST数据提交方式,我们使用表单上传文件时,必须让form的enctyped等于这个值。
POST http://39.108.107.149:8080/vk/app/rest/ddp/iDataSourcesBaseService/file HTTP/1.1
Content-Type: multipart/form-data; boundary=--------------------------629236571647111133881449
cache-control: no-cache
Postman-Token: 2146b4b3-2d30-469c-bbcd-fbc4693934d9
User-Agent: PostmanRuntime/7.1.1
Accept: */*
Host: 39.108.107.149:8080
cookie: JSESSIONID=6CD80B7028062D9190717CEE001C3194
accept-encoding: gzip, deflate
content-length: 435
Connection: keep-alive
----------------------------629236571647111133881449
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
test upload
----------------------------629236571647111133881449
Content-Disposition: form-data; name="extCode"
test
----------------------------629236571647111133881449
Content-Disposition: form-data; name="extId"
3306
----------------------------629236571647111133881449-- //结束标识
首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了数据是以 mutipart/form-data 来编码,本次请求的 boundary 是什么内容。
消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着内容描述信息,然后是回车,最后是最后是字段具体内容(文本或二进制),如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。
上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段原生 form 表单也只支持这两种方式。但是随着越来越多的 Web 站点,尤其是 WebApp,全部使用 Ajax 进行数据交互之后,我们完全可以定义新的数据提交方式,给开发带来更多便利。
扩展
传输文件过大怎么办
1.对文件进行压缩,减少文件大小,那压缩和解压流程怎么实现?首先服务端能支持文件压缩功能,其次浏览器能够针对被压缩的文件进行解压缩。浏览器可以指定Accept-Encoding来高速服务器,目前能支持的编码类型Accept-Encoding:gzip,deflate ,那么服务端会根据支持的编码类型,选择合适的类型进行压缩。常见的编码方式有:gzip/deflate.
2. 分割传输,在传输大容量数据时,可以把数据分割成多块,然后让浏览器逐步显示页面。这种把实体主体分块功能称为分块传输编码(Chunked Transfer Coding)。
每次请求都要创建连接吗?
在http/1.0,每次http通信,都需要做一次tcp的连接,而三次握手需要进行3次握手,这种通信方式会增加通信量的开销。
所以HTTP/1.1中改用了持久连接,就是在一次连接建立后,只需要客户端或服务端没有明确提出断开连接,那么这个tcp连接会一直保持连接状态,持久连接的一个最大好处:大大减少了连接建立以及关闭时延。HTTP1.1中有一个Transport段。会携带一个Connection:Keep-Alice,表示持久连接。
HTTP/1.1持久连接默认是激活的,除非特别指明,否则HTTP/1.1假定所有连接都是持久的,要在处理完事务结束后将连接关闭,HTTP/1.1应用程序必须向报文中显示的添加一个Connection: close首部。
版权声明:本文标题:Http协议详解 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1737956526a1901339.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论