Java开发者的大疆制图API探索之旅:从入门到实战

目录

开启探索之门:申请账号与准备素材

(一)申请大疆智图 api 账号

(二)准备建模素材

搭建舞台:Java 环境配置与依赖引入

(一)开发环境搭建

(二)引入依赖

 核心技术揭秘:请求封装与签名生成

(一)请求工具类

(二)签名生成算法

(三)请求方法封装

 关键步骤:获取 Token 与上传素材

(一)获取 Token

(二)上传素材到阿里云 OSS

完整示例:Java 整合大疆制图 API 实战

(一)完整代码示例

(二)代码解释与调试

调试技巧和常见问题解决方案


开启探索之门:申请账号与准备素材

在深入使用大疆制图 API 并将其整合至 Java 项目之前,需要完成一系列的前期准备工作,这如同搭建房屋时打好地基一般关键。下面将详细介绍申请账号以及准备建模素材的步骤。

(一)申请大疆智图 api 账号

首先,打开网页浏览器,访问大疆智图 api 网址DJI Developer。若你还没有账号,点击注册按钮,按照页面提示填写相关信息,如邮箱、密码、手机号码等,完成注册流程;若已有账号,直接使用账号密码登录即可。

注册成功或登录后,返回大疆智图 api 页面,点击右上角的 “控制台” 选项,进入控制台界面。在控制台中,点击申请成为开发者,会弹出一个信息填写框,在这里需要如实填写公司或个人信息,包括公司名称、行业类型、联系人姓名、联系电话以及使用大疆制图 API 的用途说明等。这些信息将帮助大疆评估你的申请,确保你符合使用 API 的条件。填写完成后,点击提交按钮。提交后,页面会刷新,若你的申请还未开通,可点击 “免费使用” 选项,再次确认填写信息无误后提交。一般情况下,不出意外,两三天就可以申请成功。申请成功后,在控制台页面就能看到 App Key 和 Secret Key,这两个密钥至关重要,后续在使用 API 进行请求时会用到,一定要妥善保管,切勿泄露。

(二)准备建模素材

在成功申请到大疆智图 api 账号并获取到密钥后,接着进入大疆智图 api 文档页面,网址为疆智图 API。在文档页面中,点击 “快速入门” 选项,然后在右侧找到 “准备素材” 按钮并点击。

此时,会出现多种素材类型供选择,你可根据自己的需求进行下载。以选择 3D 素材为例,点击 3D 素材的下载链接,等待下载完成。下载完成后,找到下载的压缩文件,使用解压工具(如 WinRAR、360 压缩等)进行解压。解压后,会得到一系列的文件,这些文件就是后续进行建模操作所需要的素材。确保素材的完整性和准确性,若素材出现损坏或缺失,可能会导致建模失败或结果不准确。

搭建舞台:Java 环境配置与依赖引入

 

(一)开发环境搭建

