powerBi api 工具方法

1. PowerBIUtil

import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @description: PowerBIUtil
 * @author: leimin
 * @date: 2020-06-30 11:25
 */
@Component
public class PowerBIUtil {
    /**
     * 日志工具
     */
    static final Logger logger = LoggerFactory.getLogger(PowerBIUtil.class);

    /**
     * 工具
     */
    @Resource
    private HttpUtil httpUtil;

    /**
     * 缓存的token,不用每次都去查询
     */
    private String cacheToken = "";

    /**
     * authenticationUrl : power BI 用户认证 url,xxx power BI 账户
     * resourceUrl  : power BI api 资源 url
     */
    String authenticationUrl = "https://login.chinacloudapi.cn/%s/oauth2/token";
    String resourceUrl = "https://analysis.chinacloudapi.cn/powerbi/api";

    /**
     * 操作 对象
     * queryReportUrl 查看报表
     * queryDashboardUrl 查看 dashboard
     * queryDatasetUrl 查看数据集
     */
    String queryReportUrl = "https://api.powerbi.cn/v1.0/myorg/groups/%s/reports";
    String queryDashboardUrl = "https://api.powerbi.cn/v1.0/myorg/groups/%s/dashboards";
    String queryDatasetUrl = "https://api.powerbi.cn/v1.0/myorg/groups/%s/datasets";

    /**
     * 生成 嵌入报表操作token,需要依赖于 access_token
     * datasetTokenUrl 数据集 : 获取创建数据集的 token
     * tokenUrlByGroup 用户组所有报表 : 获取创建报表的 token
     * tokenUrlByReport 用户组指定报表:  在此用户组下查看(嵌入报表)或编辑报表
     */
    String datasetTokenUrl = "https://api.powerbi.cn/v1.0/myorg/GenerateToken";
    String tokenUrlByGroup = "https://api.powerbi.cn/v1.0/myorg/groups/%s/reports/GenerateToken";
    String tokenUrlByReport = "https://api.powerbi.cn/v1.0/myorg/groups/%s/reports/%s/GenerateToken";

    /**
     * 操作用户组下的指定报表(需要 tokenUrlByReport)
     */
    String delUrl = "https://api.powerbi.cn/v1.0/myorg/groups/%s/reports/%s";
    /**
     * tenantId powerBI 账户id,志高 power BI 账户
     * clientId 客户id
     * clientSecret 客户密码, 一年一换
     * groupId 用户组id ,现有两个,分别对应 MGB/NPI
     */
    @Value("${power-bi.tenant-id}")
    String tenantId;
    @Value("${power-bi.client-id}")
    String clientId;
    @Value("${power-bi.client-secret}")
    String clientSecret;
    @Value("${power-bi.group-id}")
    String groupId;

    /**
     * 查询token,失效5分钟
     * 所有获取token均来自这里
     *
     * @return token的字符串
     */
    public String getToken() {

        String token = "";
        token = getEmailToken();
        cacheToken = token;
        return token;
    }

    /**
     * 查询token,失效5分钟
     * 所有获取token均来自这里
     *
     * @return token的字符串
     */
    public String getCacheToken() {

        String token = cacheToken;
        if (StringUtils.isEmpty(token)) {
            token = getEmailToken();
            cacheToken = token;
        }

        return token;
    }

    /**
     * 根据世纪互联电子邮件中,提供的接口获取token
     *
     * @return access token
     */
    public String getEmailToken() {
        String token = "";

        Map<String, String> header = new HashMap<>(16);
        header.put("Content-Type", "application/x-www-form-urlencoded");
        header.put("Accept", "*/*");

        Map<String, String> body = new HashMap<>(16);
        body.put("grant_type", "client_credentials");
        body.put("resource", resourceUrl);
        body.put("client_id", clientId);
        body.put("client_secret", clientSecret);


        StringBuilder bodyStr = new StringBuilder();
        int i = 0;
        for (Map.Entry<String, String> entry : body.entrySet()) {
            i++;
            bodyStr.append(entry.getKey()).append("=").append(entry.getValue());
            if (i < body.size()) {
                bodyStr.append("&");
            }
        }
        String url = String.format(authenticationUrl, tenantId);

        String baseStr = httpUtil.doPost(url, header, bodyStr.toString());

        JSONObject jsonObject = JSONObject.parseObject(baseStr);
        token = jsonObject.getString("access_token");

        return token;
    }

