构建强大的API:Django中的REST框架探究与实践【第146篇—Django】

👽发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。

构建强大的API:Django中的REST框架探究与实践

在当今的Web开发中,构建强大的API已经成为了不可或缺的一部分。而在Python领域,Django框架提供了强大的REST框架,为开发者提供了一种高效、灵活的方式来构建和管理API。本文将深入探讨Django中REST框架的使用,并通过代码实例和解析来展示其强大之处。

1. 什么是REST框架?

REST(Representational State Transfer)是一种软件架构风格,其关注于系统间资源的状态转移。在Web开发中,RESTful API是一种遵循REST原则的API设计风格,它使用HTTP协议进行通信,通过GET、POST、PUT、DELETE等HTTP方法来实现对资源的操作。

Django中的REST框架提供了一套强大的工具和库,帮助开发者轻松构建和管理RESTful API。

2. 使用Django REST框架

首先,我们需要在Django项目中安装djangorestframework

pip install djangorestframework

接下来,在settings.py文件中添加rest_frameworkINSTALLED_APPS中:

INSTALLED_APPS = [...'rest_framework',
]

3. 创建一个简单的REST API

我们将创建一个简单的REST API,用于管理用户列表。首先,在models.py中定义一个简单的用户模型:

from django.db import modelsclass User(models.Model):name = models.CharField(max_length=100)email = models.EmailField()

然后,在serializers.py中定义一个序列化器来序列化用户模型:

from rest_framework import serializers
from .models import Userclass UserSerializer(serializers.ModelSerializer):class Meta:model = Userfields = ['id', 'name', 'email']

接着,在views.py中定义一个视图集:

from rest_framework import viewsets
from .models import User
from .serializers import UserSerializerclass UserViewSet(viewsets.ModelViewSet):queryset = User.objects.all()serializer_class = UserSerializer

最后,在urls.py中配置路由:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import UserViewSetrouter = DefaultRouter()
router.register(r'users', UserViewSet)urlpatterns = [path('', include(router.urls)),
]

现在,我们已经创建了一个简单的用户API,可以通过/users/访问用户列表。

4. 代码解析

  • models.py中定义了一个简单的用户模型,其中包含了用户的姓名和邮箱。
  • serializers.py中定义了一个序列化器,用于将用户模型序列化成JSON格式。
  • views.py中定义了一个视图集,使用了ModelViewSet,它提供了默认的CRUD操作。
  • urls.py中配置了路由,将API端点映射到对应的视图集上。

6. 进一步优化与功能扩展

虽然我们已经创建了一个基本的用户API,但在实际应用中,通常需要进一步优化和扩展功能。下面是一些可能的改进和扩展:

自定义API端点

在路由配置中,我们使用了DefaultRouter提供的默认路由,但有时候我们可能需要自定义API端点。例如,我们可以添加一个搜索用户的端点:

from django.urls import path
from .views import UserSearchViewurlpatterns = [path('users/search/', UserSearchView.as_view(), name='user-search'),
]

认证和权限控制

在实际应用中,我们可能需要对API进行认证和权限控制。Django REST框架提供了丰富的认证和权限类,可以轻松地实现这些功能。例如,我们可以添加基于Token的认证:

from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticatedclass UserViewSet(viewsets.ModelViewSet):queryset = User.objects.all()serializer_class = UserSerializerauthentication_classes = [TokenAuthentication]permission_classes = [IsAuthenticated]

响应格式定制

有时候,客户端可能需要不同格式的响应数据,比如JSON、XML等。Django REST框架允许我们根据客户端的请求格式,动态地选择响应格式。例如,我们可以根据请求头中的Accept字段来选择响应格式:

from rest_framework.renderers import JSONRenderer, XMLRendererclass UserViewSet(viewsets.ModelViewSet):queryset = User.objects.all()serializer_class = UserSerializerrenderer_classes = [JSONRenderer, XMLRenderer]

分页和过滤