在开始使用 Java 整合大疆制图 API 之前,确保你的开发环境已正确搭建是至关重要的。首要任务便是安装 Java 开发工具包(JDK),这是 Java 程序开发的基础。你可以前往 Oracle 官方网站(https://www.oracle.com/java/technologies/downloads/ ),在该网站上,你能看到各种版本的 JDK 供下载。根据你的操作系统类型(如 Windows、Linux 或 macOS)以及系统位数(32 位或 64 位)来选择合适的 JDK 版本进行下载。例如,若你使用的是 64 位的 Windows 10 系统,就下载对应的 64 位 JDK 安装包。

下载完成后,运行安装程序。在安装过程中,你可以选择默认的安装路径,也可以根据自己的需求自定义安装位置。安装完成后,还需要配置环境变量,以便系统能够找到 Java 的相关命令。在 Windows 系统中,右键点击 “此电脑”,选择 “属性”,接着点击 “高级系统设置”,在弹出的窗口中点击 “环境变量” 按钮。在 “系统变量” 区域,找到 “Path” 变量并双击进行编辑,在变量值的末尾添加 JDK 安装目录下的 “bin” 文件夹路径,例如 “C:\Program Files\Java\jdk1.8.0_333\bin”(这只是示例路径,实际路径需根据你的安装情况而定)。添加完成后,依次点击 “确定” 按钮保存设置。为了验证 JDK 是否安装成功以及环境变量是否配置正确,按下 Win + R 组合键,输入 “cmd” 打开命令提示符窗口,在窗口中输入 “java -version”,若能正确显示 Java 的版本信息,如 “java version "1.8.0_333"”,则说明 JDK 安装和环境变量配置均已成功。

(二)引入依赖

在 Java 项目中,引入依赖是获取外部库功能的重要方式。这里我们使用 Maven 项目管理工具来引入所需的依赖。Maven 通过一个名为 “pom.xml” 的文件来管理项目的依赖、构建配置等信息。

首先,引入 Hutool 工具类库的依赖。Hutool 是一个功能丰富的 Java 工具类库,它提供了许多实用的工具方法,能大大简化我们的开发工作。在 “pom.xml” 文件的 “dependencies” 标签内添加以下依赖代码:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.20</version>
</dependency>

上述代码中,“groupId” 指定了依赖的组 ID,“artifactId” 指定了依赖的模块 ID,“version” 则指定了依赖的版本号。通过添加这段代码,Maven 会在项目构建时自动从 Maven 中央仓库下载 Hutool 工具类库及其相关依赖。

接着,引入阿里云 OSS(对象存储服务)的依赖。在与大疆制图 API 整合时,可能会涉及到将生成的地图数据存储到云端,阿里云 OSS 是一个不错的选择。在 “pom.xml” 文件中继续添加阿里云 OSS 的依赖:

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
</dependency>

 添加完阿里云 OSS 依赖后,Maven 同样会自动下载该依赖及其相关的所有组件。这些依赖在后续的开发中,Hutool 工具类库将用于简化 HTTP 请求、字符串处理、日期时间操作等常见任务;阿里云 OSS 依赖则用于实现与阿里云对象存储服务的交互,方便我们存储和管理与大疆制图相关的数据 。

 核心技术揭秘:请求封装与签名生成

 

在使用 Java 整合大疆制图 API 的过程中,请求封装与签名生成是实现与 API 有效交互的关键环节。这不仅涉及到如何构建准确的 HTTP 请求,还包括如何生成符合 API 要求的签名,以确保请求的合法性和安全性。下面将详细介绍这一核心技术的实现细节。

(一)请求工具类

在 Java 中,我们借助 Hutool 工具类库中的 HttpRequest 和 HttpResponse 类来处理 HTTP 请求。HttpRequest 类提供了便捷的方法来构建各种类型的 HTTP 请求,如 GET、POST、PUT、DELETE 等。通过它,我们可以轻松设置请求的 URL、参数、头部信息以及请求体等。例如,当我们需要发送一个 GET 请求时,可以使用如下代码:

HttpRequest request = HttpRequest.get(url);

 这里的url是请求的目标地址。如果请求需要携带参数,我们可以通过form方法来添加参数,如:

request.form("param1", "value1").form("param2", "value2");

 对于请求头部信息,也可以使用header方法进行设置,像这样:

request.header("header1", "value1");

 而 HttpResponse 类则用于处理 HTTP 请求的响应。它提供了一系列方法来获取响应的状态码、响应头以及响应体等信息。例如,通过getBody方法可以获取响应的主体内容,getStatus方法则用于获取响应的状态码。当我们发送请求并得到响应后,可以这样处理:

HttpResponse response = request.execute();
String body = response.getBody();
int statusCode = response.getStatus();

通过上述操作,我们能够高效地处理与大疆制图 API 的 HTTP 通信,确保请求和响应的准确处理。

(二)签名生成算法

签名生成是与大疆制图 API 交互中的重要安全机制,它确保了请求的合法性和完整性。在 Java 中,生成签名的过程主要包括以下几个关键步骤:

首先,获取格式化日期。在与 API 交互时,日期格式有着严格要求,必须为 UTC 时间格式。我们使用 Java 8 的日期时间 API 来获取并格式化日期,代码如下:

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

private static String getFormattedDate() {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US).withZone(ZoneId.of("GMT"));
    return formatter.format(ZonedDateTime.now(ZoneId.of("GMT")));
}

