网络原理1.HTTP协议详解

一. 什么是HTTP协议

  1. HTTP协议是Hypertext Transfer Protocol(超文本传输协议)的缩写
  2. 主要用于World Wide Web(万维网)与浏览器之间传输超文本数据
  3. 可以传输各种格式的数据,例如图片,文本,附件等等
  4. 基于TCP/IP通信协议来传输数据

二. 工作方式

http_request_response.png

主要方式客户端-服务器模式

  1. 首先客户端发起一个http请求(request)报文
  2. 服务器回复一个响应(response)报文

三. URI和URL

  1. URI(Uniform Resource Identifier)统一资源标识符
  2. URL(Uniform Resource Locator)统一资源定位符
  3. URL是一种特殊的URI
  4. URL中包含了资源的请求方式和获取方法,而URI可以不包含
  5. URL的组成部分:protocol://hostname[:port]/path
    • protocol:协议,例如http,ftp等等
    • hostname:主机名,例如IP端口或者域名
    • port:端口,可以为空
    • path:路径,使用"/"分隔开
    • 例如: http://www.baidu.com/

四. 请求方式

HTTP常用的请求方式有五种

  1. GET, 主要用于获取资源
  2. POST, 主要用于添加资源
  3. PUT, 主要用于更新资源
  4. DELETE, 主要用于删除资源
  5. OPTIONS, 和GET方式类似, 主要用于获取资源支持的HTTP请求方法
  6. GET和POST的区别:
    • 协议层面只有语义上的不同
    • 浏览器
      • GET方式把参数拼接在URL后面,并且有长度限制
      • POST方式把参数放在body中,理论上没有长度限制

五. 报文结构

HTTP报文主要有request和response两种

1.request报文结构

http request
  1. 请求行(request line): 包括请求方法,资源的URL,以及HTTP协议版本
  2. 请求头部(header): 包括请求服务器所需要的附加信息
  3. 空行(CRLF):请求头部后面必须是空行,即使请求数据为空,也要有空行
  4. 请求数据(body):也称为请求实体,可以添加任意类型的数据

2.response报文结构

http response
  1. 状态行(status line): 包括HTTP协议版本,状态码和状态消息组成
  2. 消息报头(header): 包括返回客户端的一些附件信息
  3. 空行(CRLF): 必须有空行
  4. 响应正文(body): 服务器返回给客户端的数据,可以是任意类型的数据

六.HTTP请求响应DEMO

1. GET方式

Request请求
GET /test?name=ygxing HTTP/1.1 
Connection: keep-alive 
Host: www.client.com 
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_151) 

Response请求
HTTP/1.1 200  
Server: nginx/1.12.2 
Date: Wed, 14 Mar 2018 01:33:03 GMT 
Content-Type: application/json;charset=UTF-8 
Content-Length: 44 
Proxy-Connection: Keep-alive 
 
{"status":1,"message":"success","data":null} 

2.POST方式

Request请求
POST /test/ HTTP/1.1 
Connection: keep-alive 
Content-Type: application/json 
Accept: application/json 
Content-Length: 25 
Host: www.client.com 
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_151) 
 
{"reports":["124","678"]} 
Response请求
HTTP/1.1 200  
Server: nginx/1.12.2 
Date: Wed, 14 Mar 2018 00:52:07 GMT 
Content-Type: application/json;charset=UTF-8 
Content-Length: 44 
Proxy-Connection: Keep-alive 
 
{"status":1,"message":"success","data":null} 

3.OPTIONS方式

Request请求
GET /test?name=ygxing HTTP/1.1 
Connection: keep-alive 
Host: www.client.com 
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_151) 

Response请求
HTTP/1.1 200  
Server: nginx/1.12.2 
Date: Wed, 14 Mar 2018 00:55:21 GMT 
Content-Length: 0 
Allow: GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS 
Proxy-Connection: Keep-alive

七.常用的HTTP消息头

消息头分为通用头(请求和响应共有的头部),请求头和响应头

1. 通用头

