开发者社区> 问答> 正文

SCDN如何调用接口?

SCDN如何调用接口?

展开
收起
保持可爱mmm 2020-03-29 16:00:06 511 0
1 条回答
写回答
取消 提交回答
  • 对SCDN服务接口的调用是通过向SCDN服务端发送HTTP请求(可以通过HTTP或HTTPS通道发送),并获取SCDN服务对该请求响应结果的过程。SCDN服务端在接收到用户请求后,对请求做必要的身份验证和参数验证,在所有验证成功后根据请求的指定参数提交或完成相应操作,并把处理的结果以HTTP响应地形式返回给调用者。 请求组成 请求由以下几个部分组成: HTTP方法——目前scdn服务的所有接口只支持GET方法的调用。 请求URL——请求的服务地址、要执行的操作名称、操作参数和公共请求参数都包含在请求的URL中。 服务端地址:scdn服务的域名是http://scdn.aliyuncs.com/和https://scdn.aliyuncs.com/。为了保证请求的安全性,强烈推荐您使用HTTPS通道。 (HTTPS加入了SSL层对通信进行了加密,可以防止通信被截获而导致敏感信息泄露。) 操作名称:每个接口都需要指定要执行的操作名称,即Action参数。 操作参数:根据要执行的操作不同,需要传入不同的操作参数,详见每个接口的说明。 公共请求参数:包含时间戳、签名信息等每个请求都要包含的参数。 为了使服务端能够正确地验证用户的身份并授权请求执行,请求在提交前要进行签名处理。签名的规则参见签名机制一节。 在服务端对请求处理完成后,会返回响应结果。响应结果分为成功结果和错误消息,格式描述参见JSON返回示例:

    { "RequestId": "4C467B38-3910-447D-87BC-AC049166F216", /* 返回结果数据 */ } 返回结果一节。客户端可以解析响应的消息体,得到执行结果。 调用示例 以DescribeScdnService接口为例: 对应的Action是DescribeScdnService。在添加了所有公共请求参数(除Signature)后,请求的URL是(为了便于阅读,这里是进行URL编码前的URL):

    http://scdn.aliyuncs.com/?TimeStamp=2012-12-26T10:33:56Z&Format=XML&AccessKeyId=testid&Action= DescribeScdnService &SignatureMethod=HMAC-SHA1&SignatureNonce=NwDAxvLU6tFE0DVb&Version=2013-01-10&SignatureVersion=1.0 按照签名计算规则,先构造出规范化请求字符串(Canonicalized Query String),如下:

    http://scdn.aliyuncs.com/?TimeStamp=2012-12-26T10:33:56Z&Format=XML&AccessKeyId=testid&Action= DescribeScdnService &SignatureMethod=HMAC-SHA1&SignatureNonce=NwDAxvLU6tFE0DVb&Version=2013-01-10&SignatureVersion=1.0 再构造出用于签名的字符串StringToSign值为:

    GET&%2F&AccessKeyId%3Dtestid%26Action% DescribeScdnService %26Format%3DXML%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3DNwDAxvLU6tFE0DVb%26SignatureVersion%3D1.0%26TimeStamp%3D2012-12-26T10%253A33%253A56Z%26Version%3D2013-01-10 以下Java示例代码演示了如何添加公共请求参数、如何构造用请求参数构造规范化请求字符串,以及如何构造StringToSign字符串。示例假定所有请求参数放在一个Map <String, String>对象里,使用的Access Key ID是“testid”。

        final String HTTP_METHOD = "GET";
    

    …………………………………… 其中需要注意的是,TimeStamp参数要求符合ISO8601规范,并注意使用UTC时间,否则会遇到错误。下面的示例代码演示了如何生成符合规范的TimeStamp字符串:

    private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
    
    private static String formatIso8601Date(Date date) {
        SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
        df.setTimeZone(new SimpleTimeZone(0, "GMT"));
        return df.format(date);
    }
    

    生成规范化请求字符串(示例中的canonicalizedQueryString变量),以及stringToSign时,都需要进行必要的编码。编码的规则在签名机制一节中有详细描述。下面的示例代码演示了如何用java.net.URLEncoder类完成编码:

           private static final String ENCODING = "UTF-8";
    
        private static String percentEncode(String value)
            throws UnsupportedEncodingException{
        return value != null ?
                URLEncoder.encode(value, ENCODING).replace("+", "%20")
                .replace("*", "%2A").replace("%7E", "~")
                : null;
    }
    

    假定使用的Access Key Id是“testid”,Access Key Secret是“testsecret”,用于计算HMAC的Key就是“testsecret&”,最终计算得到的签名值为:

    SDFQNvyH5rtkc9T5Fwo8DOjw5hc= 计算签名的示例代码(Java):

            // 以下是一段计算签名的示例代码
        final String ALGORITHM = "HmacSHA1";
        final String ENCODING = "UTF-8";
        key = "testsecret&";
    
        Mac mac = Mac.getInstance(ALGORITHM);
        mac.init(new SecretKeySpec(
                 key.getBytes(ENCODING), ALGORITHM));
        byte[] signData = mac.doFinal(
                  stringToSign.getBytes(ENCODING));
    
        String signature =
                  new String(Base64.encodeBase64(signData));
    

    增加签名参数后,请按照RFC3986规则进行URL编码后得到的

    http://scdn.aliyuncs.com/?TimeStamp=2012-12-26T10%3A33%3A56Z&Format=XML&AccessKeyId=testid&Action= DescribeScdnService &SignatureMethod=HMAC-SHA1&RegionId=region1&SignatureNonce=NwDAxvLU6tFE0DVb&Version=2012-09-13&SignatureVersion=1.0&Signature=SDFQNvyH5rtkc9T5Fwo8DOjw5hc%3d 接下来,通过HTTP请求的方式向上面的URL地址发送HTTP请求,并得到SCDN服务端的响应结果(示例): none 通过解析这个XML结果即可以得到所有可用的地域Id和LocalName的列表。如果在提交请求时,指定Format参数为JSON,那么返回结果的格式为JSON格式

    2020-03-29 16:00:23
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载