上述代码中,通过DateTimeFormatter定义了日期格式,然后使用ZonedDateTime.now(ZoneId.of("GMT"))获取当前的 UTC 时间,并按照指定格式进行格式化。

接着,计算摘要。摘要计算用于对请求内容进行哈希处理,以确保内容的完整性。这里使用 SHA - 256 算法对请求体进行摘要计算,代码如下:

import java.security.MessageDigest;
import java.util.Base64;

private static String getDigest(String data) throws Exception {
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] hash = digest.digest(data.getBytes("UTF-8"));
    return Base64.getEncoder().encodeToString(hash);
}

在这段代码中,首先获取 SHA - 256 算法的实例,然后使用digest方法对请求体(data)进行哈希计算,最后通过Base64编码将哈希结果转换为字符串形式。

最后,生成签名。签名的生成基于 HMAC - SHA256 算法,结合之前获取的格式化日期、请求方法、请求路径以及摘要等信息。代码如下:

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

private static String calculateSignature(String date, String method, String uri, String digest) throws Exception {
    String content = "date: " + date + "\n@request-target: " + method + " " + uri + "\ndigest: SHA-256=" + digest;
    Mac hmacSha256 = Mac.getInstance("HmacSHA256");
    hmacSha256.init(new SecretKeySpec(DJI_SECRET_KEY.getBytes("UTF-8"), "HmacSHA256"));
    byte[] signatureBytes = hmacSha256.doFinal(content.getBytes("UTF-8"));
    return Base64.getEncoder().encodeToString(signatureBytes);
}

在这个方法中,首先构建了一个包含日期、请求目标和摘要的字符串content。然后,获取 HmacSHA256 算法的实例,并使用大疆制图 API 提供的Secret Key进行初始化。最后,对content进行签名计算,并将结果进行 Base64 编码,得到最终的签名。

(三)请求方法封装

为了更方便地与大疆制图 API 进行交互,我们将请求过程封装成一个通用的方法,这里以AccessDJ方法为例。该方法能够处理不同类型的请求(如 GET、POST、PUT、DELETE 等),并在请求中添加必要的头部信息,包括签名、日期、摘要等。以下是AccessDJ方法的实现代码:

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