协议头 作用 示例
Cache-Control 指定请求和响应需要遵循的缓存机制 Cache-Control:public,max-age=3600000
Connection 是否需要持久化连接 Connnection:keep-alive或者Connection:Upgrade
Date 消息发送的GMT时间 Date: Tue, 04 Jun 2019 10:33:56 GMT
Pragma HTTP1.0协议中,该首部依赖于具体实现,向后兼容只支持缓存 Pragma:no-cache
Proxy-Authorization 向代理服务器进行身份认证 Proxy-Authorization:Bearer 123456
Transfer-Encoding 内容编码方式,可以和Content-Encoding配合使用,也可以分块传输 Transfer-Encoding:chunked
Upgrade 要求客户端或者服务器升级到另一个高版本协议 Upgrade:websocket
Via 主要由代理服务器操作,表示请求或者响应经过了哪些代理服务器 Via: 1.0 fred, 1.1 p.example.net
Warning 警告,其中会包含错误码,实体内容可能存在错误 Warning: 112 - "cache down" "Wed, 21 Oct 2015 07:28:00 GMT"

2. 请求头

协议头 作用 示例
Accept 客户端可以接受的响应内容类型 Accept:text/html
Accept-Charset 客户端可接受的字符编码方式 Accept-Charset:utf-8
Accept-Control-Request-Headers 预检请求,告诉服务器真正请求使用的请求头 Access-Control-Request-Headers: X-Custom-Header, Content-Type
Accept-Control-Request-Method 预检请求,告诉服务器真正请求使用的方法 Access-Control-Request-Method: POST
Accept-Encoding 客户端可接受的内容编码方式,可以和Content-Encoding配合使用 Accept-Encoding:deflate,gzip;q=1.0
Accept-Language 客户端可接受的响应内容语言列表 Accept-Language:zh-cn
Authorization 客户端携带的认证信息 Bearer:xxxxxx
Cookie 客户端携带的Cookie数据,使用了session的话会携带一个SessionID Cookie:jsessionid=xxxx
Content-Security-Policy 资源安全策略,可以控制资源的访问安全 Content-Security-Policy: default-src https:
Content-Type 请求体的MIME类型 Content-Type:application/json
Expect 客户端要求服务器做出的特定的行为 Except:100-continue
Host 请求的服务器的IP和端口 Host:127.0.0.1:8080
If-Match 与ETag配合使用,当客户端提供的实体与服务器响应Etag相匹配时,才进行相应的操作,主要用于PUT请求 If-Match:123456
If-Modified-Since 配合ETag使用,如果资源在指定时间之前未经修改,返回一个没有body的304响应,如果资源在指定时间之前被修改,才会回复一个状态码为200并且携带资源的响应 If-Modified-Since:Wed, 05 Jun 2019 03:03:25 GMT
If-None-Match 配合ETag使用,如果资源ETag不匹配,服务器才返回请求的资源,响应码为200,如果资源ETag匹配,服务器响应码为304 If-None-Match:123456
If-Range 规定了Range字段生效的条件,满足条件时,服务器响应码为206,返回部分资源,不满足条件时,服务器响应码为200,返回完整资源 If-Range:Wed, 21 Oct 2015 07:28:00 GMT
If-Unmodified-Since 配合ETag使用,如果资源从指定时间起未被修改,那么服务器返回完整资源 If-Unmodified-Since: Wed, 21 Oct 2015 07:28:00 GMT
Max-Forwards 限制请求消息可以被网关转发的次数 Max-Forwards: 10
Origin 请求的来源,只包含服务器的Host,不包含路径 Origin: http://www.client.com
Range 配合If-Range使用,满足If-Range条件时,返回部分资源 Range:bytes=500-900
Referer 浏览器所访问的前一个页面 Referer:http://www.client.com/index.html
TE 指定用户代理希望使用的传输编码类型 TE: trailers, deflate;q=0.5
User-Agent 浏览器的身份标识字符串 User-Agent:Mozilla/...
X-Requested-With 判断客户端的请求是ajax还是其他请求 X-Requested-With:"XMLHttpRequest"

3. 响应头