对于大型数据集,通常需要分页和过滤功能来提高性能和用户体验。Django REST框架提供了内置的分页和过滤功能,可以轻松地实现这些功能。例如,我们可以配置每页显示10条数据,并且允许按姓名进行过滤:

from rest_framework.pagination import PageNumberPagination
from rest_framework.filters import SearchFilterclass UserPagination(PageNumberPagination):page_size = 10page_size_query_param = 'page_size'max_page_size = 100class UserViewSet(viewsets.ModelViewSet):queryset = User.objects.all()serializer_class = UserSerializerpagination_class = UserPaginationfilter_backends = [SearchFilter]search_fields = ['name']

8. 数据验证与错误处理

在API开发中,数据验证和错误处理是至关重要的部分。Django REST框架提供了强大的数据验证机制和错误处理功能,让我们能够轻松地处理各种情况。

数据验证

通过在序列化器中定义字段,并配置相应的验证规则,可以实现数据的验证。例如,我们可以要求用户的邮箱必须是唯一的:

class UserSerializer(serializers.ModelSerializer):class Meta:model = Userfields = ['id', 'name', 'email']extra_kwargs = {'email': {'validators': [UniqueValidator(queryset=User.objects.all())]}}

错误处理

Django REST框架提供了丰富的错误处理机制,包括内置的异常类以及自定义异常处理器。例如,我们可以捕获并处理特定的异常,并返回自定义的错误消息:

from rest_framework.exceptions import NotFound
from rest_framework.response import Response
from rest_framework.views import exception_handlerdef custom_exception_handler(exc, context):response = exception_handler(exc, context)if isinstance(exc, NotFound):return Response({'detail': '资源不存在'}, status=404)return response

然后,在settings.py中配置自定义的异常处理器:

REST_FRAMEWORK = {'EXCEPTION_HANDLER': 'your_app.custom_exception_handler',
}

9. 测试与文档

为了确保API的稳定性和正确性,我们需要编写测试来验证API的各种功能和行为。Django REST框架提供了内置的测试工具和类,可以帮助我们编写各种类型的测试。例如,我们可以编写基于APITestCase的测试类来测试API的各种端点和功能。

另外,为了方便使用和理解API,我们还可以使用Django REST框架提供的文档工具来自动生成API文档。通过在settings.py中配置相应的参数,我们可以轻松地生成API文档,并提供给开发者参考和使用。

11. 异步视图与性能优化

随着Web应用程序的复杂性增加,处理大量请求的能力变得至关重要。Django REST框架允许我们使用异步视图和性能优化技术来提高应用程序的性能和可扩展性。

异步视图

在处理I/O密集型任务时,使用异步视图可以提高性能和并发能力。Django REST框架通过@api_view装饰器和async关键字支持异步视图。例如,我们可以使用异步视图来处理大量请求:

from rest_framework.decorators import api_view
from rest_framework.response import Response
import asyncio@api_view(['GET'])
async def async_example(request):await asyncio.sleep(1)  # 模拟耗时操作return Response({'message': '异步视图示例'})

性能优化

除了异步视图之外,还有一些其他的性能优化技术可以帮助我们提高应用程序的性能。例如,使用缓存来减轻数据库负载,使用性能调优工具来识别并优化慢查询,以及使用负载均衡和水平扩展来提高应用程序的可扩展性。

12. 安全性与权限控制

在开发API时,确保API的安全性和权限控制是至关重要的。Django REST框架提供了丰富的安全性功能和权限控制机制,可以帮助我们保护API免受各种安全威胁。例如,我们可以使用内置的身份验证和权限类来限制用户对资源的访问:

from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticatedclass UserViewSet(viewsets.ModelViewSet):queryset = User.objects.all()serializer_class = UserSerializerauthentication_classes = [SessionAuthentication]permission_classes = [IsAuthenticated]

此外,我们还可以使用第三方库来增强API的安全性,比如使用django-rest-framework-simplejwt来实现基于JWT的身份验证。