public static JSONObject AccessDJ(String URI, String payload, String lowerMethod) {
    try {
        String url = HOST + URI;
        String date = getFormattedDate();
        String digest = getDigest(payload);
        String requestSignature = calculateSignature(date, lowerMethod, URI, digest);
        HttpRequest request = null;
        if (lowerMethod.equals("post")) {
            request = HttpRequest.post(url);
        } else if (lowerMethod.equals("get")) {
            request = HttpRequest.get(url);
        }
        request.header("Date", date)
              .header("Digest", "SHA-256=" + digest)
              .header("Authorization", "hmac username=\"" + DJI_APP_KEY + "\", algorithm=\"hmac-sha256\", headers=\"date @request-target digest\", signature=\"" + requestSignature + "\"")
              .header("Content-Type", "application/json;charset=UTF-8");
        if (!payload.isEmpty()) {
            request.body(payload);
        }
        HttpResponse response = request.execute();
        if (response.isOk()) {
            System.out.println("response.body() = " + response.body());
            return JSONUtil.parseObj(response.body());
        } else {
            System.out.println("HTTP error code: " + response.getStatus());
            System.out.println("response = " + response);
            return null;
        }
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

 在这个方法中,首先构建了完整的请求 URL,然后获取格式化日期、计算摘要和生成签名。根据请求方法(lowerMethod)的不同,创建相应类型的 HttpRequest 对象(GET 或 POST)。接着,为请求添加必要的头部信息,包括日期、摘要、授权签名以及内容类型。如果请求体(payload)不为空,则将其设置到请求中。最后,执行请求并处理响应。如果响应状态码为 200(即isOk()为true),则将响应体解析为JSONObject并返回;否则,打印错误信息并返回null。这样的封装使得与大疆制图 API 的交互更加简洁、高效,并且易于维护和扩展。

 关键步骤:获取 Token 与上传素材

(一)获取 Token

在与大疆制图 API 进行交互时,获取 Token 是必不可少的一步,它是后续操作的身份验证凭证。获取 Token 的请求路径为/terra-rescon-be/v2/store/obtain_token。在 Java 代码中,我们可以利用之前封装的AccessDJ方法来发送获取 Token 的请求。首先,定义获取 Token 的请求路径常量:

public static final String URI_TOKEN = "/terra-rescon-be/v2/store/obtain_token";

 然后,编写获取 Token 的方法:

public static JSONObject getAccessToken() {
    return AccessDJ(URI_TOKEN, "", "post");
}

在上述代码中,AccessDJ方法的第一个参数为请求路径URI_TOKEN,第二个参数为空字符串,表示不需要额外的请求参数,第三个参数为"post",表示使用 POST 请求方法。通过调用getAccessToken方法,我们可以向指定的请求路径发送 POST 请求,以获取 Token。

当请求成功发送后,服务器会返回一个包含 Token 信息的 JSON 格式响应。我们可以在AccessDJ方法中对响应进行处理,将其解析为JSONObject对象并返回。例如,如果响应状态码为 200(即response.isOk()为true),则通过JSONUtil.parseObj(response.body())将响应体解析为JSONObject,这样我们就可以方便地获取响应中的 Token 以及其他相关信息,如:

if (response.isOk()) {
    System.out.println("response.body() = " + response.body());
    return JSONUtil.parseObj(response.body());
} 

通过这种方式,我们成功地获取了与大疆制图 API 进行后续交互所需的 Token,为后续上传素材、创建任务等操作奠定了基础。

(二)上传素材到阿里云 OSS

在获取到 Token 后,接下来的重要步骤是将准备好的建模素材上传到阿里云 OSS。这一步骤需要使用阿里云 OSS SDK,通过之前获取的 Token 中的相关信息(如accessKeyID、secretAccessKey、cloudBucketName等)来完成上传操作。

首先,确保已经引入了阿里云 OSS SDK 的依赖,在pom.xml文件中添加的依赖如下:

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
</dependency>

 然后,编写上传文件的 Java 代码。在代码中,需要定义一些常量,如ENDPOINT(大疆智图 API 的外网访问网址,默认https://oss-cn-hangzhou.aliyuncs.com)、ACCESS_KEY_ID(Token 中的accessKeyID)、SECRET_ACCESS_KEY(Token 中的secretAccessKey)、BUCKET_NAME(Token 中的cloudBucketName)、STORE_PATH(Token 中的sessionToken)以及本地素材的路径FILE_PATH。以下是一个上传文件的方法示例:

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectResult;
import java.io.File;
import java.io.IOException;

public class TestOSS {
    public static boolean uploadFile(String ENDPOINT, String ACCESS_KEY_ID, String SECRET_ACCESS_KEY, String BUCKET_NAME, String STORE_PATH, String FILE_PATH) throws IOException {
        boolean success = false;
        try {
            // 创建OSSClient实例
            OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, SECRET_ACCESS_KEY);
            // 构建上传文件的路径,包含STORE_PATH和文件名
            String objectName = STORE_PATH + new File(FILE_PATH).getName();
            // 上传文件
            PutObjectResult result = ossClient.putObject(BUCKET_NAME, objectName, new File(FILE_PATH));
            success = true;
            // 关闭OSSClient
            ossClient.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return success;
    }
}

在上述代码中,首先使用OSSClientBuilder创建OSS客户端实例,传入ENDPOINT、ACCESS_KEY_ID和SECRET_ACCESS_KEY。然后,根据STORE_PATH和本地文件路径构建上传到 OSS 的对象名objectName。接着,使用ossClient.putObject方法将本地文件上传到指定的BUCKET_NAME和objectName路径下。如果上传成功,将success变量设为true,并关闭OSSClient。最后返回success,表示上传操作是否成功。通过这样的步骤,我们能够顺利地将建模素材上传到阿里云 OSS,为后续使用大疆制图 API 进行建模操作做好准备。

完整示例:Java 整合大疆制图 API 实战

(一)完整代码示例

以下是一个完整的 Java 代码示例,展示了如何使用大疆制图 API 获取 Token 并上传素材到阿里云 OSS:

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectResult;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import java.util.Locale;

public class DjiMapApiExample {
    // 大疆智图API的APP Key
    private static final String DJI_APP_KEY = "your_dji_app_key";
    // 大疆智图API的Secret Key
    private static final String DJI_SECRET_KEY = "your_dji_secret_key";
    // 大疆智图API 接口请求地址
    private static final String HOST = "https://openapi-cn.dji.com";
    // 获取Token的请求路径
    public static final String URI_TOKEN = "/terra-rescon-be/v2/store/obtain_token";
    // 大疆智图API的外网访问网址,默认 https://oss-cn-hangzhou.aliyuncs.com
    public static final String ENDPOINT = "https://oss-cn-hangzhou.aliyuncs.com";
    // 本地素材的路径
    public static final String FILE_PATH = "your_local_file_path";

    /*
     * URL 大疆智图API 接口请求地址
     * payload 请求参数,如果不需要请求参数,请为空字符串
     * lowerMethod 请求方法,小写字母  get/post/put/delete
     */
    public static JSONObject AccessDJ(String URI, String payload, String lowerMethod) {
        try {
            String url = HOST + URI;
            String date = getFormattedDate();
            String digest = getDigest(payload);
            String requestSignature = calculateSignature(date, lowerMethod, URI, digest);
            HttpRequest request = null;
            if (lowerMethod.equals("post")) {
                request = HttpRequest.post(url);
            } else if (lowerMethod.equals("get")) {
                request = HttpRequest.get(url);
            }
            request.header("Date", date)
                  .header("Digest", "SHA-256=" + digest)
                  .header("Authorization", "hmac username=\"" + DJI_APP_KEY + "\", algorithm=\"hmac-sha256\", headers=\"date @request-target digest\", signature=\"" + requestSignature + "\"")
                  .header("Content-Type", "application/json;charset=UTF-8");
            if (!payload.isEmpty()) {
                request.body(payload);
            }
            HttpResponse response = request.execute();
            if (response.isOk()) {
                System.out.println("response.body() = " + response.body());
                return JSONUtil.parseObj(response.body());
            } else {
                System.out.println("HTTP error code: " + response.getStatus());
                System.out.println("response = " + response);
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    private static String getFormattedDate() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US).withZone(ZoneId.of("GMT"));
        return formatter.format(ZonedDateTime.now(ZoneId.of("GMT")));
    }

    private static String getDigest(String data) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(hash);
    }

    private static String calculateSignature(String date, String method, String uri, String digest) throws NoSuchAlgorithmException, InvalidKeyException {
        String content = "date: " + date + "\n@request-target: " + method + " " + uri + "\ndigest: SHA-256=" + digest;
        Mac hmacSha256 = Mac.getInstance("HmacSHA256");
        hmacSha256.init(new SecretKeySpec(DJI_SECRET_KEY.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
        byte[] signatureBytes = hmacSha256.doFinal(content.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(signatureBytes);
    }

    public static JSONObject getAccessToken() {
        return AccessDJ(URI_TOKEN, "", "post");
    }

    public static boolean uploadFile(String ACCESS_KEY_ID, String SECRET_ACCESS_KEY, String BUCKET_NAME, String STORE_PATH) throws IOException {
        boolean success = false;
        try {
            // 创建OSSClient实例
            OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, SECRET_ACCESS_KEY);
            // 构建上传文件的路径,包含STORE_PATH和文件名
            String objectName = STORE_PATH + new File(FILE_PATH).getName();
            // 上传文件
            PutObjectResult result = ossClient.putObject(BUCKET_NAME, objectName, new File(FILE_PATH));
            success = true;
            // 关闭OSSClient
            ossClient.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return success;
    }

    public static void main(String[] args) {
        // 获取Token
        JSONObject accessToken = getAccessToken();
        if (accessToken!= null) {
            String ACCESS_KEY_ID = accessToken.getStr("accessKeyID");
            String SECRET_ACCESS_KEY = accessToken.getStr("secretAccessKey");
            String BUCKET_NAME = accessToken.getStr("cloudBucketName");
            String STORE_PATH = accessToken.getStr("sessionToken");
            try {
                // 上传文件
                boolean uploadResult = uploadFile(ACCESS_KEY_ID, SECRET_ACCESS_KEY, BUCKET_NAME, STORE_PATH);
                if (uploadResult) {
                    System.out.println("文件上传成功");
                } else {
                    System.out.println("文件上传失败");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

(二)代码解释与调试

  1. 常量定义:代码开头定义了一系列常量,包括大疆智图 API 的 APP Key、Secret Key、API 请求地址、获取 Token 的请求路径、阿里云 OSS 的外网访问网址以及本地素材的路径。这些常量在后续的代码中用于构建请求和执行操作。
  1. AccessDJ 方法:该方法是与大疆制图 API 进行交互的核心方法。它接受请求路径(URI)、请求参数(payload)和请求方法(lowerMethod)作为参数。在方法内部,首先构建完整的请求 URL,然后获取格式化的日期、计算请求体的摘要以及生成签名。根据请求方法的不同,创建相应的 HttpRequest 对象(GET 或 POST),并添加必要的头部信息,包括日期、摘要、授权签名和内容类型。如果请求参数不为空,则将其设置到请求体中。最后执行请求,并根据响应状态码处理响应结果。如果响应状态码为 200,表示请求成功,将响应体解析为JSONObject并返回;否则,打印错误信息并返回null。
  1. 日期格式化方法:getFormattedDate方法使用 Java 8 的日期时间 API 获取当前的 UTC 时间,并按照指定的格式(如 “Thu, 22 Jun 2023 12:34:56 GMT”)进行格式化。
  1. 摘要计算方法:getDigest方法使用 SHA - 256 算法对请求体进行哈希计算,并将结果进行 Base64 编码,得到请求体的摘要。
  1. 签名生成方法:calculateSignature方法基于 HMAC - SHA256 算法,结合格式化日期、请求方法、请求路径和摘要等信息生成签名。首先构建一个包含这些信息的字符串,然后使用 HmacSHA256 算法和大疆智图 API 的 Secret Key 对该字符串进行签名计算,最后将签名结果进行 Base64 编码。
  1. 获取 Token 方法:getAccessToken方法调用AccessDJ方法,向获取 Token 的请求路径发送 POST 请求,以获取 Token。如果请求成功,返回包含 Token 信息的JSONObject;否则返回null。
  1. 文件上传方法:uploadFile方法用于将本地素材上传到阿里云 OSS。它接受从 Token 中获取的accessKeyID、secretAccessKey、cloudBucketName和sessionToken作为参数。在方法内部,首先创建 OSSClient 实例,然后构建上传文件的路径,包含sessionToken和文件名。接着使用ossClient.putObject方法将本地文件上传到指定的 OSS 存储空间和路径下。如果上传成功,返回true;否则返回false,并打印异常信息。
  1. main 方法:在main方法中,首先调用getAccessToken方法获取 Token。如果获取到 Token,则从 Token 中提取accessKeyID、secretAccessKey、cloudBucketName和sessionToken,并调用uploadFile方法上传本地素材。根据上传结果打印相应的信息。

调试技巧和常见问题解决方案

  1. 请求失败:如果AccessDJ方法返回null,首先检查控制台打印的错误信息,可能是 HTTP 状态码不为 200,这可能是由于请求参数错误、签名不正确、网络问题等原因导致。可以通过打印请求的 URL、头部信息和请求体来检查请求是否正确。
  1. 签名错误:签名生成过程较为复杂,容易出现错误。如果签名验证失败,检查calculateSignature方法中的参数是否正确,特别是日期格式、请求方法、请求路径和摘要。确保DJI_SECRET_KEY的正确性,并且在生成签名时使用的编码方式与 API 要求一致。
  1. 文件上传失败:在uploadFile方法中,如果上传失败,检查控制台打印的异常信息。可能是由于 OSS 配置错误(如ENDPOINT、ACCESS_KEY_ID、SECRET_ACCESS_KEY不正确)、文件路径错误、文件不存在等原因导致。可以先手动验证本地文件路径是否正确,然后检查 OSS 相关配置是否与 Token 中的信息一致。
  1. Token 获取失败:如果getAccessToken方法返回null,检查大疆智图 API 的账号和密钥是否正确,以及申请的 API 权限是否满足获取 Token 的要求。同时,检查网络连接是否正常,确保能够成功访问大疆智图 API 的服务器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值