003-REST-REST API 快速提示

本文探讨了RESTful API设计的关键原则,包括正确使用HTTP动词、提供清晰的资源命名、利用HTTP状态码、支持JSON和XML、创建细粒度资源及考虑链接性。遵循这些指导原则有助于构建更高效、易于理解和维护的Web服务。
无论技术上是 REST 还是不是 REST(根据前文提到的六个约束条件),这里有一些推荐的类似 REST 的概念。这六个快速提示将带来更好,更实用的服务。

使用 HTTP 动词使你的请求一目了然

API 使用者能够发送 GET, POST, PUT, DELETE 动词,这极大地增强了给定请求的清晰度。
通常,四个主要 HTTP 谓词使用如下:
GET:
    读取特定资源(通过标识符)或资源集合;
PUT:
    更新特定资源(通过标识符)或资源集合。如果资源标识符是事先已知的,也可以用于创建特定资源;
DELETE:
    通过标识符 remove/delete 特定资源;
POST:
    创建一个新资源。对于不适合其它类别的操作,也是一个包罗万象的动词;

注意:
    GET 请求不得更改任何底层资源数据。可能仍会发生更新数据的测量和跟踪,但 URI 标识的资源数据不应更改。

提供合理的资源名称

    制作出色的API是80%的艺术和20%的科学。创建表示合理资源的URL层次结构是艺术部分。拥有合理的资源名称(只是URL路径,例如/ customers / 12345 / orders)可以提高给定请求的清晰度。

    适当的资源名称为服务请求提供上下文,从而提高API的可理解性。资源通过其URI名称进行分层查看,为调用者提供友好,易于理解的资源层次结构,以便在其应用程序中使用。

以下是一些URL路径(资源名称)设计的快速规则:
    - 在你的网址中使用标识符而不是在查询字符串中传递参数,使用 URL 查询字符串参数非常适合过滤,但不适用于资源名称;
        1. good: /users/12345
        2. poor: /api?type=user&id=23
    - 利用 URL 的分层特性来暗示结构;
    - 为你的 clients 而不是为你的数据设计;
    - 资源名称为名词,避免使用动词作为资源名称,以提高清晰度。使用 HTTP 方法指定请求的谓词部分;
    - 在 URL 段中使用复数形式,以使用集合隐喻使你的 API URI 在所有 HTTP 方法中保持一致:
        1. 推荐  : /customers/33245/orders/8769/lineitems/1
        2. 不推荐: /customers/33245/order/8769/lineitem/1
    - 避免在 URL 中使用集合措辞。例如'customer_list'作为资源。使用复数来表示集合隐喻(例如,customers vs customer_list);
    - 在 URL 段中使用小写,用下划线('_')或连字符('-')分隔单词。有些服务器会忽略大小写,所以最好清楚;
    - 保持网址尽可能短,尽可能少的网段;