14. 版本控制与迁移

随着应用程序的发展和演变,版本控制和迁移变得至关重要。Django REST框架提供了版本控制和迁移功能,可以帮助我们管理API的不同版本和迁移。

版本控制

在开发API时,通常会遇到API版本更新的情况。为了确保旧版本的API仍然可用,并且能够平滑过渡到新版本,我们可以使用Django REST框架提供的版本控制功能。例如,我们可以在URL中包含版本号,并使用@api_view装饰器来定义不同版本的视图:

from rest_framework.decorators import api_view
from rest_framework.response import Response@api_view(['GET'])
def v1_example(request):return Response({'message': 'Version 1 Example'})@api_view(['GET'])
def v2_example(request):return Response({'message': 'Version 2 Example'})

迁移

随着应用程序的演变,可能需要对数据库模型进行修改或迁移。Django提供了强大的迁移工具,可以帮助我们轻松地管理数据库模型的变更。例如,我们可以使用makemigrationsmigrate命令来生成和应用数据库迁移:

python manage.py makemigrations
python manage.py migrate

15. 数据序列化与性能优化

在处理大量数据时,有效地序列化和反序列化数据对性能至关重要。Django REST框架提供了丰富的序列化和性能优化功能,可以帮助我们提高应用程序的性能和效率。

数据序列化

通过使用序列化器,我们可以将复杂的数据结构转换为简单的JSON格式,并进行序列化和反序列化操作。例如,我们可以定义一个嵌套序列化器来序列化和反序列化关联模型:

class UserProfileSerializer(serializers.ModelSerializer):user = UserSerializer()class Meta:model = UserProfilefields = ['user', 'bio', 'avatar']

性能优化

在处理大量数据时,需要注意序列化和反序列化操作的性能。Django REST框架提供了一些性能优化技巧,可以帮助我们提高序列化和反序列化操作的效率。例如,我们可以使用select_relatedprefetch_related方法来优化数据库查询,减少数据库访问次数:

class UserViewSet(viewsets.ModelViewSet):queryset = User.objects.all().select_related('profile')serializer_class = UserSerializer

17. 文件上传与存储

在许多应用程序中,文件上传和存储是常见的需求。Django REST框架提供了简单而强大的文件上传和存储功能,使我们能够轻松地处理文件上传和管理。

文件上传

通过使用Django REST框架提供的FileFieldImageField字段,我们可以轻松地处理文件上传。例如,我们可以定义一个包含文件字段的序列化器:

from rest_framework import serializers
from .models import FileModelclass FileSerializer(serializers.ModelSerializer):class Meta:model = FileModelfields = ['id', 'file']

文件存储

Django提供了内置的文件存储系统,可以将上传的文件保存到本地文件系统或云存储服务中。我们可以在settings.py中配置文件存储方式:

# settings.pyDEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'

或者使用第三方存储后端,如django-storages库:

# settings.pyDEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

18. 身份验证与授权

在开发API时,确保只有授权用户能够访问受保护的资源是非常重要的。Django REST框架提供了丰富的身份验证和授权功能,可以帮助我们实现灵活的身份验证和授权策略。

身份验证

Django REST框架支持多种身份验证方式,包括基于Token的身份验证、Session身份验证、OAuth身份验证等。我们可以根据应用程序的需求选择合适的身份验证方式:

from rest_framework.authentication import TokenAuthenticationclass MyView(APIView):authentication_classes = [TokenAuthentication]

授权

除了身份验证之外,Django REST框架还提供了多种授权方式,包括基于角色的访问控制、基于对象的访问控制等。我们可以在视图或视图集中使用permission_classes属性来配置授权策略:

from rest_framework.permissions import IsAuthenticatedclass MyView(APIView):permission_classes = [IsAuthenticated]

20. 定制化API响应与错误处理

在开发API时,定制化API响应和错误处理是非常重要的,它可以提高用户体验并使API更加易于使用。Django REST框架提供了丰富的工具和功能,可以帮助我们定制化API响应和错误处理。

