Http协议详解

目录

定义

作用和特点

版本

组成

HTTP请求报文

请求行

 get请求

POST请求

HEAD请求

DELETE请求

OPTIONS请求

PUT请求

TRACE请求

请求头

请求头属性

常见请求头

Referer:表示这个请求是从哪个url跳过来的,通常百度去搜索淘宝网,那么进入淘宝网的请求报文中,Referer的值:www.baidu.com。如果直接访问就没有这个头。

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.com。如果直接访问就没有这个头。

常用于:防盗链。

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.net: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/htmlhtml格式
text/plain存文本格式
text/csscss格式
text/javascriptjs格式
image/gifgit图片格式
image/jpegjpg图片格式
image/pngpng图片格式
application/x-www-form-urlencodedPOST专用:普通表单提交默认方式,form表单数据被编码key/value格式传给服务器
application/jsonPOST专用:用来告诉服务器消息主体是序裂化后的JSON字符串
text/xmlPOST专用:发送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首部。 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值