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;
@Component
public class PowerBIUtil {
static final Logger logger = LoggerFactory.getLogger(PowerBIUtil.class);
@Resource
private HttpUtil httpUtil;
private String cacheToken = "";
String authenticationUrl = "https://login.chinacloudapi.cn/%s/oauth2/token";
String resourceUrl = "https://analysis.chinacloudapi.cn/powerbi/api";
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";
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";
String delUrl = "https://api.powerbi.cn/v1.0/myorg/groups/%s/reports/%s";
@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;
public String getToken() {
String token = "";
token = getEmailToken();
cacheToken = token;
return token;
}
public String getCacheToken() {
String token = cacheToken;
if (StringUtils.isEmpty(token)) {
token = getEmailToken();
cacheToken = token;
}
return 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;
}
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");
}
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");
}
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");
}
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);
}
public JSONObject getAllDataSetIds(String token) {
String url = String.format(queryDatasetUrl, groupId);
return getAllDataByUrl(token, url);
}
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 !");
}
}
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;
@Component
public class HttpUtil {
private static final int TWOTHOUSAND = 20000;
public String doPost(String url, Map<String, String> header, String body) {
String result = "";
BufferedReader in = null;
PrintWriter out = null;
try {
URL realUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("POST");
for (Map.Entry<String, String> entry : header.entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setConnectTimeout(TWOTHOUSAND);
connection.setReadTimeout(TWOTHOUSAND);
try {
out = new PrintWriter(connection.getOutputStream());
out.print(body);
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
try {
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 result;
}
public String postByUrlAndToken(String defURL, String token, JSONObject body) throws Exception {
URL url = new URL(defURL);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setUseCaches(false);
con.setDoInput(true);
con.setDoOutput(true);
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();
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();
}
public String doGet(String url, Map<String, String> header) {
StringBuilder result = new StringBuilder();
BufferedReader in;
try {
URL realUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("GET");
for (Map.Entry<String, String> entry : header.entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
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 String doDelete(String url, Map<String, String> header) {
StringBuilder result = new StringBuilder();
BufferedReader in = null;
try {
URL realUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("DELETE");
for (Map.Entry<String, String> entry : header.entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
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);
}
}