HTTP 应答服务器端要做的事
1. 解析完请求,先确定三件核心信息
- 状态码:200 成功、404 找不到文件、400 请求格式错、500 服务器出错等
- 状态描述:和状态码配对
- 响应体(body):要发给浏览器的内容
状态码
| 状态码 | 英文描述 | 中文说明 | 场景举例 |
|---|---|---|---|
| 2xx 成功类 | |||
| 200 | OK | 请求成功 | 正常返回网页、接口数据(你的首页 index.html) |
| 201 | Created | 创建成功 | POST 请求成功新建资源 |
| 202 | Accepted | 已接受请求,尚未处理 | 异步任务提交,服务器收下任务还没执行 |
| 3xx 重定向类 | |||
| 301 | Moved Permanently | 永久重定向 | 网站域名永久更换,浏览器会缓存新地址 |
| 302 | Found | 临时重定向 | 登录跳转、临时切换页面,不缓存 |
| 304 | Not Modified | 资源未修改 | 协商缓存,浏览器本地文件可用,不用重传资源 |
| 4xx 客户端错误(请求有问题) | |||
| 400 | Bad Request | 错误请求 | 请求报文格式错误、参数非法 |
| 401 | Unauthorized | 未认证,需要登录 | 没登录就访问需要权限的接口 |
| 403 | Forbidden | 拒绝访问,权限不足 | 登录了,但没有访问这个资源的权限 |
| 404 | Not Found | 资源不存在 | 访问的文件路径找不到(你现在的 err404.html 页面) |
| 405 | Method Not Allowed | 请求方法不允许 | 接口只支持 GET,你发了 POST |
| 408 | Request Timeout | 请求超时 | 客户端很久没发完请求,服务器断开 |
| 5xx 服务端错误(服务器内部出错) | |||
| 500 | Internal Server Error | 服务器内部错误 | 代码崩溃、空指针、逻辑异常(C++ 程序异常) |
| 501 | Not Implemented | 功能未实现 | 服务器不支持该请求方法 |
| 502 | Bad Gateway | 网关错误 | 反向代理拿到后端无效响应 |
| 503 | Service Unavailable | 服务不可用 | 服务器过载、正在维护,暂时无法提供服务 |
| 504 | Gateway Timeout | 网关超时 | 代理服务器等待后端响应超时 |
2. 拼装【响应报文】


代码
build
对于应答部分


在初始化的时候给出默认值
对于状态码和状态码描述要建立映射

我们要先对发过来的请求作出解析,找到他所要请求的内容.也就是uri所对应的内容,
首先就是返回/的时候我们要对应到所在的首页



找到了文件路径和文件名称可以获得唯一确定的访问内容.接下来就是对文件进行读取


接下来拿到资源要进行判断拿到的资源到底是有没有,就可以设计相应的状态码

如果访问的资源不存在也就是404,那么也就是说名我们要对其结果返回另外一个html,这里我们选择读取的文件是特定目录下的文件,显示该网页不存在,另外在设置相应的报头属性
如果存在我们就进行正常读取返回状态码200

当状态码是3xx的时候:
3xx 代表重定向 ,服务器告诉客户端:你要找的资源不在原地址了,需要换一个 URL 重新发起请求。 浏览器收到 3xx 后,默认会自动跳转到响应头 Location 里给的新地址。
所以对于3xx我们还需要在添加一个报头也就是说明其要跳转到哪一个网页


Serialization
将得到的资源内容进行拼接

补充细节
读取的网页可能并不是纯文本的,可能还有图片视频,音乐等等
所以我们还要对文件读取进行调整,变成二进制文本的读取

其他资源可以是服务器本地也可以是来自其他网站,可以解决服务器压力很大的问题,典型的就是图床
我们来讨论下一个问题我们没有给浏览器发送我们返回的类型,为什么浏览器自己可以知道???
首先就是不一定每个浏览器都会完成,各个浏览器的功能丰富度是不一样的,作为相应我们应该是要返回,那我们怎么知道呢???