【软件基础知识】什么是 API,详细解读
想象一下,你正在使用智能手机上的天气应用。你打开应用,瞬间就能看到实时天气、未来预报,甚至是空气质量指数。但你有没有想过,这些数据是如何神奇地出现在你的屏幕上的?答案就在三个字母中:API。
API,全称Application Programming Interface(应用程序编程接口),是现代软件世界的无形英雄。它就像是数字世界中的万能翻译官,让不同的软件系统能够无缝对话和协作。在这个日益互联的世界里,API的重要性与日俱增。据统计,2023年全球API调用量已突破万亿级,预计到2025年将增长至10万亿次。
本文将带你深入了解API的世界,揭示它如何在幕后运作,为我们的数字生活提供动力。无论你是初学者还是经验丰富的开发者,这篇文章都将为你打开API的新视角。
目录
- 什么是API?
- API的核心概念
- API的重要性
- API的工作原理
- API工作流程
- 示例: 使用天气API
- API的类型
- 1. Web API
- 2. 库和框架API
- 3. 操作系统API
- 4. 远程过程调用(RPC) API
- 5. WebSocket API
- 6. 数据库API
- RESTful API详解
- RESTful API的关键特征
- RESTful API设计示例
- RESTful API实现示例
- API的实际应用案例
- 1. 社交媒体集成
- 2. 支付处理
- 3. 地图和位置服务
- 4. 天气数据服务
- 5. 电子商务集成
- API的优势与挑战
- API的优势
- API的挑战
- API开发最佳实践
- API的未来趋势
- 总结
什么是API?
API,即应用程序编程接口(Application Programming Interface),是一套预定义的规则和协议,允许不同的软件应用程序相互通信和交互。简单来说,API就像是餐厅里的服务员,它接收你的请求(订单),将请求传递给厨房(服务器),然后将结果(食物)带回给你。
API的核心概念
-
接口: API定义了软件组件之间交互的方式。它指定了请求和响应的格式,以及可用的操作。
-
抽象: API隐藏了底层实现的复杂性,提供了一个简化的接口供开发者使用。
-
契约: API作为客户端和服务器之间的契约,定义了它们之间交互的规则和期望。
API的重要性
在当今的数字生态系统中,API的重要性不言而喻:
- 互操作性: API使不同的系统能够无缝集成和协作。
- 效率: 开发者可以利用现有的API,而不是从头开始构建每个功能。
- 创新: API开放了新的可能性,允许开发者以创新的方式组合和使用现有服务。
- 扩展性: 企业可以通过API将其服务扩展到更广泛的用户群。
根据最新的统计数据,全球API市场规模预计将从2021年的41亿美元增长到2026年的137亿美元,复合年增长率(CAGR)为27.3%。这一增长趋势凸显了API在现代软件开发中的核心地位。[2]
API的工作原理
理解API的工作原理,可以帮助我们更好地掌握如何使用和开发API。让我们通过一个简单的例子来说明API是如何工作的。
API工作流程
-
客户端发起请求: 当你在天气应用中输入城市名称时,应用(客户端)会向天气API发送一个请求。
-
API接收请求: 天气API服务器接收到这个请求。
-
处理请求: API服务器处理这个请求,可能包括查询数据库,进行计算等。
-
生成响应: 服务器生成一个包含请求数据(如天气信息)的响应。
-
返回响应: API将这个响应发送回客户端。
-
客户端处理响应: 天气应用接收到响应,并在界面上显示天气信息。
示例: 使用天气API
让我们看一个具体的例子,使用Python代码来调用一个假设的天气API:
import requestsdef get_weather(city):# API端点url = f"https://api.weatherservice.com/v1/current?city={city}"# 发送GET请求response = requests.get(url)# 检查响应状态if response.status_code == 200:# 解析JSON响应data = response.json()# 提取所需信息temperature = data['temperature']humidity = data['humidity']return f"当前{city}的温度是{temperature}°C,湿度是{humidity}%"else:return "无法获取天气信息"# 使用API
print(get_weather("北京"))
在这个例子中:
- 我们定义了一个
get_weather
函数,它接受一个城市名作为参数。 - 函数构造了一个API请求URL,包含了城市名。
- 使用
requests
库发送GET请求到API。 - 检查响应状态,如果成功(状态码200),则解析JSON响应。
- 从响应中提取温度和湿度信息。
- 最后,返回格式化的天气信息字符串。
这个简单的例子展示了API如何允许我们的应用程序与外部服务交互,获取实时数据。
API的类型
API有多种类型,每种类型都有其特定的用途和特点。了解这些类型可以帮助开发者选择最适合其需求的API。以下是几种主要的API类型:
1. Web API
Web API是最常见的API类型,它通过HTTP协议在网络上提供服务。
- RESTful API: 遵循REST(Representational State Transfer)架构原则,使用标准HTTP方法如GET,POST,PUT,DELETE等。
- SOAP API: 使用XML格式交换数据,通常用于企业级应用。
- GraphQL API: 允许客户端精确指定所需的数据,减少过度获取或不足获取的问题。
2. 库和框架API
这些API是编程语言或软件框架提供的接口,用于执行特定任务。
- 例如: Java API, .NET Framework API
3. 操作系统API
操作系统API允许应用程序与操作系统交互,访问系统资源。
- 例如: Windows API, POSIX
4. 远程过程调用(RPC) API
RPC API允许程序调用另一个地址空间(通常是在远程计算机上)的子程序,就像调用本地子程序一样。
- 例如: gRPC, XML-RPC
5. WebSocket API
WebSocket API提供全双工,双向通信通道,适用于需要实时数据交换的应用。
6. 数据库API
数据库API允许应用程序与数据库管理系统交互。
- 例如: JDBC (Java Database Connectivity), ODBC (Open Database Connectivity)
RESTful API详解
RESTful API是当今最流行的Web API类型之一。REST(Representational State Transfer)是一种软件架构风格,它定义了一组创建Web服务的约束条件和属性。让我们深入了解RESTful API的核心概念和最佳实践。
RESTful API的关键特征
-
无状态: 每个请求都包含处理该请求所需的所有信息,服务器不保存任何客户端状态。
-
客户端-服务器架构: 客户端和服务器职责分离,提高了可移植性和可扩展性。
-
可缓存: 响应必须隐式或显式地标记为可缓存或不可缓存。
-
统一接口: 使用标准的HTTP方法(GET, POST, PUT, DELETE等)进行资源操作。
-
分层系统: 允许架构由多个层次组成,每个层次只知道与之直接交互的层。
RESTful API设计示例
让我们设计一个简单的RESTful API来管理一个图书馆的书籍:
-
获取所有书籍
- HTTP方法: GET
- URL:
/api/books
- 响应: 返回所有书籍的列表
-
获取特定书籍
- HTTP方法: GET
- URL:
/api/books/{id}
- 响应: 返回指定ID的书籍详情
-
添加新书籍
- HTTP方法: POST
- URL:
/api/books
- 请求体: 包含新书籍的详细信息
- 响应: 返回新创建的书籍信息
-
更新书籍信息
- HTTP方法: PUT
- URL:
/api/books/{id}
- 请求体: 包含更新后的书籍信息
- 响应: 返回更新后的书籍信息
-
删除书籍
- HTTP方法: DELETE
- URL:
/api/books/{id}
- 响应: 返回操作状态
RESTful API实现示例
以下是使用Python和Flask框架实现上述API的简单示例:
from flask import Flask, jsonify, requestapp = Flask(__name__)# 模拟数据库
books = [{"id": 1, "title": "1984", "author": "George Orwell"},{"id": 2, "title": "To Kill a Mockingbird", "author": "Harper Lee"}
]@app.route('/api/books', methods=['GET'])
def get_books():return jsonify(books)@app.route('/api/books/<int:book_id>', methods=['GET'])
def get_book(book_id):book = next((book for book in books if book['id'] == book_id), None)if book:return jsonify(book)return jsonify({"error": "Book not found"}), 404@app.route('/api/books', methods=['POST'])
def add_book():new_book = request.jsonnew_book['id'] = max(book['id'] for book in books) + 1books.append(new_book)return jsonify(new_book), 201@app.route('/api/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):book = next((book for book in books if book['id'] == book_id), None)if book:book.update(request.json)return jsonify(book)return jsonify({"error": "Book not found"}), 404@app.route('/api/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):global booksbooks = [book for book in books if book['id'] != book_id]return '', 204if __name__ == '__main__':app.run(debug=True)
这个例子展示了如何使用Flask创建一个简单的RESTful API。它实现了基本的CRUD(创建、读取、更新、删除)操作,并遵循了RESTful设计原则。
API的实际应用案例
API在现代软件开发中无处不在,它们在各个行业和应用场景中发挥着关键作用。让我们探讨一些API的实际应用案例,以更好地理解它们的重要性和多样性。
1. 社交媒体集成
案例: Facebook Graph API
Facebook提供了Graph API,允许开发者访问Facebook的社交图谱数据。这使得第三方应用可以实现"使用Facebook登录"功能,或者在用户授权的情况下访问和发布内容。
import requestsdef get_user_posts(access_token):url = f"https://graph.facebook.com/v12.0/me/posts?access_token={access_token}"response = requests.get(url)if response.status_code == 200:return response.json()['data']else:return None# 使用示例
posts = get_user_posts('YOUR_ACCESS_TOKEN')
for post in posts:print(post['message'])
2. 支付处理
案例: Stripe API
Stripe提供了强大的支付处理API,使得开发者可以轻松地在应用中集成支付功能。
import stripestripe.api_key = "YOUR_STRIPE_SECRET_KEY"def create_payment(amount, currency, source):try:charge = stripe.Charge.create(amount=amount,currency=currency,source=source,description="Example charge")return chargeexcept stripe.error.StripeError as e:return str(e)# 使用示例
payment = create_payment(1000, 'usd', 'tok_visa')
print(payment)
3. 地图和位置服务
案例: Google Maps API
Google Maps API允许开发者在其应用中集成地图功能,进行地理编码,路线规划等。
// 在HTML中加载Google Maps JavaScript API
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>// JavaScript代码
function initMap() {const map = new google.maps.Map(document.getElementById("map"), {center: { lat: 40.7128, lng: -74.0060 },zoom: 8,});
}// 在页面加载完成后初始化地图
window.onload = initMap;
这个例子展示了如何使用Google Maps JavaScript API在网页中嵌入一个简单的地图。
4. 天气数据服务
案例: OpenWeatherMap API
OpenWeatherMap提供了全球天气数据的API,允许开发者在应用中集成实时天气信息。
import requestsdef get_weather(city, api_key):url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"response = requests.get(url)if response.status_code == 200:data = response.json()return f"当前{city}的温度是{data['main']['temp']}°C,天气状况是{data['weather'][0]['description']}"else:return "无法获取天气信息"# 使用示例
print(get_weather("London", "YOUR_API_KEY"))
5. 电子商务集成
案例: Shopify API
Shopify的API允许开发者创建自定义的电子商务解决方案,如订单管理,产品目录更新等。
import shopify# 配置Shopify API连接
shop_url = "https://your-store.myshopify.com"
api_version = "2023-04"
private_app_password = "YOUR_PRIVATE_APP_PASSWORD"session = shopify.Session(shop_url, api_version, private_app_password)
shopify.ShopifyResource.activate_session(session)# 获取所有产品
products = shopify.Product.find()
for product in products:print(f"产品名称: {product.title}, 价格: {product.variants[0].price}")# 关闭会话
shopify.ShopifyResource.clear_session()
这个例子展示了如何使用Shopify API获取店铺中的所有产品信息。
API的优势与挑战
API为现代软件开发带来了众多优势,但同时也面临一些挑战。让我们深入探讨这些方面。
API的优势
-
提高开发效率
API允许开发者利用现有的功能和服务,而不是从头开始构建。这大大减少了开发时间和成本。例如,使用Google Maps API可以轻松地在应用中添加复杂的地图功能,而无需自己开发地图系统。 -
促进创新
通过组合不同的API,开发者可以创造出全新的应用和服务。例如,将天气API与旅游API结合,可以创建一个智能旅行规划应用。 -
提升互操作性
API使不同的系统和服务能够无缝集成。这在企业环境中尤其重要,可以连接不同部门的系统,提高整体效率。 -
扩展业务机会
通过开放API,企业可以将其服务扩展到更广泛的用户群,创造新的收入流。例如,Salesforce通过其API生态系统显著扩大了其市场份额。 -
提高用户体验
API允许应用提供更丰富、更实时的功能,从而提升用户体验。例如,社交媒体应用可以通过API实时更新用户动态。
API的挑战
-
安全性问题
API可能成为安全漏洞的入口点。未经适当保护的API可能导致数据泄露或未授权访问。例如,2018年Facebook的API漏洞导致了大规模的用户数据泄露。[2] -
性能和可扩展性
随着API使用量的增加,维护高性能和可扩展性变得越来越具有挑战性。据Akamai的报告,2023年API流量已占到整体Web流量的83%,这对API基础设施提出了巨大挑战。[4] -
版本控制和兼容性
随着API的演进,维护向后兼容性同时引入新功能可能变得复杂。这需要仔细的版本控制策略。 -
文档和支持
提供清晰、最新的文档和充分的支持对API的成功至关重要,但这往往是一项具有挑战性的任务。 -
依赖性风险
过度依赖第三方API可能带来风险。如果API提供商改变其服务条款或停止服务,可能会对依赖该API的应用造成严重影响。 -
合规性和数据隐私
随着GDPR等法规的实施,确保API处理和传输的数据符合各种法律和隐私要求变得越来越重要。
API开发最佳实践
为了应对这些挑战并充分发挥API的优势,遵循一些最佳实践是非常重要的。以下是一些API开发的关键最佳实践:
-
安全性优先
- 实施强大的身份验证和授权机制(如OAuth 2.0)。
- 使用HTTPS加密所有API通信。
- 实施速率限制以防止滥用。
- 定期进行安全审计和渗透测试。
-
设计清晰一致的接口
- 遵循RESTful设计原则。
- 使用清晰、直观的命名约定。
- 提供一致的错误处理和响应格式。
-
版本控制
- 在URL或头部中包含版本信息(例如:
/api/v1/users
)。 - 计划向后兼容性和弃用策略。
- 在URL或头部中包含版本信息(例如:
-
性能优化
- 实施缓存机制。
- 优化数据库查询。
- 考虑使用CDN分发API负载。
-
全面的文档
- 提供详细、最新的API文档。
- 包括示例代码和用例。
- 使用工具如Swagger自动生成文档。
-
监控和分析
- 实施全面的日志记录。
- 使用API监控工具跟踪性能和使用情况。
- 定期分析API使用模式以进行优化。
-
遵守数据隐私法规
- 确保API处理符合GDPR、CCPA等隐私法规。
- 实施数据最小化原则。
-
提供优质的开发者体验
- 创建开发者门户。
- 提供SDK和客户端库。
- 建立活跃的开发者社区。
-
灵活的数据格式
- 支持多种数据格式(如JSON、XML)。
- 使用内容协商允许客户端选择首选格式。
-
异步处理
- 对于长时间运行的操作,考虑使用异步API。
- 实施webhook以推送更新。
通过遵循这些最佳实践,开发者可以创建更安全、更高效、更易用的API,从而提高整体的开发效率和用户满意度。
API的未来趋势
随着技术的不断发展,API领域也在持续演进。以下是一些值得关注的API未来趋势:
-
API-First设计
越来越多的公司采用API-First的开发方法,将API设计作为产品开发的核心。这种方法有助于创建更一致、更可扩展的系统。 -
GraphQL的兴起
GraphQL作为REST的替代方案正在获得越来越多的关注。它允许客户端精确指定所需的数据,减少了过度获取和不足获取的问题。 -
无服务器和微服务架构
API与无服务器计算和微服务架构的结合,使得开发更加灵活和可扩展。这种趋势预计将继续增长。 -
AI和机器学习API
随着AI技术的进步,越来越多的公司提供AI和机器学习API,使开发者能够轻松地将这些先进功能集成到他们的应用中。 -
IoT和API
物联网(IoT)设备的普及带来了对专门API的需求,以处理大量的实时数据流。 -
API安全性的增强
随着API安全威胁的增加,更先进的安全措施(如AI驱动的威胁检测)将成为标准。 -
开放银行和金融API
金融行业正在经历API革命,开放银行API允许第三方开发者访问银行数据和服务。 -
区块链API
随着区块链技术的成熟,提供区块链功能的API将变得更加普遍。 -
实时API
WebSocket和Server-Sent Events等技术的使用将增加,以支持实时数据传输和事件驱动的架构。 -
API管理平台的演进
API管理平台将继续发展,提供更强大的分析、安全和开发者体验功能。
据Gartner的预测,到2025年,90%的现代应用将使用API作为其组成部分。这凸显了API在未来软件开发中的核心地位。[4]
总结
API已经成为现代软件开发不可或缺的一部分,它们连接了数字世界的各个角落,推动了创新和效率的提升。从简单的数据交换到复杂的系统集成,API在各个领域都发挥着关键作用。
在本文中,我们深入探讨了API的定义、工作原理、类型以及实际应用案例。我们还讨论了API开发面临的挑战和最佳实践,以及未来的发展趋势。关键要点包括:
- API是应用程序之间通信的桥梁,使不同系统能够无缝集成。
- RESTful API是当前最流行的API类型,遵循一套标准化的设计原则。
- API在社交媒体、支付处理、地图服务等多个领域有广泛应用。
- API开发面临安全性、性能、版本控制等挑战,需要遵循最佳实践来应对。
- API的未来趋势包括API-First设计、GraphQL的兴起、AI和IoT集成等。
随着数字化转型的深入,API的重要性只会继续增加。无论是开发者、企业还是最终用户,都将从API带来的创新和效率中受益。掌握API开发和使用的技能,将成为未来技术领域的关键竞争力。
最后,值得注意的是,API生态系统正在不断演变。保持对新趋势和最佳实践的关注,将有助于开发者和企业在这个快速变化的领域保持竞争力。随着技术的进步,我们可以期待看到更多创新的API应用,进一步推动数字世界的发展。
相关文章:

【软件基础知识】什么是 API,详细解读
想象一下,你正在使用智能手机上的天气应用。你打开应用,瞬间就能看到实时天气、未来预报,甚至是空气质量指数。但你有没有想过,这些数据是如何神奇地出现在你的屏幕上的?答案就在三个字母中:API。 API,全称Application Programming Interface(应用程序编程接口),是现代软件世…...

计算机四级-计算机网络
一、基础知识 1.对计算机网络发展具有重要影响的广域网是:ARPANET 随机争用型的介质访问控制方法起源于:ALOHANET 2.计算机网络发展阶段: A)第一阶段的主要成果是计算机技术与通信技术的结合 B)第二阶段的主要成果…...

