一个人必须知道该说什么,一个人必须知道什么时候说,一个人必须知道对谁说,一个人必须知道怎么说。——现代管理之父德鲁克
1. http 响应
"/hello"接口的响应内容如下:
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 15 Jan 2019 02:56:59 GMT
Content-Length: 12
hello, world
其中,第1行是状态行,第2-4行都是响应头,第5行是一个空行,第6行是响应的消息体。
一个http响应包括三个部分:
- 状态行
- 响应头
- 消息体(body)[可选]
1.1 状态行
HTTP/1.1 200 OK
包括三个部分:
- http版本,这里是1.1
- 状态码,这里是200,代表成功
- 状态码简短描述,这里是ok
上面的状态行行,简单理解就是:采用http 1.1协议,向GET /hello请求进行响应,响应状态为成功。
这里,我们要重点了解下状态码。
1.1.1 状态码
客户端处理响应的结果优先根据状态码,其次根据响应头部来进行的。状态吗主要分成5个部分:
- 1xx (Informational response),以1开头的状态码,表明服务端已收到请求,告诉客户端等待请求的结果。
- 2xx (Success),以2开头的状态码,表明服务端已收到并接收了请求。例如常见的200,代表请求被成功处理。
- 3xx (Redirection),以3开头的状态码,表明服务端需要进行额外的处理来完成该请求。很多3xx的状态码被用在url重定向中。
- 4xx (Client errors),以4开头的状态码,表明客户端引起的错误。例如常见的404,表示客户端访问了一个不存在的资源。
- 5xx (Server errors),以5开头的状态码,表明服务端处理请求时发生了错误。例如常见的500错误,表示服务端处理请求时发生了内部错误。
状态码包括标准定义的官方状态码,还有非官方的状态码。非官方的状态码主要是由第三方软件系统自己定义的。比如Nginx服务器定义的494,表示客户端请求头数据太多。
1.1.1.1 常见的2xx标准状态码
状态码 | 描述 | 备注 |
---|---|---|
200 | ok | 最常见的状态码,表示服务端处理请求成功 |
201 | Created | 请求处理成功,同时新建了一个新的资源 |
204 | No Content | 请求处理成功,但是不返回任何主体数据(body) |
205 | Reset Content | 与204类似,但是要求客户端重置表单数据 |
1.1.1.2 常见的3xx标准状态码
状态码 | 描述 | 备注 |
---|---|---|
301 | Moved Permanently | 请求永久重定向到给定的url |
304 | Not Modified | 根据请求头If-Modified-Since或If-None-Match判断, 资源未发生改变,客户端可以使用之前请求的资源副本。 |
1.1.1.3 常见的4xx标准状态码
状态码 | 描述 | 备注 |
---|---|---|
400 | Bad Request | 客户端请求错误,例如:请求参数不对,数据太大,参数格式错误等 |
401 | Unauthorized | 类似403,未通过验证,或者是未提供必须的用户信息,比如用户名和密码等 |
403 | Forbidden | 服务端拒绝请求,比如用户没有方法该资源的权限 |
404 | Not Found | 访问的资源不存在 |
405 | Method Not Allowed | 请求方法不支持。比如,客户端对某个url发起了一个GET请求, 而服务端对于该url必须使用POST请求。 |
429 | Too Many Requests | 请求数量超过了服务端的限制 |
1.1.1.4 常见的5xx标准状态码
状态码 | 描述 | 备注 |
---|---|---|
500 | Internal Server Error | 服务端内部错误 |
502 | Bad Gateway | 服务端器作为网关时或代理时,从上游收到了不正确的响应 |
503 | Service Unavailable | 服务暂时不可用。这是一个临时状态。 |
504 | Gateway Timeout | 服务端器作为网关时或代理时,从一定的时间内未收到上游的响应 |
1.2 响应头
响应头位于状态行之后,与请求头一样,使用key-value的格式,并以CRLF结尾。也就是说每行都是一个键值对。响应头可以包括多个键值对。最后使用一个空行,来表明整个响应头的结束。
标准响应头字段有76个,非标准的有十多个。作为后端开发人员,需要了解一些常见的响应头。我们首先介绍下'hello,world'中的响应头,后续出现其它的响应头字段时再一一说明。
1.2.1 hello, world 响应头
Content-Type: text/plain; charset=utf-8
Date: Tue, 15 Jan 2019 02:56:59 GMT
Content-Length: 12
字段 | 描述 | 例子 | 备注 |
---|---|---|---|
Content-Type | 媒体类型(MIME type) | Content-Type: text/plain; charset=utf-8 表示响应的消息体内容格式是纯文本,采用utf-8编码 |
|
Date | 响应时间 | Date: Tue, 15 Jan 2019 02:56:59 GMT | |
Content-Length | 消息体(body)内容的长度,以字节为单位 | Content-Length: 12 比如:hello, world正是12个字节长度 |
1.3 消息体-body部分
hello, world
该消息体返回了文本"hello, world",其长度为12个字节。
在正式的项目中,就是返回该接口对应的数据。通常这些数据都是来自于数据库或其它存储中,根据业务需求,处理后返回给客户端。实际上,作为web后端开发人员,熟悉了解业务需求,可以有助于提高项目质量和降低项目周期风险。在作者带团队时,宁愿多花点时间和成员沟通业务需求和相关流程,在此基础上,后续的开发会变得顺畅多了。
2. 小结
本节主要介绍了http响应的主要内容,介绍了响应格式,常见的状态码等。下节将介绍前后端分离的开发模式和实践中经常会出现的问题,以及如何处理这些问题的经验和方法。
本文为作者原创作品,属于《重新学习web后端开发》专辑中的一篇,转载时请备注作者信息及来源。本文原文地址:https://www.donnyzhang.com/20...
有疑问加站长微信联系(非本文作者)