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

本文涉及的产品
全球加速 GA,每月750个小时 15CU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 用JAVA拼出来Open API的URL

引言

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

第一步:利其器

工欲善其事必先利其器,对于工程师来讲,一定要有得心应手的工具。我个人十分推荐Eclipse作为我们的开发IDE。
从如下链接即可下载:
https://www.eclipse.org/downloads/

第二步:创建一个Java工程

创建一个java工程

ab94d04e547cd3342d71d5fbeded32d425397dd6.png

第三步:创建代码文件

在工程的SRC中创建代码的源文件,比如ApiDemo.java

240aa2b4bd58d777457cb1e1ca15da4c8215b93e.png

第四步:导入一个核心的jar包

很多同学再使用API的时候都会遇到一个特别大的问题,就是API URL拼接完成要按阿里云的格式生成一个“签名”,阿里云有一个规定的签名实现算法,类似于下面这种:https://help.aliyun.com/document_detail/35735.html

这个东东肯定会难倒一片初学者。 第一个文章其实就是告诉大家,怎么把这个签名生成出来,怎么把API URL生成出来。
签名的生成涉及到加密算法,需要将一个核心的JAR导入到工程中。

下载 org.apache.commons.codec.binary.Base64

可以在百度中直接搜索“org.apache.commons.codec.binary.Base64”
或者通过如下URL下载:
http://commons.apache.org/proper/commons-codec/download_codec.cgi
或者在本文末尾的附件中下载

build path中添加外部JAR包

a970b999482e15d8cdd770668854a21af4d59395.png

513c7b2b7acd977a0bffded85e72cde930fdb006.png

第五步:将下面的代码拷贝到源文件ApiDemo.java中




import java.io.UnsupportedEncodingException;
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 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(400,700);

           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_Cmd=new JTextField(30);
           JTextField textField_URL=new JTextField(30);

           JButton    button=new JButton("       生成OPEN API URL     ");

           JLabel AccID=new JLabel("请输入Access Key ID:");
           JLabel AccKey=new JLabel("请输入Access Key Secret:");
           JLabel Cmd=new JLabel("请输入命令:");
           JLabel Cmd_tishi1=new JLabel("格式为: 参数名称1=参数描述1;参数名称2=参数描述2 ");
           JLabel Cmd_tishi2=new JLabel("如:Action=DescribeEipAddresses;RegionId=cn-beijing");
            
          

           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 strCmd = textField_Cmd.getText();
                
                String strApiUrl = "";
                
      
                try {
                    strApiUrl = CreatApiURL(urlAccKeyID,ulrSeckey,strCmd);
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
           
                textField_URL.setText(strApiUrl);
  

               }   

           });

           

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

           getContentPane().add(AccKey);
           getContentPane().add(textField_Acckey);
           
           
           getContentPane().add(Cmd);
           getContentPane().add(Cmd_tishi1);
           getContentPane().add(Cmd_tishi2);
           getContentPane().add(textField_Cmd);
           
           
           
           
           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(); 
          
    
    
    }
          

    

}
AI 代码解读

第六步:运行程序

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

e6ed1b02f1505b7c0475b940fdcd180bf39c7cfd.png

要使用Open API 必须要用AK。具体的AK如何获取,参考下图的入口进到AK管理界面获取。

c26700ee95a0e7e2d6e57ec2f49c862e56ed32e0.png

查询命令必须要按 :参数名称1=参数描述1;参数名称2=参数描述2 这种格式,;需要在英文状态下输入,输入不要有空格
将生成的URL粘贴到浏览器后回车,显示效果如下:

8bd36bc1899c6479b4a7c2b5b5b4ebfc06704bb2.png

第七步:导出一个可以运行的JAR包

如果希望能多次运行程序,可以将上述功能导出为可允许的jar文件

0eb68d8408c7c7e6672c35091a5e29181fa8096d.png

608f504a83af0c9ca0bde9326d9cc4fc133c6eee.png

fdd9ed8ce345a4176110f3b008f172e30f2fbb08.png

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云专有网络VPC使用教程
专有网络VPC可以帮助您基于阿里云构建出一个隔离的网络环境,并可以自定义IP 地址范围、网段、路由表和网关等;此外,也可以通过专线/VPN/GRE等连接方式实现云上VPC与传统IDC的互联,构建混合云业务。 产品详情:https://www.aliyun.com/product/vpc
目录
打赏
0
0
0
0
240
分享
相关文章
什么是用于REST API的JWT Bearer令牌以及如何通过代码和工具进行调试
在Web开发中,保护REST API至关重要,而JSON Web令牌(JWT)特别是JWT Bearer令牌,是一种高效方法。它通过紧凑、自包含的结构实现安全信息交换,提升用户体验。本文探讨JWT Bearer的基本概念、结构与实现,包括在Java中的应用步骤,以及使用Apipost和cURL进行测试的方法。JWT优势明显:无状态、互操作性强,适用于分布式系统。掌握JWT Bearer,可助开发者构建更安全、高效的API解决方案。
如何0代码将存量 API 适配 MCP 协议?
本文主要讲述通过 Nacos+Higress 的方案实现0代码改造将 Agent 连接到存量应用,能够显著降低存量应用的改造成本。
如何0代码将存量 API 适配 MCP 协议?
什么是用于 REST API 的 Bearer Token以及如何通过代码和工具进行调试
Bearer Token 是一种基于 OAuth 2.0 的身份验证机制,广泛应用于 REST API 的授权访问中。它通过在 HTTP 请求头中传递令牌,确保用户凭据安全传输并验证。本文深入解析了 Bearer Token 的概念、实现步骤及调试方法,包括其无状态特性、灵活性与安全性优势。同时,提供了 Java 实现示例和使用 Apipost、cURL 等工具测试的实践指导,帮助开发者掌握这一核心技能,保障 API 系统的安全与高效运行。
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
实战指南:通过1688开放平台API获取商品详情数据(附Python代码及避坑指南)
1688作为国内最大的B2B供应链平台,其API为企业提供合法合规的JSON数据源,直接获取批发价、SKU库存等核心数据。相比爬虫方案,官方API避免了反爬严格、数据缺失和法律风险等问题。企业接入1688商品API需完成资质认证、创建应用、签名机制解析及调用接口四步。应用场景包括智能采购系统、供应商评估模型和跨境选品分析。提供高频问题解决方案及安全合规实践,确保数据安全与合法使用。立即访问1688开放平台,解锁B2B数据宝藏!
课时3:阿里云专有网络VPC:让网络更加独立
阿里云专有网络VPC提供独立、安全的云上网络环境,支持自定义IP地址网段和灵活的路由配置。通过高速通道实现优质网络链路,可用性达99.95%,满足企业高要求的数据传输需求。VPC结合弹性公网IP、负载均衡SLB、Net网关等功能,帮助企业轻松管理网络资源,降低运维成本,实现高效、安全的混合云架构部署。
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
69 10
淘宝评论API接口操作步骤详解,代码示例参考
淘宝评论API接口是淘宝开放平台提供的一项服务,通过该接口,开发者可以访问商品的用户评价和评论。这些评论通常包括评分、文字描述、图片或视频等内容。商家可以利用这些信息更好地了解消费者的需求和偏好,优化产品和服务。同时,消费者也可以从这些评论中获得准确的购买参考,做出更明智的购买决策。
|
4月前
|
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
81 11

相关产品

  • 专有网络VPC
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等