【linux 获取时间】
linux 获取时间接口 我们在开发调试过程中,可能遇到一些和调用时序相关的问题,为了查看哪个步骤先调用,哪个步骤后调用,我们可以使用函数打印或者主动trace堆栈…但是有的时候我们需要排查2个接口调用的时间间隔,我们可…...

Dockerfile部署xxljob
使用Dockerfile部署xxljob 1. 背景 我们在使用定时任务调度时,通常会使用xxljob容器化部署xxljob,通常使用 docker pull xuxueli/xxl-job-admin:2.4.0 拉取镜像并启动容器。这种方式对于x86架构服务器来说,没有任何问题。但是在arm架构的服…...

Conda新建python虚拟环境问题
Conda新建python虚拟环境问题: 【问题1】 conda create --name yolov8 python3.10 -y Retrieving notices: …working… done Channels: defaults Platform: win-64 Collecting package metadata (repodata.json): failed UnavailableInvalidChannel: HTTP 404 NO…...

这几个优秀的工具网站真心值得推荐——搜嗖工具箱
即时工具 https://www.67tool.com/ 这是一个专注提升效率的办公工具网站;这也是一个拥有260多款自研在线工具和200多个客户端离线工具的服务网站;这还是一个可以满足包括视频处理、音频处理、图片处理、文档处理、文档转换、办公辅助、图表生成、文本工…...

