全部产品

调用示例

调用智能媒体生产服务接口,是向智能媒体生产服务端发送HTTP请求(可通过HTTP或HTTPS通道发送),并获取响应结果的过程。智能媒体生产服务端接收到用户请求后,对请求进行身份验证和参数验证,验证成功后,根据请求的指定参数提交或完成相应操作,并把处理结果以HTTP响应的形式返回给调用者。

可以使用原生的 HTTP 请求来直接调用智能媒体生产服务的接口。 也可以使用更简洁的 SDK 方式来调用。 下面以 Java 为例,重点讲述 HTTP 请求调用。

SDK 调用

参考 SDK示例

HTTP 请求调用示例

以下Java示例代码演示了如何添加公共参数和私有参数、如何用请求参数构造规范化请求字符串、如何构造StringToSign字符串,以及如何获得OpenAPI地址,最终以Get方式发送Http请求,获取相应的响应结果。如果您需要使用以下示例,请替换示例中的必选参数及私有参数。

  • 添加jar包依赖

注意 使用httpclient get请求。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.1</version>
  </dependency>
  • JAVA代码

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import sun.misc.BASE64Encoder;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.security.SignatureException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.Logger;

/**
 * 智能媒体生产OpenAPI调用示例
 * 以GetEditingProject接口为例,其他接口请替换相应接口名称及私有参数
 */
public class Main {
    //账号AccessKey信息请填写(必选)
    private static String access_key_id = "";
    //账号AccessKey信息请填写(必选)
    private static String access_key_secret = "";
    //STS临时授权方式访问时该参数为必选,使用主账号AccessKey和RAM子账号AccessKey不需要填写
    private static String security_token = "";
    //ICE API 的服务接入地址为:ice.{ApiRegion}.aliyuncs.com,{ApiRegion}请替换成对应API接入区域的标识
    private final static String ICE_DOMAIN = "http://ice.cn-shanghai.aliyuncs.com";
                        
    //以下参数不需要修改
    private final static String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
    private final static String HTTP_METHOD = "GET";
    private final static String HMAC_SHA1_ALGORITHM = "HmacSHA1";
    private final static String UTF_8 = "utf-8";
    private final static Logger LOG = Logger.getLogger(Main.class.getName());

public static void main(String[] args) throws Exception {
    //生成私有参数,不同API需要修改
    Map<String, String> privateParams = generatePrivateParamters();
    //生成公共参数,不需要修改
    Map<String, String> publicParams = generatePublicParamters();
    //生成OpenAPI地址,不需要修改
    String URL = generateOpenAPIURL(publicParams, privateParams);
    //发送HTTP GET 请求
    httpGet(URL);
}
  /**
    * 生成智能媒体生产OpenAPI私有参数
    * 不同API需要修改此方法中的参数
    * @return
   */
private static Map<String, String> generatePrivateParamters() {
    // 接口私有参数列表, 不同API请替换相应参数
    Map<String, String> privateParams = new HashMap<>();
    // 视频ID
    privateParams.put("ProjectId","64a64d349eac4489bf95d485a73b9cef");
    // API名称
    privateParams.put("Action", "GetEditingProject");
    return privateParams;
}
  /**
   * 生成智能媒体生产OpenAPI公共参数
   * 不需要修改
   * @return
   */
private static Map<String, String> generatePublicParamters() {
    Map<String, String> publicParams = new HashMap<>();
    publicParams.put("Format", "JSON");
    publicParams.put("Version", "2020-11-09");
    publicParams.put("AccessKeyId", access_key_id);
    publicParams.put("SignatureMethod", "HMAC-SHA1");
    publicParams.put("Timestamp", generateTimestamp());
    publicParams.put("SignatureVersion", "1.0");
    publicParams.put("SignatureNonce", generateRandom());
    if (security_token != null && security_token.length() > 0) {
        publicParams.put("SecurityToken", security_token);
    }
    return publicParams;
}

