基于postgresQL的API设计

基于postgresQL的API设计


本文档设计思想主要是用于简化API一些重复验证工作,同时固定API入口, 在入口中做请求分发, 以便在入口做一些统计工作以及请求次数限制.
-- function
api_interface(in jsonb, out jsonb);  --入口函数(存储过程)
api_interface_error(code);  -- 统一错误处理函数
api_interface_lines(user_id, params, team_id); --线路列表例子

--table
api_errors -- 统一平台上错误信息
api_request_log --记录请求日志

入口设置


入口主要是读取一些通用信息,如access_token(凭证), interface(请求接口名称), version(接口版本)等信息,同时记录请求日志,以及后续的接口请求次数限制等
-- Function: api_interface(jsonb)

-- DROP FUNCTION api_interface(jsonb);

CREATE OR REPLACE FUNCTION api_interface(
    IN _input jsonb,
    OUT _result jsonb)
  RETURNS jsonb AS
$BODY$
--访问凭证
DECLARE _access_token TEXT;
--接口版本
DECLARE _version text;
--调用函数
DECLARE _interface TEXT;
--参数
DECLARE _params JSONB;
--错误码
DECLARE code INTEGER;
--错误消息
DECLARE message TEXT;
--用户ID
DECLARE _user_id UUID;
DECLARE v_sql TEXT;
BEGIN
    _access_token = _input::jsonb->>‘access_token‘;
    _version = _input::jsonb->>‘version‘;
    _interface = _input::jsonb->>‘interface‘;
    _params = _input::jsonb->‘params‘;

    IF (_access_token IS NULL ) THEN
        code = 1001;
        SELECT api_interface_error(code) INTO _result;
        RETURN;
    END IF;

    IF (_interface IS NULL) THEN
        code = 1002;
        SELECT api_interface_error(code) INTO _result;
        RETURN;
    END IF;

    IF (_version IS NULL) THEN
        code = 1003;
        SELECT api_interface_error(code) INTO _result;
        RETURN;
    END IF;

    IF ( _params IS NULL) THEN
        code = 1004;
        SELECT api_interface_error(code) INTO _result;
        RETURN;
    END IF;

    --查看access_token是否存在
    SELECT id FROM public.users WHERE account_id = (SELECT account_id FROM public.account_tokens WHERE token = _access_token LIMIT 1) LIMIT 1 INTO _user_id;

    IF (_user_id IS NULL) THEN
        code = 1005;
        SELECT api_interface_error(code) INTO _result;
        RETURN;
    END IF;

    --插入到请求日志中
    INSERT INTO public.api_request_log(user_id, interface, version, params) VALUES( _user_id, _interface, _version, _params);
    --动态拼接SQl
    v_sql = concat(‘SELECT api_interface_‘, _interface);
    v_sql = concat(v_sql , ‘($1::uuid, $2::jsonb, $3::uuid)‘);

    EXECUTE v_sql USING _user_id, _params::jsonb, ‘00000000-0000-0000-0000-000000000000‘ INTO _result;
    RETURN;

END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION api_interface(jsonb)
  OWNER TO postgres;
COMMENT ON FUNCTION api_interface(jsonb) IS ‘API接口‘;

接口例子(如线路列表)


-- Function: api_interface_lines(uuid, jsonb, uuid)

-- DROP FUNCTION api_interface_lines(uuid, jsonb, uuid);

CREATE OR REPLACE FUNCTION api_interface_lines(
    IN _user_id uuid,
    IN _input jsonb,
    IN _team_id uuid,
    OUT _result jsonb)
  RETURNS jsonb AS
$BODY$
DECLARE code INTEGER;
DECLARE message TEXT;
BEGIN
    code = 0;
    message = ‘‘;
    SELECT row_to_json(t) FROM (SELECT code, message, (SELECT json_agg (x) FROM (SELECT * from lines limit 2) x) lines) t INTO _result;
    RETURN;
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION api_interface_lines(uuid, jsonb, uuid)
  OWNER TO postgres;
COMMENT ON FUNCTION api_interface_lines(uuid, jsonb, uuid) IS ‘线路列表‘;

辅助函数和表


 记录请求日志
 统一处理错误
 nodejs中的使用

统一错误处理


CREATE OR REPLACE FUNCTION api_interface_error(
    IN _code integer,
    OUT result jsonb)
  RETURNS jsonb AS
$BODY$
DECLARE _message text;
BEGIN
    SELECT message FROM api_errors AS AE WHERE AE.code = _code INTO _message;
    IF (_message IS NULL) THEN
        _message = ‘‘;
    END IF;
    SELECT row_to_json(t) FROM (SELECT _code, _message) t INTO result;
    RETURN;
END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION api_interface_error(integer)
  OWNER TO postgres;
COMMENT ON FUNCTION api_interface_error(integer) IS ‘API接口调用错误‘;

记录请求日志


