一: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的设计规范的更多相关文章

  1. 软件定义网络基础---REST API概述

    一:什么是REST API REST API是北向接口的主流设计方式 API是应用程序编程接口,是预先定义好的函数,可以供应用程序或开发人员访问调用 年 Roy Thomas Fielding 的博士 ...

  2. 软件定义网络基础---SDN控制平面

    一:SDN控制平面 一个或多个SDN控制器组成,是网络的大脑.  对底层网络交换设备进行集中管理,状态监测.转发决策以及处理和调 度数据平面的流量:  通过北向接口向上层应用开放多个层次的可编程能 ...

  3. 软件定义网络基础---SDN的主流构架

    一:基于不同标准的主流构架 二: ONF定义的SDN基本构架 (一) 四个平面.两大接口 三:四个平面 (一)数据平面 数据平面是由若干网元(Netword Element)构成,每个网元包括一个或多 ...

  4. 软件定义网络基础---OpenFlow概述

    一:OpenFlow概述 二:交换机模型架构 (一)OpenFlow构架三个组成成分 三:OpenFlow 1.0版本 自OpenFlow1.0发布以来,目前已经有多个版本的OF规范版本被发布 四:O ...

  5. 软件定义网络基础---OpenFlow流表

    一:流表 (一)流的概念 我们把同一时间经过同一网络中,具有某种共同特征或属性的数据,抽象为一个流 比如:我们将访问同一个地址的数据视为一个流 流一般是由网络管理员定义的,可以根据不同的流执行不同的策 ...

  6. 软件定义网络基础---NETCONF协议

    netconf协议最早被作为网管协议被提出来的,与SNMP网管协议相比较:SNMP的优势在于网络设备的监测,在大规模网管应用中有很大不足,正是针对这种不足之处,提出了NETCONF协议 一:NETCO ...

  7. 软件定义网络基础---SDN数据平面

    主要介绍SDN架构和转发模型 一:传统网络设备 (一)传统设备控制平面和数据平面 (二)数据平面的任务 数据平面对数据包的处理,主要通过查询由控制平面所生成的转发信息表来完成 (三)传统网络数据平面数 ...

  8. 软件定义网络基础---SDN的核心思想

    一:SDN包含的核心思想:解耦,抽象,可编程 二:解耦 (一)SDN网络解耦思想 解耦是指将控制平面和数据平面进行分离,主要为了解决传统网络中控制平面和数据平面在物理上紧耦合导致的问题 控制平面和数据 ...

  9. 软件定义网络基础---SDN的发展

    一:发展初期阶段--提出 架构.设计思想和实现技术的提出 二:发展中期阶段--企业加入,推动发展 三:SDN的发展趋势 (一)SD-DC SDN被大规模应用数据中心的服务器和设备部署运维,产生了软件定 ...

随机推荐

  1. 【HICP Gauss】数据库 数据库管理(连接方式 会话模式 存储表空间)-6

    数据库连接方式:驱动连接和客户端连接 驱动连接 : JDBC GSC ODBC 客户端连接 zsql工具 zsql / as sysdba -q #管理员身份登陆 zsql omm/ - #普通身份登 ...

  2. Linux系统 jboss/Tomcat服务器pdf文件乱码问题

    1.新搭建的环境,但是没有字符集,在windows上的电脑上复制了一份宋体, 字体C:\WINDOWS\FONTS\simsun.ttc(也就是宋体,大小为10M),把他重命名为 simsun.ttf ...

  3. [AI] 切换cuda版本的万金油

    1. 环境 ubuntu16.04 GTX1080Ti x 4 nvidia-418 cuda-10.1 pytorch1.0.0 目标:在最新的显卡驱动下,使用不同版本的cuda和深度学习框架来执行 ...

  4. docker学习1-CentOS 7安装docker环境

    前言 Docker 提供轻量的虚拟化,你能够从Docker获得一个额外抽象层,你能够在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,例如你可以将Tomcat运行在一个D ...

  5. python通过LXML库读取xml命名空间

    xml实例版本: <a> <city:table xmlns:city="city"> <heilongjiang name="citys& ...

  6. LeetCode(数据库):分数排名

    ,)); Truncate table Scores; ', '3.5'); ', '3.65'); ', '4.0'); ', '3.85'); ', '4.0'); ', '3.65'); 编写一 ...

  7. KMP + BZOJ 4974 [Lydsy1708月赛]字符串大师

    KMP 重点:失配nxtnxtnxt数组 意义:nxt[i]nxt[i]nxt[i]表示在[0,i−1][0,i-1][0,i−1]内最长相同前后缀的长度 图示: 此时nxt[i]=jnxt[i]=j ...

  8. LightOJ - 1318 - Strange Game(组合数)

    链接: https://vjudge.net/problem/LightOJ-1318 题意: In a country named "Ajob Desh", people pla ...

  9. PAT1057 stack(分块思想)

    1057 Stack (30分)   Stack is one of the most fundamental data structures, which is based on the princ ...

  10. 使用docker 实现MySQL主从同步/读写分离

    1. 利用 docker 实现 mysql 主从同步 / 读写分离 为了保证数据的完整和安全,mysql 设计了主从同步,一个挂掉还可以用另个.最近重构论坛,想来改成主从吧.担心失误,就先拿 dock ...