Microsoft Azure Cdn 接口对接详解

背景

随着公司跟chinaCache公司的cdn服务到期,最终选择了微软的Azure Cdn进行合作,因此需要在将原有的接口上进行拓展,支持Azure Cdn接口的支持。

官网对接文档:https://docs.azure.cn/zh-cn/cdn/cdn-api-signature

各位假如直接看官方接口文档进行对接,可能多少会有点懵,因为接口比较多,不知道具体要对接哪几个,以及请求header入参等多少都会有些坑。

 

如果大家以前公司用的是CHINACACHE公司的cdn产品的话,应该都知道这个对接,是直接通过输入用户名、密码、task的json格式进行传输。而Azure CDN 跟这种方式传输还是蛮大差别的。最近接口对接也已经上线, 我这边整理了自己对接的一些感受,还有遇到过的坑,希望对有需要的朋友有帮助。

步骤

 

建议可以先去看下官方的对接文档,先大致熟悉下对接流程。

我这边主要需要用到以下几个菜单,大家可以直接参考官网

  •    CDN API签名机制
  •    节点管理-获取订阅下所有节点信息
  •    缓存刷新-添加缓存刷新

对接流程也是按照上面几个步骤进行的,下面我会结合代码分别进行介绍

1.CDN API签名机制

 

这一步主要根据入参条件不同生成不同的签名字符串,签名生成方法封装到AzureSignTool

package com.trendy.ccp.server.cdn.tool;

 

import java.net.URL;

import java.util.Map;

import java.util.TreeMap;

import java.util.stream.Collectors;

 

import javax.crypto.Mac;

import javax.crypto.spec.SecretKeySpec;

 

/****

*

* @ClassName: AzureSignTool

* @Description: 微软生产api签名

* @author youqiang.xiong

* @date 2018年1月10日下午5:30:35

*

*/

publicclass AzureSignTool {

 

    /**

     * Calculate the authorization header

     *

     * @param requestURL Complete request URL with scheme, host, path and queries

     * @param requestTime UTC request time with format "yyyy-MM-dd hh:mm:ss"

     * @param keyID API key ID

     * @param keyValue API key value

     * @param httpMethod HTTP method in upper case

     * @return Calculated authorization header

     */

    publicstatic String calculateAuthorizationHeader(String requestURL,

            String requestTime, String keyID, String keyValue, String httpMethod)

            throws Exception {

        URL url = new URL(requestURL);

        String path = url.getPath();

 

        // Get query parameters

        String query = url.getQuery();

        String[] params = query.split("&");

        Map<String, String> paramMap = new TreeMap<String, String>();

        for (String param : params) {

            String[] paramterParts = param.split("=");

            if (paramterParts.length != 2) {

                continue;

            }

 

            paramMap.put(paramterParts[0], paramterParts[1]);

        }

 

        String orderedQueries = paramMap.entrySet().stream()

                .map(entry -> entry.getKey() + ":" + entry.getValue())

                .collect(Collectors.joining(", "));

 

        String content = String.format("%s\r\n%s\r\n%s\r\n%s", path,

                orderedQueries, requestTime, httpMethod);

        Mac sha256HMAC = Mac.getInstance("HmacSHA256");

        SecretKeySpec secret_key = new SecretKeySpec(keyValue.getBytes(),"HmacSHA256");

        sha256HMAC.init(secret_key);

        byte[] bytes = sha256HMAC.doFinal(content.getBytes());

 

        StringBuffer hash = new StringBuffer();

        for (inti = 0; i < bytes.length; i++) {

            String hex = Integer.toHexString(0xFF & bytes[i]);

            if (hex.length() == 1) {

                hash.append('0');

            }

            hash.append(hex);

        }

 

        return String.format("AzureCDN %s:%s", keyID, hash.toString()

                .toUpperCase());

    }

 

String orderedQueries = paramMap.entrySet().stream()

                .map(entry -> entry.getKey() + ":" + entry.getValue())

                .collect(Collectors.joining(", "));


注意:以上这段代码采用的jdk1.8stream语法,需要使用jdk1.8进行编译,如果原来并未使用1.8的话,需要将1.8的语法转化成低版本的语法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值