开发者社区> 问答> 正文

万网的云解析API请求不成功,求指教

用java 做一个get请求查询郁闷解析,
看了api文档,也看了实例,感觉只写了部分,没串起来,老是请求不成功,请帮我看看 ,我感觉是缺少了很多东西。

        final String HTTP_METHOD = "GET";
        Map<String, String> parameters = new HashMap<String, String>();

        // 加入请求参数
        parameters.put("Action", "DescribeDomainRecords");
        parameters.put("DomainName", "xxxxxxxx.com");
        parameters.put("Version", "2015-01-09");
        parameters.put("AccessKeyId", "ACESSKEYIDXXXXXXX");
        parameters.put("TimeStamp", DateHelper.formatIso8601Date(new Date()));
        parameters.put("SignatureMethod", "HMAC-SHA1");
        parameters.put("SignatureVersion", "1.0");
        parameters.put("SignatureNonce", UUID.randomUUID().toString());
        parameters.put("Format", "JSON");

        // 对参数进行排序,注意严格区分大小写
        String[] sortedKeys = parameters.keySet().toArray(new String[]{});
        Arrays.sort(sortedKeys);
        final String SEPARATOR = "&";

        // 生成stringToSign字符串
        StringBuilder stringToSign = new StringBuilder();
        stringToSign.append(HTTP_METHOD).append(SEPARATOR);
        stringToSign.append(percentEncode("/")).append(SEPARATOR);

        StringBuilder canonicalizedQueryString = new StringBuilder();

        for (String key : sortedKeys) {
            // 这里注意对key和value进行编码
            canonicalizedQueryString.append("&")
                    .append(percentEncode(key)).append("=")
                    .append(percentEncode(parameters.get(key)));
        }

        // 这里注意对canonicalizedQueryString进行编码
        stringToSign.append(percentEncode(canonicalizedQueryString.toString().substring(1)));

        // 计算签名
        final String ALGORITHM = "HmacSHA1";
        final String ENCODING = "UTF-8";
        //Access Key Secret 是“ACCESSKEYSECRETXXXXXXXXXXXXXXXX"
        String key = "ACCESSKEYSECRETXXXXXXXXXXXXXXXX&";
        Mac mac = Mac.getInstance(ALGORITHM);
        mac.init(new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM));
        byte[] signData = mac.doFinal(stringToSign.toString().getBytes(ENCODING));
        String signature = new String(Base64.encodeBase64(signData));
        signature = percentEncode(signature);
        canonicalizedQueryString.append("&Signature").append("=").append(signature);

        String url = canonicalizedQueryString.toString();


       // todo  HttpClient 请求.......

返回403
估计是Signature生成不正确
我看了下 生成的Signature 又是根据url去计算的,比较乱,谁帮忙修正下


展开
收起
细雨醉相思 2015-05-16 13:29:11 8119 0
3 条回答
写回答
取消 提交回答
  • 不成功有什麼錯誤返回不
    2015-06-10 06:59:59
    赞同 展开评论 打赏
  • 回 1楼(细雨醉相思) 的帖子
    你好,以下是我们的开发人员测试用的相关代码,供您参考。
        
    /*
    * Copyright 2015 Aliyun.com All right reserved. This software is the
    * confidential and proprietary information of Aliyun.com ("Confidential
    * Information"). You shall not disclose such Confidential Information and shall
    * use it only in accordance with the terms of the license agreement you entered
    * into with Aliyun.com .
    */
    package com.util;
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import javax.crypto.Mac;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    import javax.xml.crypto.dsig.SignatureMethod;
    import com.alibaba.fastjson.JSON;
    import com.google.common.base.Splitter;
    import com.google.common.io.BaseEncoding;
    /**
    * 类TopSignature.java的实现描述:TODO 类实现描述
    * @author
    */
    @SuppressWarnings("restriction")
    public class TopSignature {
        private static String accessId     = "testid";
        private static String accessSecret = "testsecret";
        private static String SEPARATOR = "&";
        private static String ENCODE_TYPE = "utf-8";
        private static String EQUAL       = "=";
        public static void main(String[] args) throws UnsupportedEncodingException, InvalidKeyException,
                NoSuchAlgorithmException {
            String x = "TimeStamp=2014-08-15T11%3A10%3A07Z&Format=xml&AccessKeyId=testid&Action=DescribeScalingGroups&SignatureMethod=HMAC-SHA1&RegionId=cn-qingdao&SignatureNonce=1324fd0e-e2bb-4bb1-917c-bd6e437f1710&SignatureVersion=1.0&Version=2014-08-28";
            Map<String, String> map = new HashMap<String, String>();
            List<String> list = Splitter.on("&").splitToList(x);
            for (String s : list) {
                List<String> kv = Splitter.on("=").splitToList(URLDecoder.decode(s, ENCODE_TYPE));
                if (kv.size() == 2) {
                    map.put(kv.get(0), kv.get(1));
                }
            }
            System.out.println(JSON.toJSONString(map, true));
            String signature = sig("GET", map);
            System.out.println("Signature:" + signature);
            System.out.println("urlencode:" + URLEncoder.encode(signature, ENCODE_TYPE));
        }
        private static String sig(String method, Map<String, String> param) throws NoSuchAlgorithmException,
                UnsupportedEncodingException,
                InvalidKeyException {
            List<String> keys = new ArrayList<String>(param.keySet());
            // Step 1: canonicalize
            Collections.sort(keys);
            StringBuilder sb = new StringBuilder();
            for (String key : keys) {
                String value = param.get(key);
                sb.append(SEPARATOR).append(percentEncode(key)).append(EQUAL).append(percentEncode(value));
            }
            String canonicalizedQueryString = sb.substring(1);
            // Step 2: prepare string to sign
            StringBuilder signedData = new StringBuilder();
            signedData.append(percentEncode(method));
            signedData.append(SEPARATOR);
            signedData.append(percentEncode("/"));
            signedData.append(SEPARATOR);
            signedData.append(percentEncode(canonicalizedQueryString));
            String stringToSign = signedData.toString();
            // Step 3: sign
            SecretKey key = new SecretKeySpec((accessSecret + SEPARATOR).getBytes(ENCODE_TYPE), SignatureMethod.HMAC_SHA1);
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(key);
            byte[] hmacValue = mac.doFinal(stringToSign.getBytes(ENCODE_TYPE));
            // Step 4: base64 encode
            return BaseEncoding.base64().encode(hmacValue);
        }
        private static String percentEncode(String s) throws UnsupportedEncodingException {
            if (s == null)
                return null;
            return URLEncoder.encode(s, ENCODE_TYPE).replace("+", "%20").replace("*", "%2A").replace("%7E", "~");
        }
    }
    2015-05-19 10:28:54
    赞同 展开评论 打赏
  • Re万网的云解析API请求不成功,求指教
    不要沉啊, 求帮助啊。。。。。
    2015-05-18 18:50:07
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像