Remarques :
- Ce tutoriel nécessite un accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, reportez-vous à Introduction au niveau gratuit d'Oracle Cloud Infrastructure.
- Il utilise des exemples de valeur pour les informations d'identification, la location et les compartiments Oracle Cloud Infrastructure. A la fin de l'exercice, remplacez ces valeurs par des valeurs propres à votre environnement cloud.
Gérer les API REST Oracle Cloud Infrastructure par programmation à l'aide de Shell et de Java Code
Introduction
Oracle Cloud Infrastructure (OCI) fournit une infrastructure cloud aux clients pour héberger leurs applications stratégiques sur le cloud. OCI fournit également au client les moyens d'accéder aux services OCI via la console ou via des API. Pour la connexion via des API, le client peut utiliser des kits SDK basés sur le langage de programmation de son choix, comme Java, Python ou Ruby. Mais il s'agit de quelques cas où les clients ne peuvent pas utiliser le SDK et ne peuvent pas utiliser de langage de programmation, mais souhaitent plutôt se connecter via des API directement à partir d'un outil, d'une base de données ou d'une application tierce où ils ne peuvent pas installer le SDK. L'utilisation des API REST est utile. Les clients peuvent tirer parti des API REST fournies par OCI pour presque tous les services et les utiliser directement dans leurs outils en mettant simplement à jour les adresses et en prenant en charge l'autorisation et l'authentification.
De nos jours, toutes les entreprises veulent tirer parti de la puissance des API REST dans leurs applications et créer une offre innovante pour leurs clients sans avoir à installer et gérer de SDK.
Dans ce tutoriel, nous allons discuter et comprendre comment OCI peut aider les entreprises du monde entier à tirer parti de la puissance des API REST avec OCI. Dans ce tutoriel, nous allons montrer des exemples d'API REST basées sur les scripts shell et le code Java.
Objectifs
-
Configurez des clés d'API OCI pour l'utilisateur en fonction des API REST qui se connecteront à la location OCI.
-
Créez un cas d'utilisation pour télécharger ou télécharger un fichier binaire vers OCI Object Storage à l'aide d'API REST.
-
Configurez un shell et une application Java, écrivez le code approprié pour appeler et afficher les API REST OCI.
Prérequis
-
Accès à OCI et aux stratégies autorisées dans Oracle Cloud Infrastructure Identity and Access Management (OCI IAM). L'utilisateur doit avoir accès aux ressources correspondantes qu'il souhaite créer ou mettre à jour à l'aide d'API REST.
-
Connaissance des scripts shell et du développement d'applications Java.
-
Compréhension de base de la méthodologie agile de développement logiciel.
Tâche 1 : configuration des clés d'API Oracle Cloud Infrastructure
-
Connectez-vous à la location OCI avec le compte de service ou l'administrateur et accédez aux paramètres utilisateur.
Ou
Accédez à l'utilisateur à partir de la console OCI IAM. Assurez-vous que l'utilisateur dispose de tous les accès requis pour la création et la mise à jour de l'infrastructure sur OCI.
-
Accédez à la section Ressources, cliquez sur Clés d'API et sur Ajouter une clé d'API. Sélectionnez cette option pour télécharger les nouvelles clés publiques et privées, télécharger votre clé publique ou coller votre clé publique.
-
Enregistrez les clés à un emplacement approprié et enregistrez le fichier de configuration comme indiqué dans la page suivante. Vous aurez besoin de ce fichier de configuration et de cette clé privée lors de la connexion à votre location à l'aide d'API REST.
Remarque :
-
Vous aurez besoin de la même valeur
configuration parameters
pour vous connecter à la location et à la région OCI. Vous allez remplacer les paramètres dans le code Java et les scripts shell en conséquence au fur et à mesure que nous approfondissons le tutoriel. -
Pour appeler des services OCI à partir d'instances OCI Compute, OCI offre un moyen plus sécurisé d'utiliser des principaux d'instance. Evitez d'utiliser des clés d'API utilisateur comme meilleures pratiques. Pour plus d'informations, reportez-vous à appel de services à partir d'une instance.
-
Tâche 2 : création et exécution d'un script shell pour télécharger ou placer un fichier binaire à partir d'OCI Object Storage à l'aide d'API REST
-
Accédez au système de fichiers et créez un fichier shell. Pour cet exemple, le fichier est nommé
PUT_OBJECT_REST_API.sh
. -
Ouvrez le fichier avec l'éditeur de votre choix et collez le code suivant dans le fichier shell.
-
PUT_OBJECT_REST_API.sh
:#!/bin/bash ########################## Fill these in with your values ########################## #OCID of the tenancy calls are being made in to tenancy_ocid="ocid1.tenancy.oc1..aaaaaaaackopa" # namespace of the tenancy namespace="ocitenancyname" # OCID of the user making the rest call user_ocid="ocid1.user.oc1..aaaaaaaafelqsoffcjh" # path to the private PEM format key for this user privateKeyPath="/home/lovelesh/.oci/oci_api_key.pem" # fingerprint of the private key for this user fingerprint="72:d4:6c:f8:89" #bucket name for uplaod/ put bucket="ocibucketname" #file name for upload/ put object="test_pdf.pdf" # The REST api you want to call, with any required paramters. rest_api="/n/$namespace/b/$bucket/o/$object" # The host you want to make the call against host="objectstorage.us-ashburn-1.oraclecloud.com" # the file containing the data you want to POST to the rest endpoint body="/home/lovelesh/.oci/test_pdf.pdf" #################################################################################### # extra headers required for a POST/PUT request method="put" content_type="application/octet-stream" body_arg=(--data-binary @${body}) content_sha256="$(openssl dgst -binary -sha256 < $body | openssl enc -e -base64)"; content_sha256_header="x-content-sha256: $content_sha256" content_length="$(wc -c < $body | xargs)"; content_length_header="content-length: $content_length" headers="(request-target) date host" # add on the extra fields required for a POST/PUT headers=$headers" x-content-sha256 content-type content-length" content_type_header="content-type: $content_type"; date=`date -u "+%a, %d %h %Y %H:%M:%S GMT"` date_header="date: $date" host_header="host: $host" request_target="(request-target): $method $rest_api" # note the order of items. The order in the signing_string matches the order in the headers, including the extra POST fields signing_string="$request_target\n$date_header\n$host_header" # add on the extra fields required for a POST/PUT signing_string="$signing_string\n$content_sha256_header\n$content_type_header\n$content_length_header" signature=`printf '%b' "$signing_string" | openssl dgst -sha256 -sign $privateKeyPath | openssl enc -e -base64 | tr -d '\n'` set -x curl -v -X $(echo $method | tr [:lower:] [:upper:]) --data-binary "@$body" -sS https://$host$rest_api -H "date: $date" -H "x-content-sha256: $content_sha256" -H "content-type: $content_type" -H "content-length: $content_length" -H "Authorization: Signature version=\"1\",keyId=\"$tenancy_ocid/$user_ocid/$fingerprint\",algorithm=\"rsa-sha256\",headers=\"$headers\",signature=\"$signature\""
-
-
Maintenant que tout le code est collé dans le fichier shell, travaillons à la mise à jour des valeurs requises et comprenons leur fonctionnalité.
tenancy_ocid="ocid1.tenancy.oc1..aaaaaaaackopa" ... fingerprint="72:d4:6c:f8:89"
Toutes ces valeurs sont chargées d'établir une connexion sécurisée avec votre location OCI. Obtenez ces valeurs à partir du fichier de configuration.
rest_api="/n/$namespace/b/$bucket/o/$object" host="objectstorage.us-ashburn-1.oraclecloud.com"
Il s'agit de l'adresse rest_api et host, préparez-la en fonction de vos besoins car cela changera pour chaque service. L'exemple présenté ici est l'adresse d'OCI Object Storage Service pour la région ashburn.
headers=$headers" x-content-sha256 content-type content-length" content_type_header="content-type: $content_type"; date=`date -u "+%a, %d %h %Y %H:%M:%S GMT"` date_header="date: $date" host_header="host: $host" request_target="(request-target): $method $rest_api"
Ici, nous avons créé les en-têtes pour l'API REST avec le type de contenu et d'autres paramètres requis. Notez que nous avons ici des définitions pour method_type, date et host headers, comme pour le post-appel, nous avons besoin d'un ensemble d'en-têtes détaillé.
signing_string="$signing_string\n$content_sha256_header\n$content_type_header\n$content_length_header" curl -v -X $(echo $method | tr [:lower:] [:upper:]) --data-binary "@$body" ...
Enfin, nous créons la chaîne de signature, puis nous appelons l'API REST à l'aide de curl. Notez qu'OCI a besoin que les appels d'API soient signés, et c'est pourquoi nous le faisons ici.
-
Une fois que vous avez mis à jour les valeurs conformément à votre configuration, exécutez le script shell, vous devez voir le script s'exécuter correctement et le fichier est propagé vers OCI Object Storage.
Remarque :
-
Assurez-vous d'avoir mis à jour l'autorisation du fichier shell sur exécutable en la remplaçant par 755 ou gérez-la vous-même.
-
Vous pouvez également le faire sous Windows en utilisant powerhell, ou utiliser le même script sous Windows en installant un WSL (sous-système Windows pour Linux) comme Ubuntu et l'exécuter à partir d'Ubuntu WSL sous Windows. Pour plus d'informations, reportez-vous à la section Windows Subsystem for Linux.
-
Tâche 3 : créer et exécuter du code Java pour télécharger ou placer un fichier binaire à partir d'OCI Object Storage à l'aide d'API REST
-
Accédez au système de fichiers et créez un fichier java. Pour cet exemple, le fichier est nommé
PUT_OBJECT_REST_API.java
. -
Ouvrez le fichier avec l'éditeur de votre choix et collez le code suivant dans le fichier shell.
-
PUT_OBJECT_REST_API.java
:import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.file.Files; import java.nio.file.Paths; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.Signature; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Base64; // NOTE - Feel free to remove logging as needed. Currently logs the signing string, host, date, and response. public class PUT_OBJECT_REST_API { private static final String apiKeyFilePath = "C:\\Users\\User1\\Folder\\privatekey.pem" private static final String tenancyId = "ocid1.tenancy.oc1..aaaaaaaackopa27emaz4uteg4q7"; // OCI Tenancy ID private static final String userId = "ocid1.user.oc1..aaaaaaaafelqsoffcjq"; // OCI User ID private static final String keyFingerprint = "72:d4:6c:f8:89:74:aa"; // OCI fingerprint private static final String region = "us-ashburn-1"; // OCI Region private static final String namespace = "ocitenancyname"; // OCI bucket namespace private static final String bucketName = "ocibucketname"; // OCI bucket NAME public static void main(String[] args) { try { String filePath = "D:\\file\\location\\test_pdf.pdf"; //args.length > 0 ? args[0] : ""; // File to upload (path) PrivateKey privateKey = loadPrivateKey(apiKeyFilePath); String fileName = Paths.get(filePath).getFileName().toString(); String targetUri = "https://objectstorage." + region + ".oraclecloud.com/n/" + namespace + "/b/" + bucketName + "/o/" + fileName; HttpRequest request = buildRequest(targetUri, filePath, privateKey); HttpClient client = HttpClient.newHttpClient(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println("Response status code: " + response.statusCode()); System.out.println("Response body: " + response.body()); } catch (Exception e) { e.printStackTrace(); } } private static PrivateKey loadPrivateKey(String filePath) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { String key = new String(Files.readAllBytes(Paths.get(filePath))) .replace("-----BEGIN PRIVATE KEY-----", "") .replace("-----END PRIVATE KEY-----", "") .replaceAll("\\s+", ""); // Remove all whitespace byte[] decodedKey = Base64.getDecoder().decode(key); PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decodedKey); KeyFactory kf = KeyFactory.getInstance("RSA"); return kf.generatePrivate(spec); } private static HttpRequest buildRequest(String targetUri, String filePath, PrivateKey privateKey) throws Exception { String method = "put"; String path = "/n/" + namespace + "/b/" + bucketName + "/o/" + Paths.get(filePath).getFileName(); String host = "objectstorage." + region + ".oraclecloud.com"; String date = DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now(ZoneOffset.UTC)); byte[] fileContent = Files.readAllBytes(Paths.get(filePath)); // Read file content as byte array String signingString = "(request-target): " + method.toLowerCase() + " " + path + "\n" + "host: " + host + "\n" + "date: " + date; System.out.println("Signing String: \n" + signingString); String signature = signRequest(privateKey, signingString); String authorizationHeader = "Signature version=\"1\",headers=\"(request-target) host date\",keyId=\"" + tenancyId + "/" + userId + "/" + keyFingerprint + "\",algorithm=\"rsa-sha256\",signature=\"" + signature + "\""; return HttpRequest.newBuilder() .uri(URI.create(targetUri)) .header("Content-Type", "application/octet-stream") .header("date", date) .header("Authorization", authorizationHeader) .PUT(HttpRequest.BodyPublishers.ofByteArray(fileContent)) .build(); } private static String signRequest(PrivateKey privateKey, String dataToSign) throws Exception { Signature signatureInstance = Signature.getInstance("SHA256withRSA"); signatureInstance.initSign(privateKey); signatureInstance.update(dataToSign.getBytes()); byte[] signature = signatureInstance.sign(); return Base64.getEncoder().encodeToString(signature); } }
-
-
Maintenant que tout le code est collé dans le fichier java, travaillons à la mise à jour des valeurs requises et comprenons leur fonctionnalité.
private static final String apiKeyFilePath = "C:\\Users\\User1\\Folder\\privatekey.pem" private static final String tenancyId = "ocid1.tenancy.oc1..aaaaaaaackopa27emaz4uteg4q7"; // OCI Tenancy ID private static final String userId = "ocid1.user.oc1..aaaaaaaafelqsoffcjq"; // OCI User ID private static final String keyFingerprint = "72:d4:6c:f8:89:74:aa"; // OCI fingerprint private static final String region = "us-ashburn-1"; // OCI Region private static final String namespace = "ocitenancyname"; // OCI bucket namespace private static final String bucketName = "ocibucketname"; // OCI bucket NAME
Toutes ces valeurs sont chargées d'établir une connexion sécurisée avec votre location OCI. Obtenez ces valeurs à partir du fichier de configuration.
String targetUri = "https://objectstorage." + region + ".oraclecloud.com/n/" + namespace + "/b/" + bucketName + "/o/" + fileName; HttpRequest request = buildRequest(targetUri, filePath, privateKey);
Il s'agit de l'adresse rest_api et de l'adresse hôte. Préparez-la conformément à vos besoins, car cela changera pour chaque service. L'exemple présenté ici est l'adresse d'OCI Object Storage Service pour la région ashburn.
private static HttpRequest buildRequest
Nous avons créé les en-têtes pour l'API REST avec le type de contenu et d'autres paramètres requis. Notez qu'ici, nous avons des définitions pour method_type, date et en-têtes d'hôte, car pour le post-appel, nous avons besoin d'un ensemble d'en-têtes détaillé.
private static String signRequest
Enfin, nous créons la chaîne de signature, puis nous appelons l'API REST. Notez qu'OCI a besoin que les appels d'API soient signés, et c'est pourquoi nous le faisons ici.
-
Une fois que vous avez mis à jour les valeurs conformément à votre configuration, exécutez le code java, vous devez voir le script s'exécuter correctement et le fichier est propagé vers OCI Object Storage.
Remarque : assurez-vous que Java est installé avec tous les packages requis, selon les besoins du code.
Liens connexes
Remerciements
- Auteur - Lovelesh Saxena (architecte principal en ingénierie logicielle)
Ressources de formation supplémentaires
Parcourez d'autres ateliers sur docs.oracle.com/learn ou accédez à davantage de contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, rendez-vous sur education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.
Pour obtenir de la documentation sur le produit, visitez Oracle Help Center.
Manage Oracle Cloud Infrastructure REST APIs Programmatically using Shell and Java Code
G12000-01
July 2024