ESP32开发 -- VSCODE+PlatformIO环境安装
参看官网安装:PlatformIO IDE for VSCode 一、安装PlatformIO IDE 参看:日常生活小技巧 – Visual Studio Code 简单使用 扩展中搜索platformIO IDE 当安装完提示重启之后。 打开一个要创建新工程的文件夹: 点击 Create New Project&…...

MySQL--导入SQL文件(命令行导入)
MySQL--导入SQL文件 一、前言二、导入SQL文件 一、前言 用可视化编辑工具编写,并且在控制台输入命令行在MySQL中导入SQL文件。 在导入SQL文件之前查看了目前存在的数据库 **目标:**在可视化编辑工具(这里以word文档为例)中编写SQL语句&…...

【C#基础】函数传参大总结
目录 前言参数是值类型的情况1. 按值传递(Pass by Value)2. 按引用传递(Pass by Reference)使用 ref使用 in 3. 输出参数传递(Output Parameters)参数修饰符对比小结 参数是引用类型的情况1. 按值传递类对象…...

初学51单片机之IO口上下拉电阻相关
本案本来是描述一下I2C总线的,在此之前推荐一下B站一个UP关于时序图的讲解 I2C入门第一节-I2C的基本工作原理_哔哩哔哩_bilibili 不过在描述I2C前先简单的探讨下51单片机IO口下拉电阻的基本情况,事实上这个问题困扰笔者很长时间了,这次也是一…...

