阿里云DataHub RestAPI使用示例

概述

阿里云流数据处理平台DataHub是流式数据(Streaming Data)的处理平台,提供对流式数据的发布(Publish),订阅(Subscribe)和分发功能,让您可以轻松构建基于流式数据的分析和应用。目前官方提供了Java和Python的SDK,用户可以方便的使用SDK完成相关功能的集成开发。目前管理API还没有提供对应的SDK,本文以通用的org.apache.http.client.HttpClient为依赖,演示API如何创建Project,其它类型API的使用方法类似。


pom.xml

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.4</version>
</dependency>

Code Sample

import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;


//创建DataHub Project
public class Demo {

    public static void main(String[] args) {

        String accesskey = "********";
        String accessSecret = "********";
        String projectName = "testproject";//项目的名称
        String resource = "/projects/" +projectName;

        //获取系统时间
        Calendar cd = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
        sdf.setTimeZone(TimeZone.getTimeZone("GMT")); // 设置时区为GMT
        String str = sdf.format(cd.getTime());

        //生成Authorization认证信息
        String strToSign = "POST\n" +
                "application/json\n" +
                 str +
                "\n" +
                "x-datahub-client-version:1.1\n" +
                resource;

        byte[] crypto = hmacsha1Signature(strToSign.getBytes(),
                accessSecret.getBytes());

        String signature = Base64.encodeBase64String(crypto).trim();
        String authorization = "DATAHUB " + accesskey + ":" + signature;

        HttpClient httpclient = HttpClients.createDefault();
        try {
            //根据自己创建服务所在的区域设置域名
            URIBuilder builder = new URIBuilder("https://dh-cn-hangzhou.aliyuncs.com" + resource);
            URI uri = builder.build();
            HttpPost request = new HttpPost(uri);
            request.addHeader("Authorization", authorization);
            request.addHeader("x-datahub-client-version", "1.1");
            request.addHeader("Date", str);
            request.addHeader("Content-Type","application/json");

            // Request body
            StringEntity reqEntity = new StringEntity(" {\n" +
                    "      \"Action\": \"create\",\n" +
                    "      \"Comment\": \"create project\"\n" +
                    "  }");

            request.setEntity(reqEntity);
            HttpResponse response = httpclient.execute(request);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                System.out.println(EntityUtils.toString(entity));
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    //创建认证签名
    public static byte[] hmacsha1Signature(byte[] data, byte[] key) {
        try {
            SecretKeySpec signingKey = new SecretKeySpec(key, "HmacSHA1");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(signingKey);
            return mac.doFinal(data);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }
}

注意

  • DATE 表示此次操作的时间,不能为空,目前只支持GMT格式,如果请求时间和服务器时间相差超过15分钟,服务器会判定此请求的认证信息过期,所以在请求的过程中注意本地机器与标准时间尽量保持同步;
  • strToSign 参数不同的请求类型会不同,请参考官方API文档说明,在使用到其它类型API时进行调整。

更多参考

DataHub API参考

请求签名机制

猜你喜欢

转载自yq.aliyun.com/articles/684740
今日推荐