开发 k8s 管理平台 - k8sailor 05. RESTFul API 接口规范与请求应答约定

简介: 开发 k8s 管理平台 - k8sailor 05. RESTFul API 接口规范与请求应答约定

开发 k8s 管理平台 - k8sailor 05. RESTFul API 接口规范与请求应答约定

原文地址: https://tangx.in/posts/books/k8sailor/chapter01/05-design-restful-api-and-response-data/
tag: https://github.com/tangx/k8sailor/tree/feat/05-design-restful-api-and-response-data

强烈建议使用 RESTful 风格来设计 API 文档。

RESTful api

# kubectl create deployment nginx-tools --image nginx:alpine --output=yaml --dry-run=client
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx-tools
  name: nginx-tools
# ... 省略

# kubectl create namespace  hello --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: hello
# ... 省略

可以看到, k8s api 中都有一个对应的 kind 描述资源类型, 这个正好符合 RESTful 中资源定位的需求。

大概就是这样。

# 所有资源操作
GET     /appname/v0/:resources

## 特定志愿操作
GET     /appname/v0/:resources/:name?params
POST    /appname/v0/:resources/:name?params
DELETE  /appname/v0/:resources/:name
# 获取所有 deployemnt 信息, 默认会设计一些限定条件, 比如说 namespace=default
GET /k8sailor/v0/deployments

# 针对特定名称资源的 deployment 操作
GET /k8sailor/v0/deployments/my-nginx-01?namespace=kube-system
DELETE /k8sailor/v0/deployments/my-nginx-01?namespace=default

回到代码中

// RootGroup 向 httpserver 注册根路由
func RootGroup(base *gin.RouterGroup) {
// ... 省略

    // 创建 deployment 路由组
    deployment := v0.Group("/deployments")
    {
        // 针对 所有 deployment 操作, 这里还没有绑定 handler
        deployment.GET("/")

        // 针对特定的命名资源操作
        // 直接返回 找不到
        deployment.GET("/:name", func(c *gin.Context) {
            err := errors.New("deployment not found")
            httpresponse.Error(c, http.StatusNotFound, err)
        })
    }
}

http response

对于应答消息, 不建议将 成功失败 内容分成两个不同的 结构体 发送给客户端, 否则客户端在使用的时候还需要在判断应答的结构体属于哪种。 如果服务端一旦修改了应答结构体,客户端可能就崩掉了。

// 成功
{
    "data":"success data"
}

// 失败
{
    "error":"error message"
}

因此需要对 http 相应进行一些简单的封装。

  1. 把应答消息封装成一个标准结构, 具体消息信息用某个字段占有。

    • data 表示成功消息
    • error 表示失败消息
  2. http status code 本身就对 行为和资源 的有了一个明确的描述, 并且是通用的。 因此最好能将 response codehttp status code 之间建立一个映射关系, 这样通过 code 也快速的判断 response 状态和内容。

    • 这里只是简单的将 http status code 用作 response code 。
    • 如果 http code 是 200, 则 response code 强制设置成 0。 一般情况下,非 0 表示异常。
func Common(c *gin.Context, code int, data interface{}, err error) {
    _err := ""
    if err != nil {
        _err = err.Error()
    }

    // 强制设置
    if code == 200 {
        code = 0
    }

    resp := Response{
        Code:  code,
        Data:  data,
        Error: _err,
    }

    c.JSON(code, resp)
}

文献

运行起来

启动服务

cd cmd/k8sailor && go run . httpserver

[GIN-debug] GET    /k8sailor/v0/ping         --> github.com/tangx/k8sailor/cmd/k8sailor/apis.RootGroup.func1 (3 handlers)
[GIN-debug] GET    /k8sailor/v0/deployments/ --> github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1 (2 handlers)
[GIN-debug] GET    /k8sailor/v0/deployments/:name --> github.com/tangx/k8sailor/cmd/k8sailor/apis.RootGroup.func2 (3 handlers)
[GIN-debug] Listening and serving HTTP on :8088

请求接口

这里推荐一个 vscode 下比较好用的 http client REST client, 类似 postman

https://marketplace.visualstudio.com/items?itemName=humao.rest-client
### GET deployment by name
GET http://127.0.0.1:8088/k8sailor/v0/deployments/my-nginx-01

请求结果, 资源找不到, http status code, data code 等都符合预期。

HTTP/1.1 404 Not Found
Content-Type: application/json; charset=utf-8
Date: Fri, 24 Sep 2021 03:18:34 GMT
Content-Length: 55
Connection: close