Resnet50网络——口腔癌病变识别
一 数据准备 1.导入数据 import matplotlib.pyplot as plt import tensorflow as tf import warnings as w w.filterwarnings(ignore) # 支持中文 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负…...

Python 中自动打开网页并点击[自动化脚本],Selenium
要在 Python 中自动打开网页并点击第一个 <a> 标签,你需要使用 Selenium,它可以控制浏览器并执行像点击这样的操作。requests 和 BeautifulSoup 只能获取并解析网页内容,但不能进行网页交互操作。 步骤: 安装 Selenium安装…...

Spring Boot-自动配置问题
**### Spring Boot自动配置问题探讨 Spring Boot 是当前 Java 后端开发中非常流行的框架,其核心特性之一便是“自动配置”(Auto-Configuration)。自动配置大大简化了应用开发过程,开发者不需要编写大量的 XML 配置或是繁琐的 Jav…...

CS61B学习 part1
本人选择了2018spring的课程,因为他免费提供了评分机器,后来得知2021也开放了,决定把其中的Lab尝试一番,听说gitlab就近好评,相当有实力,并借此学习Java的基本知识,请根据pku的cswiki做好评分机…...

我Github的问题解决了!
看的这篇,解决使用git时遇到Failed to connect to github.com port 443 after 21090 ms: Couldn‘t connect to server_git couldnt connect to server-CSDN博客 之前想推送的能推送了,拉取的也能取了。 一、如果是在挂着梯子的情况下拉取或者推送代码…...