使用 HTTP 响应码指示请求状态

    响应状态代码是 HTTP 规范的一部分。 它们中有很多可以解决最常见的情况。 本着使 RESTful 服务包含HTTP规范的精神,我们的 Web API 应该返回相关的 HTTP 状态代码。 例如,当成功创建资源时(例如,来自POST请求),API应该返回HTTP状态代码201.这里有可用的 [HTTP 状态代码列表](https://www.restapitutorial.com/httpstatuscodes.html),其列出了每个的详细描述。
    
“Top 10” HTTP响应状态代码的建议用法如下:
    - 200 OK:
        一般成功状态码。这是最常见的状态码,用于表示请求成功;
    - 201 CREATED:
        成功创建(POST, PUT)。将 Location header 设置为包含指向新创建的资源的链接(POST)。响应主体内容可能存在也可能不存在;
    - 204 NO CONTENT:
        表示成功,但响应正文中没有任何内容,通常用于 DELETE 和 PUT 操作;
    - 400 BAD REQUEST:
        完成请求是的一半错误会导致无效状态。域验证错误,缺少数据等;
    - 401 未经授权:
        缺少或无效的身份验证 token的错误代码响应;
    - 403 FORBIDDEN:
        当用户未被授权执行操作或资源由于某种原因(例如时间限制)不可用时的错误码;
    - 404 NOT FOUND:
        在找不到所请求的资源时使用,是否不存在,或者是否存在 401 或 403,出于安全原因,服务想要屏蔽;
    - 405 METHOD NOT ALLOWED:
        用于指示请求的 URL 存在,但请求的 HTTP 方法不适用。例如,POST/users/12345,其中 API 不支持以这种方式创建资源(使用提供的 ID)。返回 405 时必须设置 Allow HTTP        header 以指示支持的 HTTP 方法。在前一种情况下,header 看起来像“Allow: GET, PUT, DELETE"
    - 409 CONFICT:
        每当通过履行请求导致资源冲突时。重复条目,例如尝试使用相同信息创建两个客户,以及在不支持联级删除时删除根对象等;
    - 500 INTERNAL SERVER ERROR:
        永远不要故意返回。服务器端抛出异常时的常规 catch-all 错误。仅将此用于调用者无法解决的错误。

提供 JSON 和 XML

    除非您处于高度标准化且受监管的行业,需要XML,架构验证和命名空间,并提供 JSON 和 XML,除非成本惊人,否则请支持JSON支持。 理想情况下,让调用者使用 HTTP Accept header 在格式之间切换,或者只是在URL上将 .xml 的扩展名更改为 .json。
    
    请注意,一旦我们开始讨论 XML 支持,我们就会开始讨论用于验证,命名空间等的模式。除非您的行业需要,否则请尽量避免支持所有这些复杂性。 JSON 旨在简化,简洁和实用。 如果可以的话,让你的 XML 看起来像那样。
    
    换句话说,使返回的 XML 更像 JSON  - 简单易读,不存在架构和命名空间细节,只有数据和链接。 如果它最终比这更复杂,那么 XML 的成本将是惊人的。 根据我的经验,过去几年中没有人使用过 XML 响应,消费太昂贵了。
    
    请注意,如果您需要这样的东西,[JSON-Schema](https://json-schema.org/) 提供了架构式验证功能。

创建细粒度资源

    在开始时,最好创建模拟系统的底层应用程序域或数据库体系结构的 API。 最终,您将需要使用多个底层资源的聚合服务来减少干扰。 但是,稍后从单个资源创建更大的资源比从较大的聚合创建细粒度或单个资源要容易得多。 让自己轻松一点,从易于定义的小型资源开始,为这些资源提供 CRUD 功能。 您可以稍后创建那些 use-case-iruebted(面向用例),减少 chattiness-reducing(繁琐降低) 的资源。

考虑连接性

    REST的原则之一是连通性 - 通过超媒体链接(搜索 HATEOAS)。 虽然没有它们,服务仍然有用,但在响应中返回链接时,API 会变得更具自我描述性和可发现性。 至少,“自我”链接引用会通知客户端如何检索数据。 此外,利用 HTTP Location header 包含通过 POST(或PUT)创建资源的链接。 对于在支持分页的响应中返回的集合,“first”,“last”,“next”和“prev”链接至少是非常有用的。
    
关于链接格式,有很多。 HTTP Web链接规范([RFC5988](https://tools.ietf.org/search/rfc5988))解释了如下链接:
链接是由国际化资源标识符(IRI)[[RFC3987](https://tools.ietf.org/search/rfc3987)]标识的两个资源之间的类型连接,包括:
    - 上下文 IRI;
    - 链接关系类型;
    - 目标 IRI,and;
    - 可选地目标属性;

    链接可以被视为“ {context IRI} 在 {target IRI} 具有 {relation type} 资源的形式的声明,其具有{target attributes} ”。
    
    至少,按照规范中的建议放置 HTTP 链接头中的链接,或者在 JSON 表示中包含此 HTTP 链接样式的 JSON 表示(例如Atom样式链接,请参阅:[RFC4287](https://tools.ietf.org/search/rfc4287#section-4.2.7))。 之后,随着 REST API变得更加成熟,您可以在更复杂的链接样式中进行分层,例如 [HAL + JSON](https://stateless.co/hal_specification.html),[Siren](https://github.com/kevinswiber/siren),[Collection + JSON](https://amundsen.com/media-types/collection/), 和 / 或 [JSON-LD](https://json-ld.org/) 等。
本系统采用Python编程语言中的Flask框架作为基础架构,实现了一个面向二手商品交易的网络平台。该平台具备完整的前端展示与后端管理功能,适合用作学术研究、课程作业或个人技术能力训练的实际案例。Flask作为一种简洁高效的Web开发框架,能够以模块化方式支持网站功能的快速搭建。在本系统中,Flask承担了核心服务端的角色,主要完成请求响应处理、数据运算及业务流程控制等任务。 开发工具选用PyCharm集成环境。这款由JetBrains推出的Python专用编辑器集成了智能代码提示、错误检测、程序调试与自动化测试等多种辅助功能,显著提升了软件编写与维护的效率。通过该环境,开发者可便捷地进行项目组织与问题排查。 数据存储部分采用MySQL关系型数据库管理系统,用于保存会员资料、产品信息及订单历史等内容。MySQL具备良好的稳定性和处理性能,常被各类网络服务所采用。在Flask体系内,一般会配合SQLAlchemy这一对象关系映射工具使用,使得开发者能够通过Python类对象直接管理数据实体,避免手动编写结构化查询语句。 缓存服务由Redis内存数据库提供支持。Redis是一种支持持久化存储的开放源代码内存键值存储系统,可作为高速缓存、临时数据库或消息代理使用。在本系统中,Redis可能用于暂存高频访问的商品内容、用户登录状态等动态信息,从而加快数据获取速度,降低主数据库的查询负载。 项目归档文件“Python_Flask_ershou-master”预计包含以下关键组成部分: 1. 应用主程序(app.py):包含Flask应用初始化代码及请求路径映射规则。 2. 数据模型定义(models.py):通过SQLAlchemy声明与数据库表对应的类结构。 3. 视图控制器(views.py):包含处理各类网络请求并生成回复的业务函数,涵盖账户管理、商品展示、订单处理等操作。 4. 页面模板目录(templates):存储用于动态生成网页的HTML模板文件。 5. 静态资源目录(static):存放层叠样式表、客户端脚本及图像等固定资源。 6. 依赖清单(requirements.txt):记录项目运行所需的所有第三方Python库及其版本号,便于环境重建。 7. 参数配置(config.py):集中设置数据库连接参数、缓存服务器地址等运行配置。 此外,项目还可能包含自动化测试用例、数据库结构迁移工具以及运行部署相关文档。通过构建此系统,开发者能够系统掌握Flask框架的实际运用,理解用户身份验证、访问控制、数据持久化、界面动态生成等网络应用关键技术,同时熟悉MySQL数据库运维与Redis缓存机制的应用方法。对于入门阶段的学习者而言,该系统可作为综合性的实践训练载体,有效促进Python网络编程技能的提升。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值