Générer l'URL de l'API CloudStack en Java

Code pour générer l'URL de l'API CloudStack en Java

Puisque je veux l'utiliser depuis Android, Base64.encodeBase64String (); n'est pas utilisé. Puisque j'étudie, j'écrirai le code de sortie pour confirmation tel quel, et j'espère qu'il sera utile pour ceux qui étudient comme moi.

import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.util.TreeMap;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Mac;
import android.util.Base64;  //← Utilisez ceci lors de l'utilisation d'Android
//import java.util.Base64;← Utilisez ceci lors de l'utilisation à partir de Java normal

public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
            
        String queryString = "";
        String host = "http://<yourCloudStackHost>/client/api";
     String apiUrl = "";
        String apiKey = "yourApiKey";
        Key secKey = new SecretKeySpec("yourSecretKey".getBytes(),"HmacSHA1");
        TreeMap<String,String> params = new TreeMap<>();
        params.put("response","json");
        params.put("command","listZones");
        params.put("apikey",apiKey);
        
        for(String key:params.keySet()){
            if(queryString.isEmpty()){
                queryString = key + "=" + params.get(key);
            }else{
                queryString = queryString + "&" + key + "=" + params.get(key);
            }
            //System.out.println(key + "=" + params.get(key));
            System.out.println(queryString);
        }
        String queryStringLow = queryString.toLowerCase();
        System.out.println(queryStringLow);
        //Hash avec HMAC SHA1 à l'aide d'une clé secrète
        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(secKey);
        byte[] digest = mac.doFinal(queryStringLow.getBytes());

        //Encodage BASE64
        String b64 = Base64.getEncoder().encodeToString(digest);

        //Encodage d'URL
        String signature = URLEncoder.encode(b64);
        signature = signature.replaceAll("%0A",""); //Suppression du code de saut de ligne

    //Génération d'URL
    apiUrl = host + "?" + queryString + "&signature=" + signature;
        //Pour le débogage
        System.out.println(digest);
        System.out.println(b64);
        System.out.println(signature);
        System.out.println(queryString + "&signature=" + signature);
        System.out.println(apiUrl);
                
    }
}

Dans apiURL,

http://<yourCloudStackHost>/client/api?apikey=<yourApiKey>&command=listZones&response=json&signature=<yourSignature>

Il devrait arriver, alors copiez-le et essayez d'y accéder avec un terminal, etc.

curl -s 'http://<yourCloudStackHost>/client/api?apikey=<yourApiKey>&command=listZones&response=json&signature=<yourSignature>' | jq -C

Résultat de la réponse

{
  "listzonesresponse": {
    "count": 3,
    "zone": [
      {
        "id": "e8ebfccb-eb38-43ed-8abf-XXXX",
        "name": "weber",
        "networktype": "Advanced",
        "securitygroupsenabled": false,
        "allocationstate": "Enabled",
        "zonetoken": "42101a12-6299-32c7-a324-XXXX",
        "dhcpprovider": "VirtualRouter",
        "localstorageenabled": true,
        "tags": []
      },
      {
        "id": "95c8746d-57b3-421f-9375-XXXX",
        "name": "lux",
        "networktype": "Advanced",
        "securitygroupsenabled": false,
        "allocationstate": "Enabled",
        "zonetoken": "de9e9a4f-696d-39f4-bb3e-XXXX",
        "dhcpprovider": "VirtualRouter",
        "localstorageenabled": true,
        "tags": []
      },
      {
        "id": "f4583787-7bff-461a-b026-XXXX",
        "name": "farad",
        "networktype": "Advanced",
        "securitygroupsenabled": false,
        "allocationstate": "Enabled",
        "zonetoken": "a53d8e78-3c77-3352-8a04-XXXX",
        "dhcpprovider": "VirtualRouter",
        "localstorageenabled": true,
        "tags": []
      }
    ]
  }
}

Résultat de la réponse lorsque la signature, etc. est incorrecte

{
  "listzonesresponse": {
    "errorcode": 401,
    "errortext": "unable to verify user credentials and/or request signature"
  }
}

Recommended Posts

Générer l'URL de l'API CloudStack en Java
API Zabbix en Java
Hit l'API de Zaim (OAuth 1.0) en Java
Analyser l'analyse syntaxique de l'API COTOHA en Java
Générer AWS Signature V4 en Java et demander l'API
JPA (API de persistance Java) dans Eclipse
J'ai essayé d'utiliser l'API Elasticsearch en Java
Implémenter l'autorisation API Gateway Lambda dans Java Lambda
Étude de Java 8 (API de date dans le package java.time)
Essayez d'utiliser l'API Stream en Java
Appelez l'API de notification Windows en Java
Essayez d'utiliser l'API au format JSON en Java
Partition en Java
Janken à Java
API Java Stream
Taux circonférentiel à Java
FizzBuzz en Java
ChatWork4j pour l'utilisation de l'API ChatWork en Java
[Java] Création d'API à l'aide de Jerjey (Jax-rs) avec eclipse
Essayez d'utiliser l'API Cloud Vision de GCP en Java
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
Générer du code client Java pour l'API SOAP de SalesForce
Générer OffsetDateTime à partir de Clock et LocalDateTime en Java
Obtenez l'URL de la destination de la redirection HTTP en Java
Lire JSON en Java
Implémentation de l'interpréteur par Java
Faites un blackjack avec Java
Essayé l'API Toot et Streaming de Mastodon en Java
Application Janken en Java
Programmation par contraintes en Java
Mettez java8 dans centos7
NVL-ish guy en Java
Joindre des tableaux en Java
[Gradle] Générer Javadoc, y compris JavaScript dans Java 1.8.0_121 ou version ultérieure
"Hello World" en Java
Emballez la réponse de l'API (java)
Interface appelable en Java
Appelez l'API Amazon Product Advertising 5.0 (PA-API v5) en Java
[Java] API / carte de flux
Fonctions Azure en Java
Dépannage de l'API Java Docker-Client
Génération de combinaison java (ArCombination)
Source utilisée pour obtenir l'URL de la source de redirection en Java
Simple htmlspecialchars en Java
Implémentation Boyer-Moore en Java
Hello World en Java
Utiliser OpenCV avec Java
Mémorandum WebApi avec Java
Détermination de type en Java
Pratique de l'API Java8 Stream
Exécuter des commandes en Java (ping)
Divers threads en java
Implémentation du tri de tas (en java)
Art ASCII à Java
Comparer des listes en Java
POST JSON en Java
Exprimer l'échec en Java
Créer JSON en Java