协议头 作用 示例
Access-Control-Allow-Credentials 主要用户解决跨域问题,允许浏览器发送验证信息,例如Cookie,Authorization Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers 用于预检请求,返回的是正式请求有哪些头部 Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Alllow-Methods 用于预检请求,返回服务器支持的方法列表 Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Origin 允许哪些Origin跨域共享资源 Access-Control-Allow-Origin:*
Access-Control-Expose-Headers 列出服务器支持的非简单响应头 Access-Control-Expose-Headers: Content-Length, X-Custom-Header
Accept-Patch 指定服务器所支持的文档补丁格式 Accept-Patch:text/properties;charset=utf-8
Accept-Range 表示自身支持的请求范围 Accept-Ranges: bytes
Age 响应对象在代理服务器缓存的时间(单位:秒) Age: 600
Allow 资源支持的请求方式 Allow:GET,POST,HEAD
Content-Disposition 浏览器对于响应资源的动作,下载或者打开 Content-Disposition: attachment; filename="filename.jpg"
Content-Encoding 响应数据的编码方式,客户端通过相应的方式解码,才能获取在Content-Type中标识的媒体类型 Content-Encoding: gzip
Content-Language 响应内容所使用的语言 Content-Language:zh-cn,en-US
Content-Length 响应数据的大小(单位字节) Content-Length:200
Content-Location 响应资源的候选位置 Content-Location:/test/
Content-Range 响应资源在整个文件中的位置 Content-Range: bytes 200-1000/67589
Content-Type 响应资源的类型 Content-Type: text/html; charset=utf-8
ETag 响应资源版本的标识,主要用于缓存 ETag: "123456"
Expires 指定资源缓存超时日期 Expires: Wed, 21 Oct 2015 07:28:00 GMT
Strict-Transport-Security 浏览器跳转到https Strict-Transport-Security: max-age=31536000; includeSubDomains
Last-Modified 上次修改时间 Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
Location 浏览器自动重定向到Location对应的URL中 Location:http://server.com/index.html
P3P 隐私策略,可以解决cookie跨域问题
Public-Key-Pins 服务端安全协议证书的公钥,降低伪造证书攻击的风险 Public-Key-Pins:pin-sha256="cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs="
Retry-After 用户代理(浏览器)需要等待多久继续重试 Retry-After: Wed, 21 Oct 2015 07:28:00 GMT
Server 服务器名称 Server:nginx/12.0
Set-Cookie 设置HTTP Cookie Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/
Status 服务器端状态码 Status:200 OK
Trailer 分块消息添加的额外信息,例如数字签名,消息状态 Trailer: Expires

八.常用的HTTP错误码

  • 状态码有三位数字组成
  • 1xx表示请求已经收到,需要后续处理
  • 2xx表示服务器成功处理了请求
  • 3xx表示客户端需要进一步操作才能完成请求
  • 4xx表示客户端请求错误
  • 5xx表示服务器错误

1xx:请求已经收到,需要后续处理

状态码 消息 描述
100 Continue 客户端应该继续发送请求, 服务器必须在请求完成后向客户端发送一个最终响应
101 Switching Protocols 服务器已经理解了客户端的请求,
并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求,
发送完这个响应之后, 服务器会切换到Upgrade消息头中定义的协议
102 Processing 服务器将继续进行处理

2xx:服务器成功处理了请求

状态码 消息 描述
200 OK 请求已经成功
201 Created 请求已经被实现
202 Accepted 请求已经被接收,但还没有开始处理
203 Non-Authoritative Information 服务器已经成功处理了请求, 但是返回的实体头部元信息不是在原始服务器上有效的确定集合
204 No Content 服务器成功处理了请求, 但不需要返回任何实体内容
205 Reset Content 服务器成功处理了请求, 但不需要返回任何实体内容, 但与204不同之处在于该返回码要求请求者重置文档视图
206 Partial Content 服务器已经成功处理了部分GET请求
207 Multi-Status 表示之后的消息将是一个XML消息, 并且可能按照之前子请求数量的不同, 包含一系列独立的响应代码

