【Python】简单Web框架从零开始(三):Http响应格式

简介: 从上图可以看到响应客户端请求的协议格式与客户端请求的格式很类似,除了首行稍微不一样外。首行称为状态行,其格式为:[HTTP协议版本][空格][状态码][空格][消息][\r\n]。其中状态码是一组三位数组成的数字代码,具体介绍可以百度百科,常见的有200,400,404等等。跟在状态码后面的响应消息是与状态码对应的文本描述。 实体头部数据格式完全与请求的头部格式一致,里面包含了服务器相关的信息,以及支持哪些功能和特殊的内容。

【Python】简单Web框架从零开始(三):Http响应格式


目录


【Python】简单Web框架从零开始(一):Web服务


【Python】简单Web框架从零开始(二):Http请求格式


一、前言


   前面两期介绍HTTP网络部分和客户端请求解析,这篇介绍如何响应客户端的请求,完成请求应答之后基本的Web框架就差不多了,剩下的就是逐个补齐一些所需的模块啦。


二、响应格式


微信截图_20220424003825.png


   从上图可以看到响应客户端请求的协议格式与客户端请求的格式很类似,除了首行稍微不一样外。首行称为状态行,其格式为:[HTTP协议版本][空格][状态码][空格][消息][\r\n]。其中状态码是一组三位数组成的数字代码,具体介绍可以百度百科,常见的有200,400,404等等。跟在状态码后面的响应消息是与状态码对应的文本描述。


   实体头部数据格式完全与请求的头部格式一致,里面包含了服务器相关的信息,以及支持哪些功能和特殊的内容。


   响应数据体就是真正给客户端“显示”的内容,想要客户端正确接收到服务器的响应数据,需要在响应的实体头里面加上Content-Length用于表示响应数据体的大小,还可以增加Content-Type来表示响应数据体的内容格式。Content-Type有很多类型 ,具体可以去https://tool.oschina.net/commons/这个网站上面查看。


   客户端的请求一般分为两类,一种是静态资源请求例如访问一个静态页面(如下图展示的HTML文件页面内容),文件下载,图片请求等等。这些请求在收到服务器响应后就会在浏览器中尝试显示出来,Content-Type就可以标识响应的内容是在浏览器中渲染还是下载。另一种就是后台数据交互,例如动态获取天气信息http://www.weather.com.cn/data/cityinfo/101010100.html,服务器返回的是一段JSON格式的数据,具体如何在浏览器里面展示,就需要使用Javascript脚本进行处理了。这种一般采用Ajax后台请求数据,然后动态展示到页面上。


微信截图_20220424003836.png


三、响应代码


   理解响应的协议格式结构后,实现起来就比较简单了,在发送数据前先将状态行和请求头数据发送出去,然后在发响应数据体即可。只要注意Content-Length是必须的,且长度要等于响应数据体的长度,否则客户端就无法正确响应了。


def write_header(self, code=200, message="OK"):
    # 状态行
    self.request.wfile.write("HTTP/1.1 {0} {1}\r\n".format(code, message))
    # 实体头
    for k, v in self.headers.items():
        self.request.wfile.write("{0}: {1}\r\n".format(k,v))
    # 注意响应实体头发完后,还需要发一个空行
    self.request.wfile.write("\r\n")
def write(self, body):
    self.raw_data += body
def flush(self):
    if "Content-Length" not in self.headers:
        self.headers["Content-Length"] = len(self.raw_data)
    self.write_header(self.code, self.message)
    self.request.wfile.write(self.raw_data)
    self.request.wfile.flush()


   现在浏览器都支持的HTTP版本为1.1,因此我采用默认回复客户端HTTP/1.1,而没有动态判断。不同版本支持的行为有哪些,可以自行百度一下哦


四、完结


   具体的代码已经放到Github上,代码写的很简单仅供学习哦。后面有时间可以把模板渲染也接入进去,这样就是一个后端渲染的小框架啦。不过现在似乎比较流行前端渲染,那后端就轻松多啦。


欢迎微信搜索"游戏测试开发"关注一起沟通交流。

相关文章
|
7天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
16天前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
30 3
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
16天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
103 45
|
4天前
|
缓存 安全 网络安全
HTTP/2与HTTPS在Web加速中的应用
HTTP/2与HTTPS在Web加速中的应用
|
22天前
|
数据采集 前端开发 算法
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
本文介绍了如何使用 Python 的 `requests` 库应对复杂的 HTTP 请求场景,包括 Spider Trap(蜘蛛陷阱)、SESSION 访问限制和请求频率限制。通过代理、CSS 类链接数控制、多账号切换和限流算法等技术手段,提高爬虫的稳定性和效率,增强在反爬虫环境中的生存能力。文中提供了详细的代码示例,帮助读者掌握这些高级用法。
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
|
5天前
|
JSON API 数据格式
Python中获取HTTP请求响应体的详解
本文介绍了如何使用Python的`requests`和`urllib`库发送HTTP请求并处理响应体。`requests`库简化了HTTP请求过程,适合快速开发;`urllib`库则更为底层,适用于性能要求较高的场景。文章详细演示了发送GET请求、处理JSON响应等常见操作。
|
12天前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP是一种流行的服务器端脚本语言,自诞生以来在Web开发领域占据重要地位。从简单的网页脚本到支持面向对象编程的现代语言,PHP经历了多次重大更新。本文探讨PHP的现代演进历程,重点介绍其在Web开发中的应用及框架创新,如Laravel、Symfony等。这些框架不仅简化了开发流程,还提高了开发效率和安全性。
20 3
|
11天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
11天前
|
前端开发 JavaScript 开发工具
从框架到现代Web开发实践
从框架到现代Web开发实践
22 1