借鉴一个比较标准的后端restfulapi

glorizz glorizz     2022-12-23     605

关键词:

我们制定的 API 规范,使用了微服务架构所以做了一些改进,我们更偏向使用 http code 标识,不然需要自己处理成功或失败的逻辑,在 200 内再包一层显得啰嗦;并且微服务系列都不支持,Feign,监控等都需要自己改造。

当逻辑错误时,返回 http code 400,body 体内是具体的错误原因,也可以加上自定义的状态码,解决了 http code 不能满足业务状态的需求

### 接口命名规范

**前端对接时如果发现后端提供的接口不符合规范有权拒接(包括后端对接爬虫),如接入了不符合规范的接口,需要及时整改**

为了便于管理接口,我们将接口分为三类:
1. `public`: 不用登录即可访问的资源,举例:登录接口 `https://api.buffdj.com/public/quick_login`
2. `api`: 需要用户登录才能进行访问的接口,举例:获取用户详细信息接口: `https://api.buffdj.com/api/user/info?id=666`
3. `rpc`: 微服务之间相互调用才能用的,外部不允许访问.举例: 调用pay 微服务的 pay 接口:`https://api.buffdj.com/rpc/service-pay/pay?param=666`


### Restful 风格的 API
1. `get`:用于获取资源
2. `post`:用于提交新增一个资源
3. `put`:用于修改一个资源
4. `delete`:用于删除一个资源

**所有 API 返回值都必须是 application/json 形式,不允许字符串格式的返回值**

详细可参考 :[如何向其他人解释Restful](http://www.jianshu.com/p/e77d2f60aa5d)

我们的接口规范如下:
1. 获取书籍列表: `GET /api/book?size=10&page=1` size 和 page为分页参数
2. 获取书籍详情: `GET /api/book/info?id=666` id 为要查询的资源`主键`
3. 修改书籍信息: `PUT /api/book  `     body里边放更新依据`主键 id`,以及其他参数
4. 新增数据资源: `POST /api/book   `    body里放主键之外的参数
5. 删除书籍资源: `DELETE /api/book?id=666`  id 为要删除的资源`主键`

不使用 PathVariable 的原因是由于 Spring Could 系列的监控、追踪等软件还不兼容,会认为 GET /api/book/1, GET /api/book/2 是不同的 URL,所以我们不使用它

ps: 
1. 不要在路径里使用动词如: getXXX,queryXXX,findXXX,只需资源的名字即可,比如:获取书籍封面`GET /api/book/cover`,因为请求方法`GET` 就已经表明当前是获取资源而不是增加或者删除
2. 路径统一使用小写字母,多个单词使用`_`分割


###  Response Body 状态码规范
便于交流和协作,我们统一使用 HTTP 标准的状态码
* 200:本次请求成功,服务器已返回正确的数据在 body 里
* 4XX:出现业务逻辑异常或错误,包括:路径错误,参数错误,具体信息会在response body 中展示
* 5XX:这个是服务器出现了一些意料之外的错误

**找不到数据,查询数据结果为空的时候,需要返回404**

状态码4xx,具体的Response Body 数据结构

```

  "timestamp": 1512611487539,
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.web.bind.MethodArgumentNotValidException",
  "message": "Validation failed for object=‘person‘. Error count: 1"

```

### 关于控制前端弹出信息相关规范
控制前端弹出信息统一放在 Response Header 中

```
X-dialog-message: \u6d88\u606f\u63d0\u793a
X-dialog-type: warning
```

`X-dialog-message` 这个message 是后端根据该用户的语言返回对应的提示信息的 **Unicode 编码** ,因为 header 中不能存放中文

`X-dialog-type` 目前只有warning 和 error 类型,纯展示,后续根据产品需要可以扩充更多类型

### 网关与其他微服务之间一些约定


#### Header 中存放了一些用户的基本信息

`X-user-id` 根据前端传递的 token 解析出来的 userId 放在 header中的这个字段里传递给其他微服务,其他微服务通过 HttpServletRequest.header 来获取

`X-user-nickname` 获取用户昵称 

`X-user-phone` 获取用户手机号码,如果有的话

`X-user-photo` 获取用户头像 

`X-user-account` 获取用户账号,手机号码或者邮箱 

ps: Java 可直接通过 duiker 提供的 **HttpUtils** 中提供的方法获取用户基本信息

restfulapi

Restfulapi介绍网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备......)。因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信。这导致API... 查看详情

使用 MailDir 作为 Gnus 的后端

...状态,并且它们不会同步回gmail。有没有办法强制gnus使用标准的maildir标志?【问题讨论 查看详情

什么是适合 relayjs 的后端?

...后端。GraphQL/Relay会自动帮助存储查询吗?IE。如果我实现一个REST后端,它返回一个包含所有内容的jsonblob,Relay会处理数据查询优化吗?我不完全确定Relay和后端/数据库之间的抽象。【问题讨论】: 查看详情

