⌨️ 第六章 Web技术与安全
📄 本篇一句话

API 是别人软件留的窗口(你递参数、它还结果),系统调用是进操作系统内核的大门(进程从「用户态」敲内核的门),混搭(Mashup)是把多个窗口拼出新服务——现代软件一大半是「调用」出来的。

📝 在本章的位置

上游:6-2 的库是进程内的窗口;4-5 的函数是「调用」的最小原型;树莓派课 gpiozero 背后就是 Linux 系统调用。下游:6-16 的 GitHub 托管 API、6-19 的漏洞常出在 API 参数校验上。

一、API:软件的窗口

API(Application Programming Interface)=一套约定好的函数入口:别人把复杂功能封装好,留出「参数怎么传、结果是什么形」的合同:

二、系统调用:进内核的大门

你的程序运行在用户态(权限受限);碰硬件、管内存、收网络包这些敏感活必须请内核代劳——「申请内核服务」这个动作就是系统调用(syscall):

你的代码 → 库函数(如 printf)→ 系统调用 write → 内核写屏幕/文件
# Python 一行背后各有系统调用(Linux 下 strace 可见全链)
import os
os.getpid()        # → syscall getpid(我是谁)
os.open            # → syscall openat(开文件)
f = open("/dev/null", "w")   # 打开文件 = 一次系统调用
f.write("x")                 # 写 = 又一次
f.close()                    # 关 = 再一次
print("三行 Python,三次以上 syscall")

三、混搭(Mashup):窗口拼出新大楼

把多个别人的 API 组合成自己的服务:

天气 API + 地图 API + 短信 API  →  「暴雨自动给小区业主发短信」服务

你的代码一行领域逻辑,八成能力来自窗口。2010 年代地图+房产+公交的混搭潮是它的高光;今天的「API 经济」里,一个 App 背后动辄几十个第三方 API——生态位思维:不做每个轮子,做组合的那个。

动手 Demo:调一次 Web API,亲手体验「窗口合同」

# 不用任何第三方库,标准库 urllib 调公共 API
from urllib.request import urlopen
import json

resp = urlopen("https://api.github.com/repos/python/cpython")   # GitHub 开放 API
data = json.loads(resp.read().decode())
for key in ("full_name", "stargazers_count", "forks_count", "language"):
    print(f"{key:>16}: {data[key]}")

看到什么算成功:打印出 CPython 仓库的星数(约 6 万+)、fork 数等实时数据——零安装、一个 URL 拿到 GitHub 的功能。

读结果:你没有 GitHub 的代码,只有它的 API 合同;GitHub 后台怎么存仓库(6-16)、怎么扛流量与你无关——API 的本质是能力的出租,不是代码的共享。

30 秒实验

Linux/树莓派上跑 strace -c python3 -c "print(1)"(Windows 换 Process Monitor 看文件/注册表访问)——输出里 openat/mmap/write 成百上千次:一个 hello world 背后是几百次系统调用。「程序直接跑在裸机上」是错觉,所有程序都活在内核的管家服务里。

常见误区

自测三问(点击展开) 1. **用户态和内核态为什么要分开?** 答:硬件是全体进程共享的,敏感操作必须经内核把关——否则谁都能破坏系统。 2. **API 合同里最关键的是什么?** 答:参数怎么传、结果什么形、错误怎么报——实现可以换,合同不能变。 3. **混搭服务的核心能力是什么?** 答:组合——把多个现成 API 拼成新服务,自己只写领域逻辑。

相关笔记