定制化API响应

通过使用DRF(Django REST Framework)提供的Response对象,我们可以定制化API的响应数据格式和内容。例如,我们可以在视图函数或视图集中使用Response对象返回自定义的响应数据:

from rest_framework.response import Responsedef my_view(request):data = {'message': 'Hello, world!'}return Response(data)

此外,我们还可以使用DRF的Response渲染器和解析器来自动处理不同类型的响应数据,如JSON、XML等。

错误处理

在API开发中,处理错误是非常重要的,它可以帮助我们及时发现问题并向用户提供友好的错误信息。Django REST框架提供了丰富的错误处理功能,包括内置的异常类、自定义异常处理器等。例如,我们可以捕获并处理特定类型的异常,并返回自定义的错误响应:

from rest_framework.exceptions import NotFound
from rest_framework.response import Response
from rest_framework.views import exception_handlerdef custom_exception_handler(exc, context):response = exception_handler(exc, context)if isinstance(exc, NotFound):return Response({'detail': '资源不存在'}, status=404)return response

然后,在settings.py中配置自定义的异常处理器:

REST_FRAMEWORK = {'EXCEPTION_HANDLER': 'my_app.custom_exception_handler',
}

21. 性能监控与优化

随着API的使用量增加,性能监控和优化变得至关重要。Django REST框架提供了一些性能监控和优化的工具和技术,可以帮助我们实时监控API的性能并进行优化。例如,我们可以使用Django Debug Toolbar来监控API的性能,识别并优化慢查询和性能瓶颈。

另外,我们还可以使用Django ORM的性能优化技巧,如使用select_relatedprefetch_related方法来优化数据库查询,减少数据库访问次数,提高API的性能和响应速度。

23. 缓存与缓存优化

在处理大量请求时,有效地利用缓存可以显著提高API的性能和响应速度。Django REST框架提供了内置的缓存支持,并且可以与Django的缓存框架无缝集成,使我们能够轻松地实现缓存功能。

缓存配置

我们可以在视图函数或视图集中使用@method_decorator装饰器来配置缓存:

from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_pageclass MyView(APIView):@method_decorator(cache_page(60))  # 缓存60秒def get(self, request):# 处理GET请求

此外,我们还可以在settings.py中全局配置缓存设置:

# settings.pyREST_FRAMEWORK = {'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60,  # 默认缓存60秒
}

缓存优化

除了配置缓存之外,我们还可以通过一些缓存优化技巧来进一步提高缓存的效率和性能。例如,我们可以使用适当的缓存键(cache key)来确保缓存的唯一性,避免缓存雪崩和缓存击穿等问题。

另外,我们还可以使用增量缓存、异步缓存、分布式缓存等技术来优化缓存性能,提高API的吞吐量和并发能力。

24. API文档与测试

在开发API时,良好的文档和充分的测试是非常重要的,它可以帮助开发者理解API的用法和功能,并确保API的稳定性和正确性。Django REST框架提供了丰富的文档和测试工具,可以帮助我们编写和管理API的文档和测试。

API文档

Django REST框架提供了内置的API文档功能,可以自动生成API的文档,并提供给开发者参考和使用。我们可以通过在settings.py中配置DEFAULT_SCHEMA_CLASS来选择使用的文档生成器:

# settings.pyREST_FRAMEWORK = {'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}

API测试

通过编写API测试,我们可以验证API的各种功能和行为,确保API的稳定性和正确性。Django REST框架提供了内置的测试工具和类,可以帮助我们编写各种类型的测试。例如,我们可以编写基于APITestCase的测试类来测试API的各种端点和功能。

25. 总结

在本文中,我们探讨了Django中REST框架的一系列功能和技术,涵盖了API开发中的各个方面。我们从构建API的基础开始,介绍了如何使用Django REST框架来创建强大的API,并通过代码实例和解析展示了其灵活性和易用性。

