软件定义网络基础---REST API的设计规范
一:REST API的设计
REST API是基于HTTP协议进行设计的,由HTTP动词+URI组成

(一)HTTP动词

(二)资源的原型
文档(Document):
文档是资源的单一表现形式;
集合(Collection):
集合是资源的一个容器(目录),可以向里面添加 资源(文档);
仓库(Store):
客户端管理的一个资源库,可以向仓库中新增资源 或者删除资源,或者从仓库中获取资源;
控制器(Controller):
可以执行一个方法,支持参数输入,结果返 回。
(三)RESTful设计中URI命名的规范
资源命名规范:
文档(Document)类型的资源用 名词单数命名
集合(Collection)类型的资源用 名词复数命名
仓库(Store)类型的资源用 名词复数命名
控制器(Controller)类型的资源用 **动词**命名
URI命名规范:
URI中有些字段可以是变量,在实际使用中可以按需替换,例如:
http://api.soccer.restapi.org/leagues/{leagueId}/teams/{teamId}/players/{playerId}
--- 其中:leagueId,teamId,playerId 是变量(数字,字符串等类型都可以)。
URI格式规范:
URI中分隔符“/”一般用来对资源层级的划分, ”/“不应该出现在URL的末尾;
URI中尽量使用连字符"-"代替下划线"_"的使用
例如: http://api.example.restapi.org/blogs/mark-masse/entries/this-is-my-first-post
URI中统一使用小写字母
URI中不要包含文件(或脚本)的扩展名
例如:不要出来.php或者.json之类的后缀名。
CRUD的操作不要体现在URI中
举例:

URI的query字段:
作为查询的参数补充,以标示一个唯一的资源
作为过滤条件使用,例如:
GET /users?role=admin
作为资源列表分页标示使用,例如:
GET /users?pageSize=&pageStartIndex=
(四)HTTP响应状态
REST API相关的响应状态码
2xx:操作成功
3xx:重定向
4xx:客户端错误
5xx:服务器错误
常用状态码
(“OK”) :一般性的成功返回,不可用于请求错误返回;
(“Created”) :资源被创建;
(“Accepted”) :Controller控制类资源异步处理的返回,仅表示请求已经收到;
(“No Content”) :可能会出现在PUT、POST、DELETE的请求中;
(“See Other”) :返回一个资源地址URI的引用,但不强制要求客户端获取该
地址的状态;
(“Bad Request”) :客户端一般性错误返回, 其它4xx的错误,也可以使用400,
具体错误信息可以放在body中;
(“Unauthorized”) :认证错误;
(“Not Found”) :找不到URI对应的资源;
Internal Server Error:服务器处理请求时发生了意外;
Service Unavailable:服务器无法处理请求,一般用于网站维护状态。
(五)元数据设计
HTTP Headers
Content-Type :body的数据格式,如Content-type: application/json,表示主类型是application,数据格式是json
Content-Length :body 数据体的大小
Last-Modified :资源最后被修改的时间戳
ETag :服务器端资源版本的标示
Location :在响应header中使用
Cache-Control, Expires, Date : 通过缓存机制提升接口响应性能
二:举例---实际SDN控制器中REST API的设计
(一)Floodlight REST API
Floodlight北向API对外提供了四个模块:OpenFlow流表、防火墙、ACL、多租户网络虚拟化。
ACL模块的API
查询所有ACL规则:GET http://<controller_ip>:8080/wm/acl/rules/json
添加ACL规则:POST http://<controller_ip>:8080/wm/acl/rules/json
删除一条ACL:DELETE http://<controller_ip>:8080/wm/acl/rules/json
删除所有ACL:GET http://<controller_ip>:8080/wm/acl/clear/json
使用POST动词具体创建ACL或是使用DELETE动词删除某条ACL时,还需要在json中带上需要传输的数据。例如以curl为例:
curl -X POST -d
'{"src-ip":"10.0.0.1/32","dst-ip":"10.0.0.2/32","action":"deny"}'
http://<controller_ip>:8080/wm/acl/rules/json
软件定义网络基础---REST API的设计规范的更多相关文章
- 软件定义网络基础---REST API概述
一:什么是REST API REST API是北向接口的主流设计方式 API是应用程序编程接口,是预先定义好的函数,可以供应用程序或开发人员访问调用 年 Roy Thomas Fielding 的博士 ...
- 软件定义网络基础---SDN控制平面
一:SDN控制平面 一个或多个SDN控制器组成,是网络的大脑. 对底层网络交换设备进行集中管理,状态监测.转发决策以及处理和调 度数据平面的流量: 通过北向接口向上层应用开放多个层次的可编程能 ...
- 软件定义网络基础---SDN的主流构架
一:基于不同标准的主流构架 二: ONF定义的SDN基本构架 (一) 四个平面.两大接口 三:四个平面 (一)数据平面 数据平面是由若干网元(Netword Element)构成,每个网元包括一个或多 ...
- 软件定义网络基础---OpenFlow概述
一:OpenFlow概述 二:交换机模型架构 (一)OpenFlow构架三个组成成分 三:OpenFlow 1.0版本 自OpenFlow1.0发布以来,目前已经有多个版本的OF规范版本被发布 四:O ...
- 软件定义网络基础---OpenFlow流表
一:流表 (一)流的概念 我们把同一时间经过同一网络中,具有某种共同特征或属性的数据,抽象为一个流 比如:我们将访问同一个地址的数据视为一个流 流一般是由网络管理员定义的,可以根据不同的流执行不同的策 ...
- 软件定义网络基础---NETCONF协议
netconf协议最早被作为网管协议被提出来的,与SNMP网管协议相比较:SNMP的优势在于网络设备的监测,在大规模网管应用中有很大不足,正是针对这种不足之处,提出了NETCONF协议 一:NETCO ...
- 软件定义网络基础---SDN数据平面
主要介绍SDN架构和转发模型 一:传统网络设备 (一)传统设备控制平面和数据平面 (二)数据平面的任务 数据平面对数据包的处理,主要通过查询由控制平面所生成的转发信息表来完成 (三)传统网络数据平面数 ...
- 软件定义网络基础---SDN的核心思想
一:SDN包含的核心思想:解耦,抽象,可编程 二:解耦 (一)SDN网络解耦思想 解耦是指将控制平面和数据平面进行分离,主要为了解决传统网络中控制平面和数据平面在物理上紧耦合导致的问题 控制平面和数据 ...
- 软件定义网络基础---SDN的发展
一:发展初期阶段--提出 架构.设计思想和实现技术的提出 二:发展中期阶段--企业加入,推动发展 三:SDN的发展趋势 (一)SD-DC SDN被大规模应用数据中心的服务器和设备部署运维,产生了软件定 ...
随机推荐
- Pyspark中遇到的 java.io.IOException: Not a file 和 pyspark.sql.utils.AnalysisException: 'Table or view not found
最近执行pyspark时,直接读取hive里面的数据,经常遇到几个问题: 1. java.io.IOException: Not a file —— 然而事实上文件是存在的,是 hdfs 的默认路径 ...
- OpenGL学习(1)—— 测试OpenGL环境是否搭建成功
一个用来验证OpenGL(glfw + glad)环境是否搭建成功的测试代码 内容为生成一个小窗口 #include <glad/glad.h> #include <GLFW/glf ...
- unix域套接字
对于本地通信,unix域套接字通信是internet通信速度的2倍
- 【POJ3714】Raid:平面最近点对
Description After successive failures in the battles against the Union, the Empire retreated to its ...
- 深度学习Keras框架笔记之Activation类使用
使用 keras.layers.core.Activation(activation) Apply an activation function tothe input.(貌似是把激活函数应用到输入数 ...
- jQuery 遍历 - 过滤
三个最基本的过滤方法是:first(), last() 和 eq(),它们允许您基于其在一组元素中的位置来选择一个特定的元素. 其他过滤方法,比如 filter() 和 not() 允许您选取匹配或不 ...
- [ARIA] Add aria-expanded to add semantic value and styling
In this lesson, we will be going over the attribute aria-expanded. Instead of using a class like .op ...
- [Debug] How to Debug a NestJs Backend using the Chrome Dev Tools
TO debug NestJS code with Chrome dev tool, we can run: node --inspect-brk dist/rest-api/src/main.js ...
- Kapitan 通用terraform&& kubernetes 配置管理工具
Kapitan 是一个通用的配置管理工具,可以帮助我们管理terraform .kubernetes 以及其他的配置. Kapitan 自生基于jsonnet 开发,对于我们日常进行软件的部署(tf以 ...
- 分库分表相关 - hash与range结合去分库分表
相关文章1 整体看下来通过hash取模去分库,然后根据range去分到哪个区间的表中. 具体还要实践下来.