惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
V
V2EX
IT之家
IT之家
J
Java Code Geeks
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
GbyAI
GbyAI
D
Docker
S
Secure Thoughts
Recent Announcements
Recent Announcements
Webroot Blog
Webroot Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
云风的 BLOG
云风的 BLOG
博客园_首页
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Security Archives - TechRepublic
Security Archives - TechRepublic
酷 壳 – CoolShell
酷 壳 – CoolShell
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News | PayPal Newsroom
S
Security @ Cisco Blogs
I
InfoQ
Last Week in AI
Last Week in AI
SecWiki News
SecWiki News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
W
WeLiveSecurity
T
Troy Hunt's Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Attack and Defense Labs
Attack and Defense Labs
美团技术团队
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Scott Helme
Scott Helme
T
Tor Project blog
Know Your Adversary
Know Your Adversary
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
Recorded Future
Recorded Future
C
Cyber Attacks, Cyber Crime and Cyber Security
AI
AI
G
Google Developers Blog

ZDDHUB

PixelsMeasure 开发第二年总结 PixelsMeasure 开发一年总结 Swift/SwiftUI 踩坑记 为什么说 GPT 利好程序员 ChatGPT 编程实现 Web 数字水印 Web 数字水印探究 Micro Frontends for Mobile URL 加载系统(URL Loading System) Protocol Buffers GraphQL 从 0 到 1 开发一款 IOS 应用 - Swift MV* 软件设计架构 学习一个新技巧需要多久? 不停机数据库迁移 Rspec 如何 mock update 方法更新自己? Rails 使用 mysql2 出现的段错误 使用 Docker-compose 部署 Rails 应用到生产环境 Cocoa troubleshooting 独孤九剑 Dit (0x05) - 终端篇 Gem-based Jekyll theme 开发小记 Miscellaneous 前端手记 TodoMVC 之 Redux 篇 前端手记 TodoMVC 之 React 篇 前端手记 TodoMVC 之 CSS 篇 独孤九剑 Dit (0x04) - 测试篇 独孤九剑 Dit (0x03) - 缓存篇 英语小抄 LLDB debug Golang Make mistakes 大牛俱乐部上线啦 独孤九剑 Dit (0x02) - 数据结构篇 独孤九剑 Dit (0x01) - 总决 独孤九剑 Dit (0x00) - 我为什么要做 Dit 零值强制类型转换的使用 终端颜色输出重定向 Go语法简略 - 正则表达式 Makefile Go语法简略 - Duck框架探索 Go语法简略 - 依赖注入 Go语法简略 - web应用框架 Go语法简略 - 反射 Go语法简略 - 面向对象 Go语法简略 - goroutine Go语法简略 - 方法和接口 Go语法简略 - 基础篇 大牛 轻松科研 未来这几年 为 Android Studio 创建图标 Shell Git Vim 金庸答百问 论拖延症 Flex, A fast scanner generator 有理想的人 从虚拟到现实 常用视频转接口 Recognizer configuration on CentOS 整个世界清静了 《Python源码剖析》读书笔记
前端手记 TodoMVC 之 Server 篇
zddhub · 2016-09-27 · via ZDDHUB

在上一篇 前端手记 TodoMVC 之 React 篇 中实现了单页应用 TodoMVC,直接把数据存在前端,当刷新或者重新打开网站时,所有数据都会丢失。虽然对于 TodoMVC 这种应用,把数据缓存在前端是一个不错的选择,但以练习为目的,我还是打算特意为之,实现一个简单的 Server,提供 RESTful API,把 TodoMVC 相关的数据存储在后台。

为了 focus 在前端,这里用一个比较重的 web 框架 sails 来实现服务器端,并且尽量忽略实现细节。并根据实现的 RESTful API 来更新 前端手记 TodoMVC 之 React 篇 中的数据来源。

RESTful API

REST (Representational State Transfer 即 [资源] 表现层状态变化) 是 Fielding 于 2000 年在其博士论文中提出的互联网软件架构原则。如果一套服务的 API 设计架构符合 REST 原则,就称它为 RESTful API。本文的 API 也使用 REST 原则实现。更多关于 RESTful API 的资料看这里

  • RESTful API 设计思路
  1. 每个 URI 代表一种资源。由于 URI 是资源,所以应该用名词,而不是动词;
  2. 客户端和服务器之间,通过 HTTP/HTTPS 协议传递这种资源的某种表现层;
  3. 客户端通过 HTTP 动词,对服务器端的资源进行操作,实现“表现层状态的转化”。
  • 路径

路径 (url), 表示 API 的具体网址。在 RESTful 架构中,每个网址代表一种资源,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的“集合”(collection), 所以 API 中的名词也常用复数。TodoMVC server 的 url 应该设计成:

https://api.example.com/v1/todos

本例把 url 简化为

http://localhost:1337/todos
  • HTTP 动词

对于资源的具体操作类型,由 HTTP 动词表示。

GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
DELETE(DELETE):从服务器删除资源。
HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
  • 状态码(Status Codes)

服务器向用户返回的状态码和提示信息,所有状态码的第一个数字代表了响应的状态:

1xx 消息
2xx 成功
3xx 重定向
4xx 客户端错误
5xx 服务器错误

常见的状态码有以下一些(方括号中是该状态码对应的 HTTP 动词)。

200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

状态码的完全列表参见这里

TodoMVC API Design

TodoMVC 只实现一个 API

http://localhost:1337/todos{/todo_id}

只用 4 个最基本的 HTTP 动词 (GET、POST、PUT、DELETE) 来实现 Todos 的增删查改。

API GET POST PUT DELETE
/todos 获取 todos list 新建 todo 更新所有 todos 的状态 删除所有的 todos
/todos/todo_id 获取当前 todo - 更新当前 todo 删除当前 todo

返回的数据格式

[
  {
    "title": "What needs to be done?",
    "completed": "false",
    "createdAt": "2016-10-11T12:28:43.572Z",
    "updatedAt": "2016-10-11T12:28:43.572Z",
    "id": 1
  }
]

除了 'PUT /todos''DELETE /todos' 需要自己实现外,其它的 sails 已经帮你做到了。

注意:本例中实现的 API 通过 http://localhost:1337/todos{/todo_id} 对外提供服务。前端部署在 http://localhost:3000 上,会被同源策略所限制,为了简单,本例中实现的 API 的所有 HTTP 方法对所有网站开放 (Access-Control-Allow-Origin: *)。

TodoMVC with Server

替换在上一篇 前端手记 TodoMVC 之 React 篇 中实现的 TodoMVC Demo 的数据来源。使用 AJAX (Asynchronous Javascript and XML) 从 API 服务器请求数据,设置到 state 上触发 React 重绘。

数据从 API 获取之后,通过 props 层层传递到各个子 compoent。只修改了 TodoApp 这个顶级 component, 其它负责展示的 componnet 保持不变。 这种单向的数据传递方式,使得事情变得非常简单。

现在试试添加或编辑 todo 后,重新刷新界面,数据终于不丢失了。

本文所有代码都托管在 zddhub/todomvc 上, 你最好自己实现一遍,如果时间不允许,可以 checkout 代码到 bb1ecf17c7ab2835a55b2bd4cbae331bc208ec33 ,试试效果吧。

cd server
sails lift

cd react
node server.js # or open index.html

如果你喜欢这篇文章,欢迎赞赏作者以示鼓励