如何实现一个网站多个域名:目的是为了一个共同的前端+多个多语言实现的后端

...使用node……但是这多个语言的后端在大的范围内,属于一个项目,共同完成一个大的产品,因此需要一个共同的前端……需要解决问题:1、一个前端分成多个模块,不同的模块可以使用不同的后端2、多个后端在前端实现上通过... 查看详情

restfulapi设计指南

...。这导致API构架的流行,甚至出现"APIFirst"的设计思想。RESTfulAPI是目前比较成熟的一套互联网应用程序的API设计理论。我以前写过一篇《理解RESTful架构》,探讨如何理解这个概念。今天,我将介 查看详情

restfulapi设计指南

...。这导致API构架的流行,甚至出现"APIFirst"的设计思想。RESTfulAPI是目前比较成熟的一套互联网应用程序的API设计理论。我以前写过一篇《理解RESTful架构》,探讨如何理解这个概念。今天,我将介 查看详情

瞧瞧人家用springboot写的后端api接口,那叫一个优雅

参考技术A假设实现一个注册用户的功能,在controller层,他会先进行校验参数,如下:以上代码有什么问题嘛?其实没什么问题,就是校验有点辣眼睛。正常的添加用户业务还没写,参数校验就一大堆啦。假设后来,又接了一个... 查看详情

低代码如何构建支持oauth2.0的后端webapi

OAuth2.0OAuth是一个安全协议,用于保护全球范围内大量且不断增长的WebAPI。它用于连接不同的网站,还支持原生应用和移动应用于云服务之间的连接,同时它也是各个领域标准协议中的安全层。(图片来源网络)接下来我们来仔... 查看详情

Paypal 使用 PHP 和 MySql 与我的后端集成

...时间】:2011-12-1518:17:18【问题描述】:我想使用网站支付标准集成贝宝。我有2个需求。首先,用户可以从我网站上影响价格的选项3下拉列表中进行选择。价格会根据通过从后端服务器查找正确值而选择的选项而变化。当用户选... 查看详情

restfulapi怎么使用session

参考技术AApp通常用restfulapi跟server打交道。Rest是stateless的,也就是app不需要像browser那样用cookie来保存session,因此用sessiontoken来标示自己就够了,session/state由apiserver的逻辑处理。如果你的后端不是stateless的restapi,那么你可能需要在... 查看详情

通过 PubSub 到 BigQuery 的后端“无法确定积压”

...ot;【发布时间】:2021-07-1602:44:01【问题描述】:所以我有一个将消息发布到pubsub的应用程序的后端。我有一个数据流可以将消息流式传输到bigquery,在那里我可以转储数据以获取其他有趣的东西。我有一系列的,它们确实有效。... 查看详情

低代码如何构建支持oauth2.0的后端webapi

OAuth2.0OAuth是一个安全协议,用于保护全球范围内大量且不断增长的WebAPI。它用于连接不同的网站,还支持原生应用和移动应用于云服务之间的连接,同时它也是各个领域标准协议中的安全层。(图片来源网络࿰... 查看详情

低代码如何构建支持oauth2.0的后端webapi

OAuth2.0OAuth是一个安全协议,用于保护全球范围内大量且不断增长的WebAPI。它用于连接不同的网站,还支持原生应用和移动应用于云服务之间的连接,同时它也是各个领域标准协议中的安全层。(图片来源网络࿰... 查看详情

在同一个域上分离后端和前端应用程序?

...一个单独的Web前端,该前端具有不同的技术堆栈,将调用RESTfulAPI。我们如何部署这两个应用程序以使它们具有相同的域名,其中一些url用于后端API,一些用于 查看详情

Ruby on Rails 中的后端管理

...】:我想为我在最后一刻附加到的RubyonRails应用程序构建一个真正快速而肮脏的管理后端。我查看了activescaffold和streamlined并认为它们都非常有吸引力并且它们应该很容易运行,但我不太明白如何将其中任何一个设置为后端管理页... 查看详情

发送交易和接收事件如何在以太坊区块链的后端工作

...【发布时间】:2021-04-2602:00:21【问题描述】:我正在从事一个以太坊项目,但我有一些疑问。我有一个通过web3.js连接到区块链的后端。为了连接到区块链,我使用了一个geth节点。我知道顺序是这样的:发送交易听事件 查看详情

Kubernetes 中的后端/前端服务之间没有通信

...布时间】:2020-12-1209:54:59【问题描述】:我正在尝试创建一个非常简单的Kubernetes项目,其中包括用Reactjs+nginx编写的前端客户端和用Java+Springboot编写的后端服务器之间的通信。我可以在本地与docker 查看详情

微服务内部通信

...务间的通信机制。在许多文章中,他们说微服务通常通过RESTfulAPI公开。但是,当您搜索互联网时,您总是会看到基于消息和事件的后端通信实现。所以我很困惑,RESTAPI是所有微服务的标准,还是我们可以看到没有REST端点的微服... 查看详情