首先,我们学习了如何使用Django REST框架来创建简单的API端点,包括定义模型、序列化器、视图集以及路由配置等。随后,我们深入探讨了各种高级功能和技术,如版本控制、身份验证与授权、文件上传与存储、定制化API响应与错误处理、缓存与缓存优化以及API文档与测试等。

通过学习这些功能和技术,我们能够构建高性能、高可用、易于使用的API应用程序。Django REST框架为开发者提供了丰富的工具和功能,使我们能够快速、高效地开发出符合业务需求的API。

在实际应用中,我们应该根据具体的业务需求和场景,灵活运用Django REST框架提供的各种功能和技术,从而构建出高质量、稳定可靠的API应用程序。

总而言之,Django中REST框架为开发者提供了强大的工具和功能,使我们能够构建出高效、灵活、安全的API应用程序,满足不同场景下的需求。希望本文能够对读者有所启发和帮助,引导他们在API开发领域取得更大的成功。感谢您的阅读!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/282740.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试算法-83-不同路径 II

题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从左上角到…

如何一键下载微信视频号的视频至本地电脑

社交媒体平台上的短视频已经成为我们获取信息和娱乐的重要来源,尤其是微信视频号。这个平台汇聚了丰富多样的内容,从生活分享到专业知识,应有尽有。然而,有时我们可能希望将这些有趣的或有用的视频保存到本地以便离线观看或分享给…

单片机学到什么程度才可以去工作?

单片机学到什么程度才可以去工作? 如果没有名校或学位的加持,你还得再努力一把,才能从激烈的竞争中胜出。以下这些技能可以给你加分,你看情况学,不同行业对这些组件会有取舍: . Cortex-M内核:理解MCU内核各部件的工作机制&#…

如何利用RunnerGo简化性能测试流程

在软件开发过程中,测试是一个重要的环节,需要投入大量时间和精力来确保应用程序或网站的质量和稳定性。但是,随着应用程序变得更加复杂和庞大,传统的测试工具在面对比较繁琐的项目时非常费时费力。这时,一些自动化测试…

学习总结2

解题思路 用bfs进行搜索,标记A罐B罐所保存的水的出现情况,当再次出现的时候停止搜索,然后用数组模拟链表进行保存路径.最后输出. 代码 #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #in…

Python学习day3

知识&#xff1a; #继承&#xff0c;创建有继承的类 #父类、子类 #class 子类(父类): #调用时找父类的构造函数&#xff0c;如果子类自己有某函数则调用子类的&#xff0c;否则调用父类的 #在子类有构造函数的时候调用父类&#xff0c;可以用super().__init__的方法调用父类函数…

基于springboot的“漫画之家”系统

目录 背景 技术简介 系统简介 界面浏览 背景 随着科技的不断进步&#xff0c;计算机已经变成了人们日常生活和工作不可或缺的工具。在这样的环境下&#xff0c;互联网技术被广泛运用于各个领域&#xff0c;以提升工作和生活的效率&#xff0c;推动了网络信息技术的迅猛发展…

基于Springboot的西安旅游系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的西安旅游系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

力扣热门算法题 52. N 皇后 II,53. 最大子数组和,54. 螺旋矩阵

52. N 皇后 II&#xff0c;53. 最大子数组和&#xff0c;54. 螺旋矩阵&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.20 可通过leetcode所有测试用例。 目录 52. N 皇后 II 解题思路 完整代码 Python Java 53. 最大子数组…

多线程基础 -概念、创建、等待、分离、终止

文章目录 一、 线程概念1. 什么是线程2. 线程的优点3.线程的缺点4. 线程异常5. 线程用途 二、 Linux进程VS线程1. 进程和线程2. 进程和线程的地址空间3. 进程和线程的关系 三、Linux线程控制1. POSIX线程库2. 线程创建3. 线程ID及进程地址空间布局4. 线程终止5. 线程等待6. 线程…

Linux初识环境变量

