在开发中经常会用到http请求,但是之前我并没有深入地研究一下http到底是什么,直到昨天进行了一场面试 ,面试官提问“http报文里面有什么内容?”。对于这样的题目,我本以为自己早就会了,可是答起来犹犹豫豫,最后还是没把这个讲清楚。所以今天就来总结一下http里面有什么内容(我只是一个前端菜狗,若有不正确的地方,望大家能够指出,我马上改正!!!)。
Http
http定义:http(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定。也就是说,http协议规定了超文本传输所要遵守的规则
按照Http的定义其实可以简单的了解到http一些信息:"用文本字符串浏览器和服务器之间传输数据的一个协议"。
http的特点有以下几点
- 支持客户/服务器模式
- 简单快捷 用户只需要传递请求的方法和请求的地址就可以请求服务
- 灵活 传输的数据类型由Content-Type指定,服务器按照指定的类型对数据进行解析
- 无持续连接 服务器应答后即刻断开连接,再次请求时需重新建立连接
- 无状态 每次http请求都是独立的,没有必然的联系,后引入Cookie和session来关联请求
报文
报文是http传递的数据内容,又被分为请求报文和响应报文
请求报文
GET /question/7859669.html HTTP/1.1
Host: zhidao.baidu.com
Connection: keep-alive
Pragma: no-cache
...
// 空行
请求数据
看上面的请求报文,由以下四个部分组成:
- 请求行
- 请求头
- 空行
- 请求数据
请求行包含了 请求方法字段、URL字段和HTTP协议版本。请求方法可以设置为 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT等。URL为请求的地址,当使用Get进行请求时,请求参数会拼接在URL之后。HTTP协议目前默认都是1.1。
接下来是请求头的key-value字段,常见的有User-Agent、Accept、Host等
若有请求数据则空行是必须的,空行表示请求头的部分已经结束,之后的内容都是请求数据
请求数据是发送的主体内容,post方法中,会把数据以key value形式发送请求
响应报文
HTTP/1.1 200 OK
Access-Control-Allow-Headers: X-ik-ssl,X-ik-token,X-ik-utdata
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html
Date: Sun, 31 May 2020 07:41:35 GMT
Server: Apache
Vary: Accept-Encoding
Wait: 2
Content-Length: 25
响应报文由以及三个部分组成
- 响应行
- 响应头
- 响应正文
响应行由http协议 状态码 以及文本描述构成
响应头是由服务器返回给浏览器key-value字段,常见的有Expires、Allow等
响应正文为服务器返回的JSON数据或者html页面,在上例中并没有显示出来。
接下来会列出来了一些常用的请求头和状态码,方便大家记忆...
常见请求头
- Accept:浏览器可接受的MIME类型;
- Accept-Charset:浏览器可接受的字符集;
- Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间;
- Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;
- Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中;
- Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;
- Content-Length:表示请求消息正文的长度;
- Cookie:这是最重要的请求头信息之一;
- From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它;
- Host:初始URL中的主机和端口;
- If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答;
- Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;
- Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
- User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用;
- UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。
常见的状态码
1XX 信息性状态码
接收的请求正在处理
- 100 Continue 继续。客户端应继续其请求
- 101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
2XX 成功状态码
请求正常处理完毕
- 200 OK 请求成功。一般用于GET与POST请求
- 201 Created 已创建。成功请求并创建了新的资源
- 202 Accepted 已接受。已经接受请求,但未处理完成
- 203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
- 204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
- 205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
- 206 Partial Content 部分内容。服务器成功处理了部分GET请求
3XX 重定向状态码
需要进行附加操作以完成请求
- 300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
- 301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
- 302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
- 303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
- 304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
- 305 Use Proxy 使用代理。所请求的资源必须通过代理访问
- 306 Unused 已经被废弃的HTTP状态码
- 307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向
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 Time-out 服务器等待客户端发送的请求时间过长,超时
- 409 Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
- 410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
- 411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
- 412 Precondition Failed 客户端请求信息的先决条件错误
- 413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
- 414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理
- 415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
- 416 Requested range not satisfiable 客户端请求的范围无效
- 417 Expectation Failed 服务器无法满足Expect的请求头信息
5XX 服务器错误状态码
服务器处理请求出错
- 500 Internal Server Error 服务器内部错误,无法完成请求
- 501 Not Implemented 服务器不支持请求的功能,无法完成请求
- 502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
- 503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
- 504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
- 505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理
如果你能读到这里,我将会十分开心,作为一个只有两年经验的前端菜狗,之前没有怎么写博客,直到最近面试被毒打之后,才知道自己对前端的研究的深度不够,之后会好好地通过写博客的方式来扩展自己的深度和广度,也希望有更多的朋友能够和我一起交流技术。