    /**
     * 根据世纪互联电子邮件中教材api,生成embedToken
     *
     * @return embedToken
     * @author: leiming5
     */
    public String generateTokenByReportId(String reportId, String level) throws Exception {

        String urlByReportId = String.format(tokenUrlByReport, groupId, reportId);

        JSONObject body = new JSONObject();
        body.put("accessLevel", level);
        body.put("allowSaveAs", "true");

        String accessToken = getToken();
        String baseStr = httpUtil.postByUrlAndToken(urlByReportId, accessToken, body);

        JSONObject jsonObject = JSONObject.parseObject(baseStr);

        return jsonObject.getString("token");
    }

    /**
     * 根据世纪互联电子邮件中教材api,生成embedToken
     *
     * @return embedToken
     * @author: leiming5
     */
    public String generateTokenByDatasetId(String datasetId, String level) throws Exception {

        String url = String.format(tokenUrlByGroup, groupId);

        JSONObject body = new JSONObject();
        body.put("accessLevel", level);
        body.put("allowSaveAs", "true");
        body.put("datasetId", datasetId);

        String accessToken = getToken();
        String baseStr = httpUtil.postByUrlAndToken(url, accessToken, body);

        JSONObject jsonObject = JSONObject.parseObject(baseStr);

        return jsonObject.getString("token");
    }

    /**
     * 生成所有的token
     *
     * @param datasetId 数据集id
     * @return token
     * @throws Exception
     * @author: leiming5
     */
    public String generateTokenByDatasetIds(String datasetId) throws Exception {


        JSONObject body = new JSONObject();
        List<JSONObject> list = new ArrayList<>();
        JSONObject dataSet = new JSONObject();
        dataSet.put("id", datasetId);
        list.add(dataSet);
        body.put("datasets", list);

        String accessToken = getToken();
        String baseStr = httpUtil.postByUrlAndToken(datasetTokenUrl, accessToken, body);

        JSONObject jsonObject = JSONObject.parseObject(baseStr);

        return jsonObject.getString("token");
    }

    /**
     * 根据token插叙所有的报表
     *
     * @param token token
     * @return 报表数据
     */
    public JSONObject getAllReports(String token) {

        String url = String.format(queryReportUrl, groupId);

        Map<String, String> header = new HashMap<>(16);

        header.put("Authorization", "Bearer " + token);

        String baseStr = httpUtil.doGet(url, header);

        return JSONObject.parseObject(baseStr);
    }


    /**
     * 根据token获取所有的dataSetId
     *
     * @param token token
     * @return 所有的dataSetId
     */
    public JSONObject getAllDataSetIds(String token) {

        String url = String.format(queryDatasetUrl, groupId);

        return getAllDataByUrl(token, url);
    }

    /**
     * 删除云端报表
     *
     * @param reportId 报表id
     * @author: leiming5
     */
    public void deleteReport(String reportId) {

        String token = getToken();
        String url = String.format(delUrl, groupId, reportId);

        HashMap<String, String> map = new HashMap<>(4);
        map.put("Authorization", "Bearer " + token);
        try {
            httpUtil.doDelete(url, map);
        } catch (Exception e) {
            logger.info("Repeat operation. The file no longer exists !");
        }
    }

    /**
     * 获取数据,通过url和token
     *
     * @param token token字符串
     * @param url   urlString
     * @return json对象
     */
    private JSONObject getAllDataByUrl(String token, String url) {

        if (StringUtils.isEmpty(token) || StringUtils.isEmpty(url)) {
            return null;
        }

        Map<String, String> header = new HashMap<>(16);

        header.put("Authorization", "Bearer " + token);

        String baseStr = httpUtil.doGet(url, header);

        return JSONObject.parseObject(baseStr);
    }

}

2. HttpUtil