&#x1f30e;环境变量【上】 文章目录&#xff1a; 环境变量 什么是环境变量 关于命令行参数 环境变量       简单了解       为什么需要环境变量       系统中其他环境变量 总结 前言&#xff1a; 环境变量是一种非常重要的概念&#xff0c;它们对于系统的…

长安链正式发布三周年,技术更迭支撑产业变革

导语&#xff1a; 2024年1月27日长安链正式发布三周年&#xff0c;开源社区借开年之际与大家一同回顾长安链三年来的技术发展历程&#xff0c;每一个里程碑的建设都得益于与长安链同行的合作伙伴与开发者&#xff0c;希望在2024年可以共同携手继往开来&#xff0c;为数字经济发…

Mysql面试题以及答案

1 基础 1.1、MySQL有哪些数据库类型&#xff1f; 数值类型 有包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT&#xff0c;分别表示 1 字节、2 字节、3 字节、4 字节、8 字节的整数类型。 1&#xff09;任何整数类型都可以加上 UNSIGNED 属性&#xff0c;表示无符号整数。 …

Matlab快捷键与函数

注释&#xff1a;注释对于代码的重要性我们就不做过多的解释了。不做注释的代码不是好代码。选中要注释的语句&#xff0c;按快捷键CtrlR,或者在命令行窗口上面的注释地方可以进行注释。当然也可以直接在语句前面“%”就可以&#xff08;注意&#xff1a;一定要用英文符号&…

第十二届蓝桥杯省赛CC++ 研究生组

十二届省赛题 第十二届蓝桥杯省赛C&C 研究生组-卡片 第十二届蓝桥杯省赛C&C 研究生组-直线 第十二届蓝桥杯省赛C&C 研究生组-货物摆放 第十二届蓝桥杯省赛C&C 研究生组-路径 第十二届蓝桥杯省赛C&C 研究生组-时间显示 第十二届蓝桥杯省赛C&C 研究生组…

石油炼化5G智能制造工厂数字孪生可视化平台,推进行业数字化转型

石油炼化5G智能制造工厂数字孪生可视化平台&#xff0c;推进行业数字化转型。在石油炼化行业&#xff0c;5G智能制造工厂数字孪生可视化平台的出现&#xff0c;为行业的数字化转型注入了新的活力。石油炼化行业作为传统工业的重要领域&#xff0c;面临着资源紧张、环境压力、安…

Matlab 双目相机标定(内置函数)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 相机标定的目的就是要找到从世界坐标转换为图像坐标所用到的投影P矩阵各个系数(即相机的内参与外参)。具体过程如下所述: 1、首先我们需要获取一个已知图形的图像(这里我们使用MATLAB所提供的数据)。 2、找到同…

_nodemon自动重启服务器

文章目录 1.安装模块 nodemon1.1安装方式2.jason文件里面可以存储自定义指令 由于每次修改代码都要重启服务器&#xff0c;所以我们希望有一种方式自动监视代码修改&#xff0c;自动启动服务器nodemon模块解决了这个问题 1.安装模块 nodemon 1.1安装方式 全局安装 npm i node…

计算地球圆盘负荷产生的位移

1.研究背景 计算受表面载荷影响的弹性体变形问题有着悠久的历史&#xff0c;涉及到许多著名的数学家和物理学家&#xff08;Boussinesq 1885&#xff1b;Lamb 1901&#xff1b;Love 1911&#xff0c;1929&#xff1b;Shida 1912&#xff1b;Terazawa 1916&#xff1b;Munk &…

TCP | TCP协议格式 | 三次握手

1.TCP协议 为什么需要 TCP 协议 &#xff1f;TCP 工作在哪一层&#xff1f; IP网络层是不可靠的&#xff0c;TCP工作在传输层&#xff0c;保证数据传输的可靠性。 TCP全称为 “传输控制协议&#xff08;Transmission Control Protocol”&#xff09;。 TCP 是面向连接的、可靠…