Generieren Sie die CloudStack-API-URL in Java

Code zum Generieren der CloudStack-API-URL in Java

Da ich es von Android aus verwenden möchte, wird Base64.encodeBase64String (); nicht verwendet. Da ich studiere, werde ich den Ausgabecode zur Bestätigung so schreiben, wie er ist, und ich hoffe, dass er für diejenigen nützlich ist, die wie ich studieren.

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;  //← Verwenden Sie diese Option, wenn Sie Android verwenden
//import java.util.Base64;← Verwenden Sie diese Option, wenn Sie normales Java verwenden

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 mit HMAC SHA1 unter Verwendung eines geheimen Schlüssels
        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(secKey);
        byte[] digest = mac.doFinal(queryStringLow.getBytes());

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

        //URL-Codierung
        String signature = URLEncoder.encode(b64);
        signature = signature.replaceAll("%0A",""); //Entfernen des Zeilenvorschubcodes

    //URL-Generierung
    apiUrl = host + "?" + queryString + "&signature=" + signature;
        //Zum Debuggen
        System.out.println(digest);
        System.out.println(b64);
        System.out.println(signature);
        System.out.println(queryString + "&signature=" + signature);
        System.out.println(apiUrl);
                
    }
}

In apiURL,

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

Es sollte eingehen, also kopieren Sie dies und versuchen Sie, mit einem Terminal usw. darauf zuzugreifen.

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

Antwortergebnis

{
  "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": []
      }
    ]
  }
}

Antwortergebnis, wenn die Signatur usw. falsch ist

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

Recommended Posts

Generieren Sie die CloudStack-API-URL in Java
Zabbix API in Java
Treffen Sie Zaims API (OAuth 1.0) in Java
Analysieren der COTOHA-API-Syntaxanalyse in Java
Generieren Sie AWS Signature V4 in Java und fordern Sie die API an
JPA (Java Persistence API) in Eclipse
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Implementieren Sie API Gateway Lambda Authorizer in Java Lambda
Studieren Sie Java 8 (Datums-API im Paket java.time)
Versuchen Sie es mit der Stream-API in Java
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
Versuchen Sie es mit der JSON-Format-API in Java
Partisierung in Java
Janken in Java
Java Stream API
Umfangsrate in Java
FizzBuzz in Java
ChatWork4j für die Verwendung der ChatWork-API in Java
[Java] API-Erstellung mit Jerjey (Jax-rs) mit Eclipse
Versuchen Sie, die Cloud Vision-API von GCP in Java zu verwenden
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
Generieren Sie Java-Clientcode für die SOAP-API von SalesForce
Generieren Sie OffsetDateTime aus Clock und LocalDateTime in Java
Rufen Sie die URL des HTTP-Umleitungsziels in Java ab
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Machen Sie einen Blackjack mit Java
Versuchte Mastodons Toot- und Streaming-API in Java
Janken App in Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
[Gradle] Generieren Sie Javadoc einschließlich JavaScript in Java 1.8.0_121 oder höher
"Hallo Welt" in Java
Packen Sie die API-Antwort (Java)
Aufrufbare Schnittstelle in Java
Rufen Sie die Amazon Product Advertising API 5.0 (PA-API v5) in Java auf
[Java] Stream API / Map
Azure funktioniert in Java
Fehlerbehebung bei der Docker-Client Java API
Java-Kombination generieren (ArCombination)
Quelle zum Abrufen der Umleitungsquell-URL in Java
Einfache HTML-Spezialchars in Java
Boyer-Moore-Implementierung in Java
Hallo Welt in Java
Verwenden Sie OpenCV mit Java
WebApi-Memorandum mit Java
Typbestimmung in Java
Befehle in Java ausführen (Ping)
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
ASCII-Kunst in Java
Listen in Java vergleichen
POST JSON in Java
Fehler in Java ausdrücken
Erstellen Sie JSON in Java