Pytorch构建神经网络多元线性回归模型
1.模型线性方程y W ∗ X b from torch import nn import torch#手动设置的W参数(待模型学习),这里设置为12个,自己随意设置weight_settorch.tensor([[1.5,2.38,4.22,6.5,7.2,3.21,4.44,6.55,2.48,-1.75,-3.26,4.78]])#手动设置…...

如何基于Flink CDC与OceanBase构建实时数仓,实现简化链路,高效排查
本文作者:阿里云Flink SQL负责人,伍翀,Apache Flink PMC Member & Committer 众多数据领域的专业人士都很熟悉Apache Flink,它作为流式计算引擎,流批一体,其核心在于其强大的分布式流数据处理能力&…...

ActiveMQ、RabbitMQ 和 Kafka 在 Spring Boot 中的实战
在现代的微服务架构和分布式系统中,消息队列 是一种常见的异步通信工具。消息队列允许应用程序之间通过 生产者-消费者模型 进行松耦合、异步交互。在 Spring Boot 中,我们可以通过简单的配置来集成不同的消息队列系统,包括 ActiveMQ、Rabbit…...

火语言RPA流程组件介绍--获取关联元素
🚩【组件功能】:获取指定元素的父元素、子元素、相邻元素等关联信息 配置预览 配置说明 目标元素 支持T或# 默认FLOW输入项 通过自动捕获工具捕获(选择元素工具使用方法)或手动填写网页元素的css,xpath,指定对应网页元素作为操作目标 关联…...

