调用MammutOpenApi实现上传下载任务包

功能说明

适用模块

中台api

具体说明

调用MammutOpenApi实现上传下载任务包

使用示例

开发者账号密码获取方式

  1. 先使用需要获取开发者账号密码的用户登陆猛犸平台http://xxxxxxxx.com/main#/activity/dashboard
  2. 保留猛犸页面网址部分,后缀部分改为 https://xxxxxxxx.com/api/user/apikey/set?email= xx@xxxxxxxxxx.com 其中https://xxxxxxxx.com就是登陆后猛犸页面地址 email=xx@xx 就是指通过该邮箱账户设置openapi的 apikey 和 masterkey。
  3. 接下来调用/api/user/apikey/get接口用来获取之前通过set接口设置的两个key https:// xxxxxxxx.com/api/user/apikey/get?email= xx@xx
  4. 以admin账号为例执行结果如下图: http://xxxxxxxx.com//api/user/apikey/set?email=admin.mammut@163.com INFO-调用MammutOpenApi实现上传下载任务包 - 图1

代码样例

导入相关依赖:

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.1.32</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>2.3.4.RELEASE</version>
    </dependency>

代码示例:

package org.example;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import sun.misc.BASE64Encoder;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Objects;
import java.util.UUID;

/***********************************
 *@Desc TODO
 *@ClassName MammutUploadTaskDemo
 *@Author DLX
 *@Data 2021/8/16 14:23
 *@Since JDK1.8
 *@Version 1.0
 ***********************************/

public class MammutUploadTaskDemo {
    //服务器地址
    public static String HOST;
    //app_key  需要更换成自己的api_key
    public static String API_KEY;
    //秘钥用来生成token 需要更换成自己的master_key
    public static String MASTER_KEY;
    //项目文件的openApi URL
    public static String URL;
    //本地文件路径
    public static String LOCAL_FILE_PATH;

    public RestTemplate restApiTemplate;

    public BASE64Encoder base64en;


    public MammutUploadTaskDemo(String HOST, String API_KEY, String MASTER_KEY, String URL, String LOCAL_FILE_PATH) throws NoSuchAlgorithmException {
        this.HOST = HOST;
        this.API_KEY = API_KEY;
        this.MASTER_KEY = MASTER_KEY;
        this.URL = URL;
        this.LOCAL_FILE_PATH = LOCAL_FILE_PATH;
        this.restApiTemplate = new RestTemplate();
        this.base64en = new BASE64Encoder();
    }

    /* 获取token
     * */

    public String getToken(String uri) throws UnsupportedEncodingException,NoSuchAlgorithmException {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        return base64en.encode(md5.digest((MASTER_KEY + uri).getBytes("utf-8")));
    }
    /**
     * 组装请求体
     * @return
     * @throws Exception
     */
    public static MultiValueMap<String, Object> getPostBody(String HOST, String API_KEY, String MASTER_KEY, String URL, String LOCAL_FILE_PATH,String product,String taskName,String clusterId) throws Exception{
        MammutUploadTaskDemo mammutApiHandler = new MammutUploadTaskDemo(HOST, API_KEY, MASTER_KEY, URL, LOCAL_FILE_PATH);
        String token = mammutApiHandler.getToken(URL);
        String apiKey = MammutUploadTaskDemo.API_KEY;
        MultiValueMap<String, Object> body = new LinkedMultiValueMap<String,Object>();
        FileSystemResource file = new FileSystemResource(LOCAL_FILE_PATH);
        body.add("file",file);
        body.add("token", URLEncoder.encode(token,"utf-8"));
        body.add("apiKey",URLEncoder.encode(apiKey,"utf-8"));
        body.add("product",product);
        body.add("taskName",taskName);
        body.add("clusterId",clusterId);
        return body;
    }