{
  "code": 404,
  "data": null,
  "error": "deployment not found"
}
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
9月前
|
JSON 监控 API
掌握使用 requests 库发送各种 HTTP 请求和处理 API 响应
本课程全面讲解了使用 Python 的 requests 库进行 API 请求与响应处理,内容涵盖环境搭建、GET 与 POST 请求、参数传递、错误处理、请求头设置及实战项目开发。通过实例教学,学员可掌握基础到高级技巧,并完成天气查询应用等实际项目,适合初学者快速上手网络编程与 API 调用。
918 130
|
9月前
|
机器学习/深度学习 人工智能 供应链
唯品会 API 赋能,唯品会平台母婴商品用户需求洞察
在电商竞争激烈的环境下,唯品会作为中国领先品牌折扣平台,母婴类目正快速增长。通过开放API赋能,平台实现对母婴用户需求的深度洞察,涵盖数据整合、智能分析与个性化推荐。本文解析API如何驱动需求预测、情感分析与用户细分,助力平台提升运营效率与用户满意度,展望未来结合AI技术的潜力。
|
9月前
|
数据采集 人工智能 监控
唯品会 API 助力,唯品会平台美妆商品营销效果评估
在电商竞争激烈的环境下,唯品会作为领先特卖平台,其美妆品类的营销效果评估至关重要。通过唯品会 API,商家可实时获取商品、销售及用户行为数据,精准计算 ROI、转化率等关键指标,实现数据驱动的营销优化。本文介绍 API 的应用方法,并结合案例说明如何提升营销效率与销售表现。
|
9月前
|
JSON 搜索推荐 API
唯品会 API 接口:唯品会平台促销活动订单转化率提升
在电商中,促销活动是提升销量的重要手段。唯品会作为领先的品牌折扣平台,通过限时抢购、优惠券等方式吸引用户,但如何提升订单转化率仍是关键挑战。本文分析了用户决策延迟、信息不对称、个性化不足等问题,并介绍如何利用唯品会 API 接口实现数据驱动优化。通过实时数据同步、个性化推荐和自动化处理,API 可帮助开发者提升转化率,案例显示优化后转化率平均提升 20%-30%。同时,自动化流程降低了运营成本,增强了用户体验。集成唯品会 API,是实现高效促销、提升用户粘性的重要路径。
|
9月前
|
JSON 监控 测试技术
亚马逊:调用订单退款API自动化处理售后请求,缩短用户等待时间
在电商运营中,售后效率直接影响用户体验与平台声誉。亚马逊订单退款API为卖家提供自动化工具,通过编程方式高效处理退款请求,显著缩短用户等待时间。本文详解如何集成该API,实现退款流程自动化,提升响应速度与用户满意度。
|
9月前
|
人工智能 监控 小程序
【快递鸟】选择对接你的物流商城/小程序的物流API平台
在电商竞争日益激烈的今天,物流体验已成为影响用户留存和复购的关键因素。一个高效、透明、稳定的物流系统,对于物流商城或小程序来说至关重要。然而,自建物流查询系统需要对接众多快递公司,开发周期长、维护成本高、数据整合困难。
468 0
|
9月前
|
数据采集 搜索推荐 API
苏宁易购 API 接口:苏宁易购平台促销活动用户参与度分析
本文探讨如何利用苏宁易购API接口进行促销活动中的用户参与度分析。通过API获取数据,定义关键指标如点击率、转化率及参与度指数,并结合统计分析与回归模型揭示用户行为模式。以“618大促”为例,展示数据驱动的优化策略及其成效,提升用户粘性与销售转化。
|
9月前
|
人工智能 供应链 算法
苏宁易购 API 赋能,苏宁易购平台生鲜商品配送时效提升
在电商竞争激烈的当下,苏宁易购通过API技术提升生鲜配送效率,实现库存、物流与用户的智能协同,优化供应链管理,缩短配送时间,提高用户满意度,为未来技术融合奠定基础。
|
存储 Kubernetes API
深度剖析Kubernetes API Server三部曲 - part 1
欢迎来到深入学习Kubernetes API Server的系列文章,在本系列文章中我们将深入的探究Kubernetes API Server的相关实现。如果你对Kubernetes 的内部实现机制比较感兴趣或者正在进行Kubernetes 项目的相关开发工作,那么本系列文章能够为你提供一些帮助。
1689 0
|
存储 Kubernetes API
深度剖析Kubernetes API Server三部曲 - part 2
欢迎来到深入学习Kubernetes API Server的系列文章的第二部分。在上一部分中我们对APIserver总体,相关术语及request请求流进行探讨说明。在本部分文章中,我们主要聚焦于探究如何对Kubernetes 对象的状态以一种可靠,持久的方式进行管理。
1611 0