概述

更新时间:2020-02-10

Sugar BI上的图表和过滤条件数据可以由用户通过 API 的形式来提供。Sugar BI会在后端通过 POST 的方式访问用户的 API,并在请求的 body 中带上过滤条件、下钻参数、联动参数等当前图表拉取数据时需要的信息,可以参考后面每个语言下如何获取的说明。具体的请求情况可以在图表的数据「调试」时弹框中看到。

用户的 API 返回数据要求都是 JSON 类型,格式如下:

{
	status: 0,  // 0表示成功,非0表示失败
	msg: '',    // 失败时的提示信息
	data: {...} // 具体的数据
}

每种图表和过滤条件的 API 数据格式要求都不太一样,详见各种图表的 API 格式要求

在各种语言下获取过滤条件的方法

Node

以 Express 为例

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.post('/api', function(req, res) {
    console.log(req.body);  // 查询条件的 json
    res.json(...);
})
app.listen(3000)

Java

以 Spring 为例

@RequestMapping(value = "/api", method = POST, consumes = MediaType.ALL_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public String api(@RequestBody String filter) {
    // filter 就是字符串形式的 json,需要使用 Jackson 等库解析为对象来使用
}

PHP

<?PHP
$json = file_get_contents('php://input');
$data = json_decode($json);

.NET

using Microsoft.AspNetCore.Mvc;
using System.IO;
using Newtonsoft.Json;

namespace MvcMovie.Controllers
{
    public class HelloWorldController : Controller
    {
        [HttpPost]
        public JsonResult Index()
        {

            using (var reader = new StreamReader(HttpContext.Request.Body))
            {
                dynamic json = JsonConvert.DeserializeObject(reader.ReadToEnd());
                var conditions = json.conditions;
                var data = new { status = 0, msg = "" };
                return Json(data);
            }
        }
    }
}

go

func api(w http.ResponseWriter, r *http.Request) {
    body, _ := ioutil.ReadAll(r.Body)
    var result map[string]interface{}  // 这里简化了,最好参考对应的参数说明文档创建 struct
    json.Unmarshal(body, &result)
}

Python

import json
# falcon 框架
class SugarAPI(object):
    def on_post(self, req, resp):
        data = json.load(req.bounded_stream)

# flask 框架
from flask import request
@app.route('/api', methods=['POST'])
def sugar_api():
    data = json.loads(request.data)

Ruby

require 'sinatra'
require 'json'

post '/api/' do
  request.body.rewind
  request_payload = JSON.parse request.body.read
end

本页内容