package com.leinovo.npi.datacenter.report.bi.util;

import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;


/**
 * Http请求工具类
 *
 * @author weihong.zhu
 */
@Component
public class HttpUtil {

    /**
     * 设置连接超时时间,20000,消除魔术数字
     */
    private static final int TWOTHOUSAND = 20000;

    /**
     * 发送post请求
     *
     * @param url    请求路径
     * @param header 请求头
     * @param body   请求体
     * @return String
     */
    public String doPost(String url, Map<String, String> header, String body) {

        String result = "";
        BufferedReader in = null;
        PrintWriter out = null;
        try {
            // 设置 url
            URL realUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("POST");
            // 设置 header
            for (Map.Entry<String, String> entry : header.entrySet()) {
                connection.setRequestProperty(entry.getKey(), entry.getValue());
            }
            // 设置请求 body
            connection.setDoOutput(true);
            connection.setDoInput(true);

            //设置连接超时和读取超时时间
            connection.setConnectTimeout(TWOTHOUSAND);
            connection.setReadTimeout(TWOTHOUSAND);
            try {
                out = new PrintWriter(connection.getOutputStream());
                // 保存body
                out.print(body);
                // 发送body
                out.flush();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                // 获取响应body
                in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }

                in.close();
                connection.disconnect();
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
            //return null;
        }
        return result;
    }

    /**
     * @param defURL
     * @param token
     * @return
     * @throws Exception
     */
    public String postByUrlAndToken(String defURL, String token, JSONObject body) throws Exception {

        URL url = new URL(defURL);
        // 打开和URL之间的连接
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("POST");//请求post方式
        con.setUseCaches(false); // Post请求不能使用缓存
        con.setDoInput(true);// 设置是否从HttpURLConnection输入,默认值为 true
        con.setDoOutput(true);// 设置是否使用HttpURLConnection进行输出,默认值为 false

        //设置header内的参数 connection.setRequestProperty("健, "值");
        con.setRequestProperty("Content-Type", "application/json");
        con.setRequestProperty("Accept", "*/*");
        con.setRequestProperty("Authorization", "Bearer " + token);

        // 建立实际的连接
        con.connect();

        // 得到请求的输出流对象
        OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream(), "UTF-8");
        writer.write(body.toString());
        writer.flush();

        // 获取服务端响应,通过输入流来读取URL的响应
        InputStream is = con.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        StringBuffer sbf = new StringBuffer();
        String strRead = null;
        while ((strRead = reader.readLine()) != null) {
            sbf.append(strRead);
            sbf.append("\r\n");
        }

        reader.close();
        is.close();

        // 关闭连接
        con.disconnect();


        return sbf.toString();

    }

    /**
     * 发送get请求
     *
     * @param url    请求路径
     * @param header 请求头
     * @return String
     */
    public String doGet(String url, Map<String, String> header) {
        StringBuilder result = new StringBuilder();
        BufferedReader in;
        try {
            // 设置 url
            URL realUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("GET");

            // 设置 header
            for (Map.Entry<String, String> entry : header.entrySet()) {
                connection.setRequestProperty(entry.getKey(), entry.getValue());
            }
            // 设置请求 body
            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }

            in.close();
            connection.disconnect();

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return result.toString();
    }

    /**
     * 发送delete请求
     *
     * @param url    请求路径
     * @param header 请求头消息
     * @return String 成功返回“”
     * @author: leiming5
     */
    public String doDelete(String url, Map<String, String> header) {
        StringBuilder result = new StringBuilder();
        BufferedReader in = null;
        try {
            // 设置 url
            URL realUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("DELETE");
            // 设置 header
            for (Map.Entry<String, String> entry : header.entrySet()) {
                connection.setRequestProperty(entry.getKey(), entry.getValue());
            }
            // 设置请求 body
            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }

            in.close();
            connection.disconnect();

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return result.toString();
    }

    public static void setDownloadResponse(HttpServletResponse response, String fileName, String contentType) throws UnsupportedEncodingException {
        response.setContentType(contentType);
        fileName = URLEncoder.encode(fileName, "utf-8").replaceAll("\\+", "%20");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值