«

前端和后端是怎么连接的?API、RESTful、JSON、CORS都是什么?

时间:2026-4-28 00:59     作者:独元殇     分类: 前端技术


欢迎关注我的公众号,名叫「串串狗小刊」

今天讲一下全栈领域的几个概念,如果你是做全栈的,比如 react 等等一定得懂。也就是解释了前端、后端连接的最底层的几个知识。

比如 API、RESTful、JSON、CORS 等等。

API 是什么?

首先是 API ,全名叫:Application Programming Interface ,应用程序编程接口。

看起来很复杂,其实就是前端和后端约定好的一些做事方法。

两个团队一般是分开运作的,你不用关心我里面怎么实现【把用户的姓名、性别储存好】、【给你找出来那些人的会员快到期了】,你只需要得到一个链接就行,比如 https://example.com/member/expiring-list 这种。

这就是 API 。

或者你也可以理解为办事窗口的地址也行,你想查资料,去谷歌百度,你想看视频,去抖音,你想干什么什么,就使用什么什么链接...

什么是 RESTful

然后是 RESTful 。这个我们可能经常看到,但很多初学者不太懂这个是什么。

这是一种 API 风格,就像白酒里的 【酱香型白酒】一样。

你在 A 公司,建立 API 是一种风格,你被开除了,去了 B 公司,又是另一种风格.... 那大局上来看,肯定在程序员市场里、开源程序社区里,都是不适合的。因此就设立了这种风格。

其实很简单,就是 url 代表资源, HTTP 的方法代表动作。

比如拿 /tasks 举例,url 就只有一个 tasks,然后我们有很多类型的 HTTP 请求,比如 GET POST...

Url 一样,但干的事各不相同,比如:

GET    /tasks        → 获取所有任务
POST   /tasks        → 创建一个任务
PUT    /tasks/1      → 完全更新 id 为 1 的任务
PATCH  /tasks/1      → 局部更新 ID 为 1 的任务
DELETE /tasks/1      → 删除 id 为 1 的任务

说明一下:PUT 表示用新数据替换整个资源,而 PATCH 仅更新你发送的特定字段,其余部分保持不变。

然后我们在写文档的时候,就写 GET /tasks 或者 DELETE /tasks 就行了,合格的前端程序员就知道怎么回事了,能干什么了。

如果你不懂 RESTful ,你设计了个 https://example.com/api/getTasks 这种 ,/getTasks 、/deleteTasks ,就不是 RESTful ,就会不方便。

状态码

好的,现在我们有了 api url 了,知道去哪个【办事窗口】做事了,但是,你需要一个响应。

这就是状态码:

200 OK               → 请求成功,服务器返回所请求的数据
201 Created          → 资源已成功创建
400 Bad Request      → 请求有语法错误,服务器无法理解
401 Unauthorized     → 未授权,需要登录后才能访问
403 Forbidden        → 已登录但无权限访问该资源
404 Not Found        → 请求的资源不存在
500 Internal Error   → 服务器内部错误,导致请求未能完成

这是国际互联网标准的状态码。

常用的就是 404 ,200, 500 我们的前端代码可以根据不同的状态码,去搞不同的事。

JSON

前端和后端相互交换数据,常用的一种格式是 JSON 。

当然,还有很多格式,比如二进制、xml ..... 但更常用的是 JSON 。

它的优点只有一个,就是 人类阅读友好 。

{
  "id": 12345,
  "name": "张三",
  "email": "zhangsan@example.com",
  "age": 28,
  "isActive": true,
  "roles": ["admin", "editor"],
  "createdAt": "2024-04-27T10:15:30Z",
  "metadata": null
}

我们前端向后端发信息时,就类似这样:

fetch('/api/user', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' }, // this line matters
  body: JSON.stringify(
    {
      "id": 12345,
      "name": "张三",
      "email": "zhangsan@example.com",
      "age": 28,
      "isActive": true,
      "roles": ["admin", "editor"],
      "createdAt": "2024-04-27T10:15:30Z",
      "metadata": null
    }
  )
})

注意,我们一定得加上 application/json 等类似标志,这样后端才将其看做是 JSON 解析。

之后我们的后端,比如 express.JS 就这样解析你的信息,比如打印「张三」:

const express = require('express');
const app = express();

app.use(express.json()); // 解析 Content-Type: application/json 的请求体

app.post('/api/user', (req, res) => {
  const { id, name, email, age, isActive, roles, createdAt, metadata } = req.body;
  console.log(name); // "张三"
  res.json({ message: '接收成功', user: req.body });
});

app.listen(3000);

两个 await

如果你是个前端,你就知道异步。

在 JS 里,如果你给后端发信息,然后获取返回的信息,如果是调用 fetch ,你会发现有两个 await 。

// 第一个 await , 获取响应头信息
const res = await fetch('/api/user');   

// 第二个 await , 读取并解析响应体数据
const data = await res.json();          

哈哈哈,这里有个很有意思的知识!

你是不是以为,内容和 状态码 ,比如 200 、404 ,都是同一时刻到达你电脑的?

并不是,其实,后端给前端响应,并不一致。

你发一条请求,后端接到后,还没开始处理完整的数据内容,就会先把响应头发给你。这样很重要!!!

程序员喜欢抽象概念,我们往往误以为羽毛和铁球在月球能同时掉地上,那在地球上也能。

其实不是这样。响应是很快的,东西还在路上运输。

第一个 await 是响应,第二个才是服务器返回给你的信息。

这是两个时间点。

(因此会出现一个现象:有的时候,服务器返回了 404 ,但你还是收到了正确的东西,,,或者说你收到了 200 OK ,但是你却没收到货)

CORS

这个叫 【跨源资源共享】 。

互联网上的内容,只有有链接有权限,是随意访问的。但是 浏览器 里内置了个安全规则:网页不能跨域名读取响应。

这个不是 浏览器 使坏,而是保护用户。否则任何网站都能利用你在另一个网站的登录身份,干坏事了。

但是,如果你的资源,在服务器端,设置为 CORS (主要是通过响应头),就是允许 跨资源共享,那么浏览器就允许 CORS 运行的网页去访问你的内容了。

OPTIONS /api/tasks HTTP/1.1
Origin: http://localhost:5173     # 就像这个,运行这个域名访问
Access-Control-Request-Method: POST

【注意:CORS 是由浏览器强制执行的,不是服务器,一定要记清。防君子不防小人

如果 cors 运行所有网页,那么所有网页都能了,就比如我自己的网站里,很多 知乎 网站、新浪微博 网站的图片,而无法弄很多其他人网站里的图片。。 它们设置的 CORS 不同,知乎运行所有网站用它网站上的图片,像一个公益图床一样,速度还贼快。

基本就这个样子。

标签: 原创 API