 /**
   * 生成OpenAPI地址
   * @param privateParams
   * @return
   * @throws Exception
   */
private static String generateOpenAPIURL(Map<String, String> publicParams, Map<String, String> privateParams) {
    return generateURL(ICE_DOMAIN, HTTP_METHOD, publicParams, privateParams);
}
/**
  * @param domain        请求地址
  * @param httpMethod    HTTP请求方式GET,POST等
  * @param publicParams  公共参数
  * @param privateParams 接口的私有参数
  * @return 最后的url
 */
private static String generateURL(String domain, String httpMethod, Map<String, String> publicParams, Map<String, String> privateParams) {
    List<String> allEncodeParams = getAllParams(publicParams, privateParams);
    String cqsString = getCQS(allEncodeParams);
    out("CanonicalizedQueryString = " + cqsString);
    String stringToSign = httpMethod + "&" + percentEncode("/") + "&" + percentEncode(cqsString);
    out("StringtoSign = " + stringToSign);
    String signature = hmacSHA1Signature(access_key_secret, stringToSign);
    out("Signature = " + signature);
    return domain + "?" + cqsString + "&" + percentEncode("Signature") + "=" + percentEncode(signature);
}

private static List<String> getAllParams(Map<String, String> publicParams, Map<String, String> privateParams) {
  List<String> encodeParams = new ArrayList<String>();
    if (publicParams != null) {
        for (String key : publicParams.keySet()) {
            String value = publicParams.get(key);
            //将参数和值都urlEncode一下。
            String encodeKey = percentEncode(key);
            String encodeVal = percentEncode(value);
            encodeParams.add(encodeKey + "=" + encodeVal);
        }
    }
    if (privateParams != null) {
        for (String key : privateParams.keySet()) {
            String value = privateParams.get(key);
            //将参数和值都urlEncode一下。
            String encodeKey = percentEncode(key);
            String encodeVal = percentEncode(value);
            encodeParams.add(encodeKey + "=" + encodeVal);
        }
    }
    return encodeParams;
}
/**
* 参数urlEncode
*
* @param value
* @return
*/
private static String percentEncode(String value) {
    try {
        String urlEncodeOrignStr = URLEncoder.encode(value, "UTF-8");
        String plusReplaced = urlEncodeOrignStr.replace("+", "%20");
        String starReplaced = plusReplaced.replace("*", "%2A");
        String waveReplaced = starReplaced.replace("%7E", "~");
        return waveReplaced;
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return value;
}

/**
* 获取CQS 的字符串
*
* @param allParams
* @return
*/
private static String getCQS(List<String> allParams) {
    ParamsComparator paramsComparator = new ParamsComparator();
    Collections.sort(allParams, paramsComparator);
    String cqString = "";
    for (int i = 0; i < allParams.size(); i++) {
        cqString += allParams.get(i);
        if (i != allParams.size() - 1) {
            cqString += "&";
        }
    }
    return cqString;
}

private static class ParamsComparator implements Comparator<String> {
    @Override
    public int compare(String lhs, String rhs) {
        return lhs.compareTo(rhs);
    }
}

private static String hmacSHA1Signature(String accessKeySecret, String stringtoSign) {
    try {
        String key = accessKeySecret + "&";
        try {
            SecretKeySpec signKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);
            Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
            mac.init(signKey);
            byte[] rawHmac = mac.doFinal(stringtoSign.getBytes());
            //按照Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)
            return new String(new BASE64Encoder().encode(rawHmac));
            } catch (Exception e) {
            throw new SignatureException("Failed to generate HMAC : " + e.getMessage());
        }
    } catch (SignatureException e) {
        e.printStackTrace();
    }
    return "";
}

/**
* 生成随机数
*
* @return
*/
private static String generateRandom() {
    String signatureNonce = UUID.randomUUID().toString();
    return signatureNonce;
}

/**
* 生成当前UTC时间戳
*
* @return
*/
public static String generateTimestamp() {
    Date date = new Date(System.currentTimeMillis());
    SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
    df.setTimeZone(new SimpleTimeZone(0, "GMT"));
    return df.format(date);
}

private static String httpGet(String url) throws Exception {
    CloseableHttpClient httpClient = null;
    try {
        httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet();
        httpGet.setURI(new URI(url));
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(3000)
                .setSocketTimeout(3000)
                .build();
        httpGet.setConfig(requestConfig);
        HttpResponse result = httpClient.execute(httpGet);

        String str;
        try {
            /**读取服务器返回过来的json字符串数据**/
            str = EntityUtils.toString(result.getEntity());
            EntityUtils.consume(result.getEntity());
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
        out(str);
        // 这里可以解析智能媒体生产服务端的响应结果
        return str;
    } catch (URISyntaxException e) {
        e.printStackTrace();
        throw e;
    } catch (ClientProtocolException e) {
        e.printStackTrace();
        throw e;
    } catch (IOException e) {
        e.printStackTrace();
        throw e;
    } finally {
        try {
            if (httpClient != null)
                httpClient.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }
}

private static void out(String newLine) {
    System.out.println(newLine);
    LOG.info(newLine);
}
}
        
最终得到URL:
http://ice.cn-shanghai.aliyuncs.com?AccessKeyId=testAccessKeyId&Action=GetEditingProject&Format=JSON&Project=64a64d349eac4489bf95d485a73b9cef&SignatureMethod=HMAC-SHA1&SignatureNonce=526bd033-a426-492c-aafb-1404d8d07ace&SignatureVersion=1.0&Timestamp=2020-12-28T12%3A38%3A25Z&Version=2020-11-09&Signature=%2Fb%2FQblisruV3ZGUCG048LTsKHB8%3D
        
通过HTTP请求的方式向上述URL地址发送HTTP请求,得到响应结果,此处以JSON格式为例:

{
 "RequestId": "25818875-5F78-4A13-BEF6-D7393642CA58",
 "EditingProject": {
     "ProjectId": "******0b4f6f44eab54b6e91d2******",
     "Title": "测试云剪辑工程",
     "Duration": 135.6,
     "CoverURL": "https://image.example.com/sample.jpg",
     "Status": "Normal"
  }
}