CREATE TABLE api_request_log
(
  id uuid NOT NULL DEFAULT uuid_generate_v4(),
  user_id uuid,
  create_at timestamp without time zone DEFAULT now(), -- 创建时间
  interface character varying(50), -- 请求接口
  params jsonb, -- 请求参数
  version character varying(50), -- API版本
  CONSTRAINT api_request_log_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE api_request_log
  OWNER TO postgres;
COMMENT ON TABLE api_request_log
  IS ‘API请求日志‘;
COMMENT ON COLUMN api_request_log.create_at IS ‘创建时间‘;
COMMENT ON COLUMN api_request_log.interface IS ‘请求接口‘;
COMMENT ON COLUMN api_request_log.params IS ‘请求参数‘;
COMMENT ON COLUMN api_request_log.version IS ‘API版本‘;

统计错误信息


CREATE TABLE api_errors
(
  id uuid NOT NULL DEFAULT uuid_generate_v4(),
  code integer,
  message text, -- 错误信息
  CONSTRAINT pk_api_errors_id PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE api_errors
  OWNER TO postgres;
COMMENT ON TABLE api_errors
  IS ‘api错误信息‘;
COMMENT ON COLUMN api_errors.message IS ‘错误信息‘;

nodejs 直接调用存储过程


    var _input_json = req.body.input;
    //对_input_json进行一些参数判断,如token是否合法等
    //省略...
    //
    var sql = "SELECT public.api_interface($1::jsonb) AS result";
    db.execQuery(sql, [_input_json])
        .then(function(result){
            return result.rows[0][‘result‘];
        })
        .then(function(result){
            //返回的已经是标准格式的json
            res.json(result);
        })
        .catch(next).done();

客户端请求:


    android or any:
    String response = ‘‘;
    request
      .send({"access_token":"TOKEN", "interface":"lines", "version":"1.0", "params":{"param1":1, "params2":2}})
      .end(response);
    System.out.println(response);
时间: 2024-11-02 18:56:34

基于postgresQL的API设计的相关文章

HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器

HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道和一些元数据,这些是和你的视频或者音频控件绑定到一块的,这样才形成了一个完整的播放组件. 浏览器支持情况: 浏览器 支持情况 编解码器 Chrome 3.0 Theora . Vorbis .Ogg H.264 . AAC .MPEG4 FireFox 3.5 Theora . Vorbis .Og

使用Audio API设计绚丽的HTML5音乐播放器

HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道和一些元数据,这些是和你的视频或者音频控件绑定到一块的,这样才形成了一个完整的播放组件. 浏览器支持情况: 浏览器 支持情况 编解码器 Chrome 3.0 Theora . Vorbis .Ogg H.264 . AAC .MPEG4 FireFox 3.5 Theora . Vorbis .Og

atitit.基于http json api 接口设计 最佳实践 总结o7

atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::serverand android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通參数 meth,param, 2 2.2. 全部的參数定义 2 2.3. key,dynami key)韩式 static key? 2 2.4. 防篡改 sign 2 2.5. Encry加密 3 2.6. zip压缩:: 3 2.7. 首先压缩韩式加密??? 3 3. 选型大全:rim ,ws, http 

Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net

Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码,1 1.1. 子模式 urlsafe Or  url unsafe2 1.2. 其他的二进制数据表示法  bin2hex() ,Quoted-printable ,UUencode2 2. Base64常用api2 2.1. ------------解码api2 2.2. decode(String s, OutputStream out)2 2.3. 

RESTful API 设计最佳实践(转)

摘要:目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API是否应该加入版本信息? 背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API是否应该加入版本信息?当你开始写一个app的时候,特别是后端模型部分已经写完

RESTful API 设计最佳实践

1. 背景 REST(英文:Representational State Transfer,表述性状态转移)描述了一个架构样式的网络系统,比如 web 应用程序. 目前互联网上充斥着大量的关于RESTful API(为方便,下文中"RESTful API "简写为"API")如何设计的文章,然而却没有一个"万能"的设计标准:如何鉴权?API 格式如何?你的API是否应该加入版本信息?当你开始写一个app的时候,特别是后端模型部分已经写完的时候,你

PostgreSQL 优势,MySQL 数据库自身的特性并不十分丰富,触发器和存储过程的支持较弱,Greenplum、AWS 的 Redshift 等都是基于 PostgreSQL 开发的

PostgreSQL 优势 2016-10-20 21:36 686人阅读 评论(0) 收藏 举报  分类: MYSQL数据库(5)  PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),功能很强大.包括了可以说是目前世界上最丰富的数据类型的支持,比如 IP 类型和几何类型等等. 发现很多读者都问过这样一个问题:如果打算为项目选择一款免费.开源的数据库,那么你可能会在MySQL与PostgreSQL之间犹豫不定.针对这个问题,我们采访到了即将在Postgres中国用户20

出色的 JavaScript API 设计秘诀

设计是一个很普遍的概念,一般是可以理解为为即将做的某件事先形成一个计划或框架. (牛津英语词典)中,设计是一种将艺术,体系,硬件或者更多的东西编织到一块的主线.软件设计,特别是作为软件设计的次类的API设计,也是一样的.但是API设计常常很少关注软件发展,因为为其他程序员写代码的重要性要次于应用UI设计和最终用户体验. 但是API设计,作为我们自己写的库中提供的公共接口,能够向调用我们代码的开发者表现出我们库的一些特点和功能,所以API设计和UI设计一样重要.事实上,两者都是为应用可以提供更好的

数据库的一次存储的PostgreSQL缓冲区的设计

根据北京华宇盈通的java商城开发.jsp商城开发以及java商城产品的开发工作人员介绍,在开发中PostgreSQL需要去做属于它自己的缓冲技术,因为其有很多情况下由于各种原因会使用I/O缓冲.这就会导致一个问题:数据库的数据往往会在内存中被存储两次,一次是在PostgreSQL的缓冲区,另一次是在页高速缓冲存储器(page cache).PostgreSQL在一定程度上极大地增加了内存的使用次数,对于一个完整的系统是有害的. 大量的内存浪费行为应该被有效地消除.考虑这样一个例子,在Postg