【2024研赛】【华为杯E题】2024 年研究生数学建模比赛思路、代码、论文助攻
思路将在名片下群聊分享 高速公路应急车道紧急启用模型 高速公路拥堵现象的原因众多,除了交通事故外,最典型的就是部分路段出现瓶颈现象,主要原因是车辆汇聚,而拥堵后又容易蔓延。高速公路一些特定的路段容易形成堵点࿰…...

Linux——K8s集群部署过程
1、环境准备 (1)配置好网络ip和主机名 control: node1: node2: 配置ip 主机名的过程省略 配置一个简单的基于hosts文件的名称解析 [rootnode1 ~]# vim /etc/hosts // 文件中新增以下三行 192.168.110.10 control 192.168.110.11 node1 1…...

二.Unity中使用虚拟摇杆来控制角色移动
上一篇中我们完成了不借助第三方插件实现手游的虚拟摇杆,现在借助这个虚拟摇杆来实现控制角色的移动。 虚拟摇杆实际上就给角色输出方向,类似于键盘的WSAD,也是一个二维坐标,也就是(-1,1)的范围,将摇杆的方向进行归一化…...

基于SpringBoot的旅游管理系统
系统展示 用户前台界面 管理员后台界面 系统背景 近年来,随着社会经济的快速发展和人民生活水平的显著提高,旅游已成为人们休闲娱乐、增长见识的重要方式。国家积极倡导“全民旅游”,鼓励民众利用节假日外出旅行,探索各地自然与人…...

