一文概览设计Web API 中的细节

简介: 一文概览设计Web API 中的细节

一、摘要

2015年左右,移动互联网的兴起,伴随着的是服务端的演进。之前我们还在写MVC下的整站,后来就变成了给前端、客户端提供接口。

因为接口是对外的,既然给别人使用,那总是有一些标准的,我做了简单的归纳,如果你刚开始写接口相关的工作,希望能给你启发。

面向人群:0-3年,初级工程师,不区分语言。

二、接口规范&版本更新

目前常见的有三种,分别是REST、RPC、GraphQL。

  1. REST,基于资源的调用方式,是关于资源的
  2. RPC,远程过程调用,是关于动作的
  3. GraphQL,是查询接口

对于一般的客户端调用服务端实现业务,推荐使用REST,根据实际公司业务,再做微调。

  1. 完整的REST规范,针对对资源的动作不同,使用GET、PUT、POST、DELETE
  2. 简化的REST,只保留GET、POST

具体看团队成员情况,判断使用那种风格。

那么,一个基于REST风格的接口地址应该是这样的。

/v1/user/info
get 获取信息
post 更新信息

如何设计REST风格的API,关注下面几个问题即可。

  • 操作的对象是名词,比如订单、资料
  • 通过HTTP方法GET/PUT/POST/DELETE映射对资源的操作

其中的版本管理,建议根据实际使用的框架进行路由配置。

/v1/user/info
/v2/user/info

这样做版本定义的好处在于,客户端对于调用接口的版本一目了然,很好管理。

此外,其他可以定义接口版本的方式还有下面几种,都是行得通的,我们可以根据自己的团队沟通进行选择。

  • 版本号放在Header中
  • 版本号带在URL的参数中,比如 /user/info?ver=2

三、异常处理

我们把错误处理分两个层面看,基于业务的和基于请求的。

首先讲基于请求的访问,比如未经授权的访问,对于修改用户资料的接口,我们需要拿到用户的身份,但是没有走登录的操作就没有对应的身份验证,关于身份验证后面单独讲。

基于请求的访问异常还包括

  • 错误的访问路径
  • 超出限制访问频率
  • 身份验证不通过
  • 没有对应操作的授权

以上类似的异常处理,通过HTTP状态码返回即可。客户端拿到HTTP状态码之后,直接进行处理。而接口返回的。

常用的HTTP状态码有

  • 200 OK
  • 301 永久重定向
  • 302 临时重定向
  • 304 文档内容没有改变
  • 400 参数错误
  • 404 对应资源不存在
  • 405 请求方法错误
  • 413 提交数据过大
  • 414 请求URI太长
  • 500 服务器内部错误
  • 502 网关无响应
  • 503 服务器维护或过载
  • 504 网关超时

以上的HTTP状态码基本涵盖一般业务中遇到的场景。

然后就是基于业务的异常处理,比如用户名或密码错误。

对于业务类型异常,我们一般放在响应内,例如

{
  "code": 0
}

而对于code在项目中对应业务的定义,一般给出接口文档中详细列出。

四、接口文档

早期的接口文档并没有自动化工具,都是手动写文档,上传到工作群文件中的。

后来出现了一些文档平台,具体可以看我之前总结的文章,虽然是几年前的了,现在看还是有参考价值的。

目前几种常见的线上接口文档管理平台的比较

但是,在开发工作之外,额外维护一份文档,对于开发人员来说也是一种负担,我们可以采用代码生成文档的方式解决这个问题。

这里推荐https://swagger.io/ ,此外Java推荐knife4j

五、身份验证

身份验证具体指的是登录用户的身份验证,由于接口调用是无状态的,所以我们需要通过传递能校验身份的字符串token

一般我们会在请求中把token放在Header里,自定义使用的key,比如x-token

对于客户端来说,token不需要自己的去解析,所以只需要存储并传递即可。

一般我们使用的加密方式为jwt,是形如下面的字符串

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

解密后的内部结构为

Header

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Signature

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

一般我们将用户的uid放在Payload中。

六、总结

本文从接口规范到身份验证,总体地介绍了如何写接口这一件事,希望能够给大家启发。

相关文章
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
60 4
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
166 3
|
15天前
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
39 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
|
1月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
53 1
|
1月前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
101 2
|
2月前
|
监控 负载均衡 API
Web、RESTful API 在微服务中有哪些作用?
在微服务架构中,Web 和 RESTful API 扮演着至关重要的角色。它们帮助实现服务之间的通信、数据交换和系统的可扩展性。
60 2
|
2月前
|
人工智能 搜索推荐 API
用于企业AI搜索的Bocha Web Search API,给LLM提供联网搜索能力和长文本上下文
博查Web Search API是由博查提供的企业级互联网网页搜索API接口,允许开发者通过编程访问博查搜索引擎的搜索结果和相关信息,实现在应用程序或网站中集成搜索功能。该API支持近亿级网页内容搜索,适用于各类AI应用、RAG应用和AI Agent智能体的开发,解决数据安全、价格高昂和内容合规等问题。通过注册博查开发者账户、获取API KEY并调用API,开发者可以轻松集成搜索功能。
|
2月前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
54 2
|
2月前
|
前端开发 API 开发者
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
48 3
|
2月前
|
移动开发 前端开发 JavaScript
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
298 0