3xx:客户端需要进一步操作才能完成请求

状态码 消息 描述
300 Multiple Choices 被请求的资源有一系列可供选择的回馈信息, 客户端可以自行选择一个首选的地址进行重定向
301 Moved Permanently 被请求的资源已经被永久移动到新位置
302 Move Temporarily 请求的资源历史才能够不同的URI响应请求
303 See Other 对应的请求的响应可以在另一个URI上被找到
304 Not Modified 如果客户端发送了一个带条件的GET请求, 自上次访问以来文档的内容没有被修改, 那么服务器返回这个状态码
305 Use Proxy 被请求的资源必须通过制定的代理才能访问
306 Switch Proxy 在最新的规范中, 306状态码已经不再被使用
307 Temporary Redirect 请求的资源临时从不同的URI响应请求

4xx:客户端请求错误

状态码 消息 描述
400 Bad Request 语义有误, 服务器无法理解, 除非进行修改, 否则客户端不应该重复提交该请求
401 Unauthorized 当前请求需要用户验证
402 Payment Required 预留状态码
403 Forbidden 服务器已经理解请求, 但是拒绝处理
404 Not Found 请求失败 请求的资源在服务器上找不到
405 Method Not Allowed 请求行中的请求方法不能被用于请求相应的资源
406 Not Acceptable 请求的资源内容无法满足请求头中的条件, 因而无法生成响应实体
407 Proxy Authentication Required 与401响应类似, 只是客户端必须在代理服务器上进行身份验证
408 Request Timeout 请求超时
409 Conflict 和被请求的资源的当前状态存在冲突, 请求无法完成
410 Gone 被请求的资源在服务器上已经不再可用, 而且没有任何已知的转发地址
411 Length Required 服务器拒绝在没有定义Content-Length头的情况下接受请求
412 Precondition Failed 服务器在验证请求的头字段给出了先决条件,请求没有满足其中的一个或者多个
413 Request Entity Too Large 请求的实体数据大小超过了服务器能够处理的范围
414 Request-URI Too Long 请求的URI长度超过了服务器能够解释的长度
415 Unsupported Media Type 请求提交的实体不是服务器支持的格式
416 Requested Range Not Satisfiable 请求中包含了Range请求头, 并且Range中指定的任何数据范围都与当前资源的可用范围不重合, 同时请求头中没有定义If-Range请求头
417 Expectation Failed 请求头中Expect中指定的预期内容没有被服务器满足
421 Too Many Connections 从当前客户端所在的IP地址到服务器的连接数已经超过了服务器许可的最大范围
422 Unprocessable Entity 请求格式正确, 但是语义错误
423 Locked 当前资源被锁定
424 Failed Dependency 由于之前的某个请求发生错误, 导致当前请求失败
425 Unordered Collection 还没有投入使用
426 Upgrade Required 客户端应该切换到TLS/1.0
449 Retry With 由微软扩展, 代表请求应该在完成适当的操作后重试
451 该请求因法律原因不可用

5xx:服务器错误

状态码 消息 描述
500 Internal Server Error 服务器遇到了一个未曾预料的状况, 导致它无法完成对请求的处理
501 Not Implemented 服务器不支持请求所需要的某个功能
502 Bad Gateway 作为网关或者代理的服务器执行请求时, 从上游服务器收到无效的响应
503 Service Unavailable 服务器临时维护或者过载, 服务器当前无法处理请求
504 Gateway Timeout 网关或代理服务器尝试执行请求时, 未能及时从上游服务器(URI标识出来的服务器, 例如HTTP, FTP, LDAP)或者辅助服务器(例如DNS)收到响应
505 HTTP Version Not Supported 服务器不支持或者拒绝支持请求中使用的HTTP版本
506 Variant Also Negotiates 代表服务器存在内部配置错误
507 Insufficient Storage 服务器无法存储完成请求所需要的内容
509 BandWidth Limit Exceeded 服务器达到带宽限制
510 Not Extended 获取资源所需要的策略没有得到满足
600 Unparseable Response Headers 源站没有返回响应头部,只返回实体内容
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容