产品经理教你写代码【二】—批量添加多个IP到共享带宽

引言

在第一篇博客里面提到了如何拼接出一个调用Open API的URL。
?spm=5176.8091938.0.0.88lzXf
具备这个能力后,可以做很多事情。比如说可灵活定制的批量处理操作、或可灵活定制的监控查询动作。
这篇文章介绍一个批量添加EIP到共享带宽。这个功能后续会在控制台上线,在没上线之前可以用本文的方法批量添加多个IP到共享带宽。

源代码



import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.HashMap;
import java.util.Arrays;

import org.apache.commons.codec.binary.Base64;

import java.text.SimpleDateFormat;
import java.util.Map;
import java.util.SimpleTimeZone;
import java.util.UUID;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.*;

import javax.swing.;import java.awt.event.;

public class ApiDemo  extends JFrame {

    private static final String ENCODING = "UTF-8";
    private static final String ALGORITHM = "HmacSHA1";

    private static final String HTTP_METHOD = "GET";

    //不同的产品API version不一样
    private static final String urlAPIVersion = "2016-04-28";
    private static final String urlSecALG = "HMAC-SHA1";
    private static final String urlSecVer = "1.0";
    private   String urlAccKeyID = "";
    private   String ulrSeckey = "";

    private static String urlSecNonce = UUID.randomUUID().toString();
    private static final String urlFromat = "xml";
    private  String ulrTimeStamp =formatIso8601Date(new Date());

    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);
    }

    public void AddIpToCbwp(String strAccKeyID,String strSeckey,String StrRegion,String StrCbwpid,String strIps) throws Exception {  

                  String strcmd  ="";

                   String Ips= strIps;
                   String[] splitAddress=Ips.split(";"); //如果以竖线为分隔符,则split的时候需要加上两个斜杠【\\】进行转义

                   for (int i = 0; i < splitAddress.length; i++) {
                       System.out.println();

                        strcmd = "Action=AddCommonBandwidthPackageIp;RegionId=";
                        strcmd += StrRegion;
                        strcmd += ";BandwidthPackageId=";
                        strcmd += StrCbwpid;
                        strcmd += ";IpInstanceId=";
                        strcmd += splitAddress[i];

                        try {
                            String strUR1 = CreatApiURL(strAccKeyID,strSeckey,strcmd);
                            new URL(strUR1).openStream();
                            System.out.println(" "+splitAddress[i] + "    添加成功");
                        } catch (Exception e2) {
                            // TODO Auto-generated catch block
                            //e2.printStackTrace();
                            System.out.println(" "+splitAddress[i] + "    添加失败:已添加或不是后付费类型EIP");
                        }

                   }

                    try{
                        Thread thread = Thread.currentThread();
                        thread.sleep(100);//暂停0.1秒后程序继续执行
                    }catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }

             }

    public String CreatApiURL(String strAccKeyID,String strSeckey,String strcmd) throws Exception {  

        urlAccKeyID=strAccKeyID;
        ulrSeckey =strSeckey;
        ulrSeckey = ulrSeckey+"&";
        String  urlNonce = UUID.randomUUID().toString();

        String phrase =strcmd;

        Date date = new Date();
        SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
        df.setTimeZone(new SimpleTimeZone(0, "GMT"));
        ulrTimeStamp = df.format(date);

        Map<String, String> parameters = new HashMap<String, String>();
        // 加入公共请求参数
        parameters.put("Format", urlFromat);
        parameters.put("Version", urlAPIVersion);
        parameters.put("SignatureMethod", urlSecALG);
        parameters.put("SignatureNonce", urlNonce);
        parameters.put("SignatureVersion", urlSecVer);
        parameters.put("AccessKeyId", urlAccKeyID);
        parameters.put("Timestamp", ulrTimeStamp);

         String delims1 = ";";
         String[] tokens1 = phrase.split(delims1);

         for (int i = 0; i < tokens1.length; i++)
         {
             String delims2 = "=";
             String[] tokens2 = tokens1[i].split(delims2);

             parameters.put(tokens2[0], tokens2[1]);
         }

        // 对参数进行排序
        String[] sortedKeys = parameters.keySet().toArray(new String[]{});
        Arrays.sort(sortedKeys);
        final String SEPARATOR = "&";
        // 生成stringToSign字符串
        StringBuilder stringToSign = new StringBuilder();
        stringToSign.append(HTTP_METHOD).append(SEPARATOR);

        String value = "/";
        try {
            value = URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~")  ;
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        stringToSign.append(value).append(SEPARATOR);

        StringBuilder canonicalizedQueryString = new StringBuilder();
        for(String key : sortedKeys) {
            // 这里注意对key和value进行编码
            String value1 = key;
            try {
                value1 = URLEncoder.encode(value1, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~")  ;
            } catch (UnsupportedEncodingException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            String value2 = parameters.get(key);
            try {
                value2 = URLEncoder.encode(value2, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~")  ;
            } catch (UnsupportedEncodingException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            canonicalizedQueryString.append("&")
            .append(value1).append("=")
            .append(value2);

        }
        // 这里注意对canonicalizedQueryString进行编码
        String value3 = canonicalizedQueryString.toString().substring(1);
        try {
            value3 = URLEncoder.encode(value3, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~")  ;
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        stringToSign.append(value3);

        Mac mac = null;
        try {
            mac = Mac.getInstance(ALGORITHM);
        } catch (NoSuchAlgorithmException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {

            mac.init(new SecretKeySpec(ulrSeckey.getBytes(ENCODING), ALGORITHM));
        } catch (InvalidKeyException | UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        byte[] signData = null;
        try {
            signData = mac.doFinal(stringToSign.toString().getBytes(ENCODING));
        } catch (IllegalStateException | UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        String signature = new String(Base64.encodeBase64(signData));

        value = signature;
        try {
            value = URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~")  ;
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        String urlSignature = value;

        StringBuilder urlReq = new StringBuilder();
        //vpc的调用入口,如果是云监控的入口,则是http://metrics.cn-beijing.aliyuncs.com/的形式
        urlReq.append("https://vpc.aliyuncs.com");
        urlReq.append("?Signature=");
        urlReq.append(urlSignature);

        for(String key : sortedKeys) {
            urlReq.append("&")
            .append(key)
            .append("=")
            .append(parameters.get(key));
        }

        System.out.println(urlReq.toString());  

        return urlReq.toString();

     }

    public ApiDemo() throws Exception {  

           setSize(500,800);

           setLayout(new FlowLayout(FlowLayout.CENTER,10,30));

           JPanel panel=new JPanel();
           JTextField textField_AccID=new JTextField(30);
           JTextField textField_Acckey=new JTextField(30);

           JTextField textField_region=new JTextField(30);
           JTextField textField_cbwpid=new JTextField(30);

           JTextArea textArea_ip=new JTextArea(10,30);

           JButton    button=new JButton("       批量添加IP到共享带宽     ");

           JLabel AccID=new JLabel("请输入Access Key ID:");
           JLabel AccKey=new JLabel("请输入Access Key Secret:");
           JLabel Region=new JLabel("请输入共享带宽包region,如 cn-beijing ");
           JLabel Cbwpid=new JLabel("请输入带宽包实例ID:如 cbwp-2zetu1kb5ek9lwjspo3yl ");
           JLabel Ips=new JLabel("请输入要加入共享带宽的IP实例ID,如有多个请用英文分号;分隔");
           JLabel Ips2=new JLabel("如eip-2zexs2h1lscs4ljccpigh;eip-2zew4iuvcnvr0e7cew7rx ");

          // JLabel URLResult=new JLabel("      Open API URL生成结果:      ");

      button.addActionListener(new ActionListener(){

        @Override

               public void actionPerformed(ActionEvent e) {

                  // TODO 自动生成的方法存根

                urlAccKeyID=textField_AccID.getText(); 

                ulrSeckey =textField_Acckey.getText();

                String strRegion = textField_region.getText();
                String strCbwpid = textField_cbwpid.getText();

                String strIPs = textArea_ip.getText();

                try {
                     AddIpToCbwp(urlAccKeyID,ulrSeckey,strRegion,strCbwpid,strIPs);
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

               }   

           });

           getContentPane().add(panel);

           getContentPane().add(AccID);
           getContentPane().add(textField_AccID);

           getContentPane().add(AccKey);
           getContentPane().add(textField_Acckey);

           getContentPane().add(Region);
           getContentPane().add(textField_region);
           getContentPane().add(Cbwpid);
           getContentPane().add(textField_cbwpid);
           getContentPane().add(Ips);
           getContentPane().add(Ips2);
           getContentPane().add(textArea_ip);

           getContentPane().add(button);

         //  getContentPane().add(URLResult);
           //getContentPane().add(textField_URL);

              setLocationRelativeTo(null);
               setVisible(true);
              setDefaultCloseOperation(3);  

}

    public static void main(String[] args) throws Exception {

        ApiDemo API_GEN = new ApiDemo(); 

    }

}

程序界面

这个是一个以图形化界面来展示拼接URL的小程序

程序界面

附件提供可运行的程序。
通过命令行终端启动可以看到debug信息。

时间: 2024-11-05 05:13:37

产品经理教你写代码【二】—批量添加多个IP到共享带宽的相关文章

产品经理教你写代码—用JAVA写一个阿里云VPC Open API调用程序

引言 VPC提供了丰富的API接口,让网络工程是可以通过API调用的方式管理网络资源.用程序和软件管理自动化管理网络资源是一件显著提升运维效率和网络生产力的事情.产品经理教你写代码系列文章的目标是不懂代码的网络工程师能一步一步的学会用API管理网络.另外通过文章标题大家也可以看出来,产品经理教你写代码肯定是一个业余班,里面的代码很多写的都不规范,可能也有很多Bug.专业选手可以参考的有限,请适度喷,手下留情.其实如果只是想用单个API调用,可以用下面这个线上工具: https://api.ali

产品经理需要会写代码吗?

这是一个被问及了一次.一次又一次的问题. 我就是一个会写代码的产品经理.我曾作为不同的角色有大约10年的专业编程经验,甚至还写过基本技术书籍和做过一些演讲.大约5年前,我转向了做软件产品管理,这使得我可以只在晚上和周末才写代码(只是因为兴趣). 以我的浅见,如果你有专业的软件编程经验的话,这对你做产品经理觉得是一个很大的加分项.如果你缺乏这些经验,可以每周花费几小时来学习一下. 理解开发人员 产品管理的一部分,是做一个优秀的沟通和谈判代表.有过开发经验的价值是,你可以更好的与你正在一起工作的开发

Linux批量添加IP到网卡的方法

一.添加单个IP地址: 在/etc/sysconfig/network-scripts/中新建文件ifcfg-eth0:*,*为数字序号,多个IP则依次增大 以0为例,建立文件ifcfg-eth0:0 cd /etc/sysconfig/network-scripts/ vi ifcfg-eth0:0 输入内容格式: DEVICE=eth0:0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static IPADDR=要添加绑定的IP地址 NETMASK=子网掩码 GAT

如何用C#写代码批量下载网页上提供的附件。

问题描述 如何用C#写代码批量下载网页上提供的附件. 在一个网页上有一个导出PDF文件的功能,是当点击这个按钮后,执行一个脚本,然后弹出文件下载另存为的对话框进文件的下载功能. 现在希望用C#实现自动批量的下载并保存这些PDF文件. 求实现方法,谢谢! 解决方案 用webclient.downloadfile或者httpwebrequest去下载. 解决方案二: 建议压缩成ZIP包后再下载. 解决方案三: 执行的是一个脚本,现在我可以实现通过代码模拟这个单击操作,执行这个脚本,但是如何能得到下载

IT人的技术哲学书单:谁说写代码、做产品就不需要参禅悟道?

刚刚进入大学校门时老师曾经说过:"无论学习什么专业,只要研究到最后就是哲学."我们笑着问道:"那么,写代码写到最后也是哲学?"老师回答:"是的,那就是技术哲学."现在回想起来,的确如此,我们发现技术中无处存在着哲学.那编写代码来说,对于同样一个功能进行实现,有的同学就会使用了很多的设计思想和设计模式,这样的代码无论是在自己看来还是拿给其他人看都会是赏心悦目的,而且也非常便于后期的重构. 无论是科学家还是工程师,成长不能只局限于技术层面,也要学会如

《互联网产品设计》一2.5 写代码,让产品可以使用

2.5 写代码,让产品可以使用 互联网产品设计工程师.程序员.开发者,所有这些都意味着同一件事 -- 这些人的主要角色就是通过编写代码使产品可以使用. 同样意义上,对于设计师,众多细节任务中的其中一个就是在表单标签上选择合适的字型.工程师会选择不同的代码实现策略保证产品可以使用,工程师的知识结构是决定产品最终形式的过程中必不可少的重要因素.他们很有可能面临各种问题和挑战,需要规划出可以使产品更好.更快和更智能的实现方案.在某些情况下,他们能利用技术方面的知识提出一些设计师或产品经理考虑不到的解决

【前端模板之路】二、人肉非智举,让代码帮我们写代码才是王道

写在前面 在前面一篇文章<[前端模板之路]一.重构的兄弟说:我才不想看你的代码!把HTML给我交出来!>中,我们举了一个人肉各种createElement的例子,那繁琐程度绝对是惨绝人寰.人生本就苦短,每天加班又占据了不少时间,这么折腾下去,还让人怎么活.面对这种场景,我们该怎么做. 无需复杂的构建工具,仅几个简单的工具函数,帮我们告别重复意义的劳动:让代码帮我们写代码! 从最简单的例子说起 让代码帮我们写代码,似乎很豪迈的话,但相信部分童鞋听着还是有些丈二和尚摸不着头脑.那我们暂且抛开这句不

一句代码实现批量数据绑定[上篇]

对于一个以数据处理为主的应用中的UI层,我们往往需要编写相当多的代码去实现数据绑定.如果界面上的控件和作为数据源的实体类型之间存储某种约定的映射关系,我们就可以实现批量的数据绑定.为了验证这种想法,我写了一个小小的组件.这个小玩意仅仅是我花了两个小时写的,其中还有很多问题没有解决,比如对于空值的处理,特殊控件属性值的HTML编码问题,以及频繁反射的性能问题,仅仅演示一种解决思路而已.本篇着重介绍如何通过这个组件来解决我们在进行数据绑定过程中的常见问题,下篇会介绍它的设计.[源代码从这里下载] 目

马云不写代码,他凭什么拥有淘宝?

问: 马云不会写代码,也就是说淘宝网站的建设过程,他没有写过一行.那么他凭什么拥有淘宝?而不是那些参与编码的程序员拥有淘宝呢? 答: 虽然是个蛮差劲的问题,但高票答案也蛮让人捉急的.好吧,我尽量正经而且通俗的回复一下吧. 首先.阿里巴巴是一家公司,淘宝是阿里巴巴这家公司提供的一种产品.严格说来,只有阿里巴巴 的某个子公司拥有淘宝,马云是不拥有淘宝的.顺便,这里其实有一个很有趣的问题:"根据中国法律在VIE架构下,境内业务到底归谁所有",不过这问题超纲了,而且我也不知道怎么回答. 第二.