Linux套接字
目录标题 套接字套接字的基本概念套接字的功能与分类套接字的使用流程套接字的应用场景总结套接字在不同操作系统中的实现差异有哪些?如何优化套接字编程以提高网络通信的效率和安全性?原始套接字(SOCK_RAW)的具体应用场景和使用示…...

软件测试面试题(5)——二面(游戏测试)
没想到测试题做完等了会儿就安排面试了,还以为自己会直接挂在测试题,这次面试很刺激。测试题总体来说不算太难,主要是实操写Bug那里真没经历过,所以写的很混乱。 我复盘一下这次面试的问题,这次面试是有两个面试官&…...

C#基于SkiaSharp实现印章管理(8)
上一章虽然增加了按路径绘制文本,支持按矩形、圆形、椭圆等路径,但测试时发现通过调整尺寸、偏移量等方式不是很好控制文本的位置。相对而言,使用弧线路径,通过弧线起始角度及弧线角度控制文本位置更简单。同时基于路径绘制文本时…...

信通院发布首个《大模型媒体生产与处理》标准,阿里云智能媒体服务作为业界首家“卓越级”通过
中国信通院近期正式发布《大模型驱动的媒体生产与处理》标准,阿里云智能媒体服务,以“首批首家”通过卓越级评估,并在9大模块50余项测评中表现为“满分”。 当下,AI大模型的快速发展带动了爆发式的海量AI运用,这其中&a…...

AI学习指南深度学习篇-Adam的Python实践
AI学习指南深度学习篇-Adam的Python实践 在深度学习领域,优化算法是影响模型性能的关键因素之一。Adam(Adaptive Moment Estimation)是一种广泛使用的优化算法,因其在多种问题上均表现优异而被广泛使用。本文将深入探讨Adam优化器…...

08_React redux
React redux 一、理解1、学习文档2、redux 是什么吗3、什么情况下需要使用 redux4、redux 工作流程5、react-redux 模型图 二、redux 的三个核心概念1、action2、reducer3、store 三、redux 的核心 API1、getState()2、dispatch() 四、使用 redux 编写应用1、求和案例\_redux 精…...

2024华为杯研究生数学建模竞赛(研赛)选题建议+初步分析
难度:DE<C<F,开放度:CDE>F。 华为专项的题目(A、B题)暂不进行选题分析,不太建议大多数同学选择,对自己专业技能有很大自信的可以选择华为专项的题目。后续会直接更新A、B题思路&#…...