    /**
     * demo main函数入口
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        if ("upload".equals(args[0])){
            RestTemplate restApiTemplate = new RestTemplate();
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.MULTIPART_FORM_DATA);
            HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(getPostBody(args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]), headers);
            JSONObject ret = restApiTemplate.postForObject(MammutUploadTaskDemo.HOST + URL,request, JSONObject.class);
            System.out.println(ret);
        }else if ("download".equals(args[0])){
            MammutUploadTaskDemo mammutApiHandler = new MammutUploadTaskDemo(args[1],args[2],args[3],args[4],args[5]);
            String token = mammutApiHandler.getToken(URL);
            String apiKey = MammutUploadTaskDemo.API_KEY;
            String taskName = args[7];
            RestTemplate restApiTemplate = new RestTemplate();
            String url = MammutUploadTaskDemo.HOST + URL
                    + "?product=" + URLEncoder.encode(args[6], "utf-8")
                    + "&clusterId=" + URLEncoder.encode(args[8], "utf-8")
                    + "&taskName=" + URLEncoder.encode(taskName, "utf-8")
                    + "&online=" + URLEncoder.encode(Boolean.FALSE.toString(), "utf-8")
                    + "&apiKey=" + URLEncoder.encode(apiKey, "utf-8")
                    + "&token=" + URLEncoder.encode(token, "utf-8");
            ResponseEntity<byte[]> rsp = restApiTemplate.getForEntity(url, byte[].class);

            // 校验http状态码
            System.out.println("HTTP状态码:" + rsp.getStatusCode());
            if (!rsp.getStatusCode().equals(HttpStatus.OK)) {
                System.out.println("HTTP状态码异常");
                return;
            }

            // 校验业务异常,如果返回Content-Type=[application/json;charset=UTF-8] 说明有业务上的异常
            // Content-Type=[multipart/form-data] 一般是正确下载到了文件
            System.out.println(rsp.getHeaders());
            if (rsp.getHeaders().getContentType().toString().equals(MediaType.APPLICATION_JSON_UTF8_VALUE)) {
                System.out.println("业务错误信息:" + JSON.parse(rsp.getBody()));
                return;
            }

            // 下载文件并保存在本地
            try {
                String targetPath = LOCAL_FILE_PATH
                        + taskName + "_" + UUID.randomUUID().toString().substring(0, 6) + ".zip";
                Files.write(Paths.get(targetPath), Objects.requireNonNull(rsp.getBody(), "未获取到下载文件"));
                System.out.println("文件下载完毕,路径:" + targetPath);
            } catch (IOException e) {
                System.out.println("文件写入失败:" + e.getMessage());
            }
        }else {
            System.out.println("请检查输入参数");
        }
    }
}

参数样例

以该任务为例: INFO-调用MammutOpenApi实现上传下载任务包 - 图2 上传时所需的参数为:

{"upload","http://easydemo-workbench.163yun.com/","a8xxxxxxx4-xxxx-xxxx-xxxx-4xxxxxx80","b1xxxx05-xxxx-xxxx-xxxx-7xxxxxxxx87e","/v1/openapi/etl/task/upload","C:\\Users\\Desktop\\测试\\test11_6f6c19.zip","bdms","test11","easyops-cluster"};

下载时所需的参数为:

{"download","http://easydemo-workbench.163yun.com/","a8xxxxxxx4-xxxx-xxxx-xxxx-4xxxxxx80","b1xxxx05-xxxx-xxxx-xxxx-7xxxxxxxx87e","/v1/openapi/etl/task/download","C:\\Users\\Desktop\\测试\\","bdms","test11","easyops-cluster"};

下载任务包API相关信息

请求信息

GET: /v1/openapi/etl/task/download?apiKey={apiKey}&token={token}&product={product}&clusterId={clusterId}&taskName={taskName}&online={online}

请求头:无

请求参数:无

范例展示:无

响应信息

响应头:

名称 默认值 描述
Content-Type application/octet-stream -

返回数据:无

范例展示:无

上传任务包API相关信息

请求信息

POST: /v1/openapi/etl/task/upload

请求头:

名称 默认值 描述
Content-Type multipart/form-data -

请求参数:哈希

名称 类型 描述 必需 默认值
product String 产品账号 intern
clusterId String 集群ID 集群ID
file File 上传⽂件 -
taskName String 任务名 flow_task
apiKey String 开发者账号 96479111-4159-805a-bda8-f5765ddc4768
token String 开发者账号密码 qajHvy6W1uykxOB74Od6UA%3D%3D

范例展示:

{
 "apiKey": "96479111-4159-805a-bda8-f5765ddc4768",
 "token": "qajHvy6W1uykxOB74Od6UA%3D%3D",
 "product": "intern",
 "clusterId": "集群ID",
 "file": "<File>",
 "taskName": "flow_task"
}

响应信息

响应头:

名称 默认值 描述
Content-Type application/json -

返回数据:哈希

名称 类型 描述 默认值
code Number 状态码 200
msg String 状态描述。若code不等于200,则返回简短的出错原因 success

范例展示:

{
 "code": 200,
 "msg": "success"
}

作者:邓崃翔