开发 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"
}
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
Java 网络架构 Spring
springboot中restful风格请求的使用
本文介绍了在Spring Boot中如何使用RESTful风格的请求,包括创建HTML表单页面、在application.yaml配置文件中开启REST表单支持、编写Controller层及对应映射处理,并进行服务启动和访问测试。HTML表单默认只支持GET和POST请求,因此对于DELETE和PUT请求,需要使用隐藏域`_method`来支持。
springboot中restful风格请求的使用
|
1月前
|
API
阿里云短信平台API错误码提示错误天级流控显示小时级错误码
阿里云短信平台API错误码提示错误天级流控显示小时级错误码
|
1月前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
本文介绍了云原生环境下Kubernetes集群的安全问题及攻击方法。首先概述了云环境下的新型攻击路径,如通过虚拟机攻击云管理平台、容器逃逸控制宿主机等。接着详细解释了Kubernetes集群架构,并列举了常见组件的默认端口及其安全隐患。文章通过具体案例演示了API Server 8080和6443端口未授权访问的攻击过程,以及Kubelet 10250端口未授权访问的利用方法,展示了如何通过这些漏洞实现权限提升和横向渗透。
159 0
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
|
1月前
|
Kubernetes Docker 微服务
微服务实践k8s&dapr开发部署实验(1)服务调用(一)
微服务实践k8s&dapr开发部署实验(1)服务调用(一)
49 2
|
1月前
|
Kubernetes JavaScript 前端开发
k8s学习--chart包开发(创建chart包)
k8s学习--chart包开发(创建chart包)
104 1
|
2月前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
2月前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
110 6
|
2月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
2月前
|
缓存 测试技术 API
电商平台 API 接入技术要点深度剖析
本文介绍了高效使用电商平台API的关键步骤。首先,深入理解API文档,明确功能权限与参数格式要求;其次,选择合适的接入方式,如HTTP/HTTPS协议和RESTful API;接着,实施身份验证与授权机制,确保数据安全传输;此外,还需关注性能优化、安全防护、监控与日志记录,以提升系统稳定性和响应速度;最后,进行充分测试与调试,并关注API版本更新,确保长期兼容性。
|
2月前
|
JSON 供应链 数据挖掘
抖音商品sku数据接口(Dy.item_sku)丨抖音平台API数据接口指南
抖音商品详情SKU数据接口(Dy.item_sku)由抖音开放平台提供,用于获取商品详细信息,包括名称、价格、图片等。开发者需注册并获取权限,遵循API限制,通过商品ID调用接口,解析JSON格式返回数据。该接口广泛应用于商品展示、库存管理、订单处理及数据分析,助力提升工作效率和用户体验。使用时需遵守平台规则,确保数据安全。
下一篇
无影云桌面