APIリソースのSDKの生成

APIゲートウェイ・サービスのAPI記述からAPI用のSDKを生成して、開発者がバックエンド・サービスにプログラムでアクセスできるようにする方法をご紹介します。

APIゲートウェイ・サービスを使用する場合は、APIリソースのSDK (ソフトウェア開発キット)を生成できます。APIリソースを使用してAPIゲートウェイにAPIをデプロイする場合、生成するSDKによって、開発者はAPIにプログラム的にアクセスできます。APIとの統合を容易にするために、次のような多数の言語およびプラットフォーム用のSDKを生成できます。

  • Android
  • Java
  • JavaScript
  • Swift
  • TypeScript

SDKを生成したら、SDKリソース(APIクライアント・ライブラリ、構成およびドキュメント)を含むzipファイルをダウンロードし、APIにアクセスするコードを記述する開発者に配布できます。

APIリソースのSDKを生成するには、APIリソースのAPI記述を作成しておく必要があります。API記述を作成するには、サポートされている言語で記述されたAPI記述ファイル(「API仕様」や「API spec」とも呼ばれる)をアップロードします。現在、OpenAPI Specificationバージョン2.0 (以前のSwagger Specification 2.0)およびバージョン3.0がサポートされています。APIリソースおよびAPI記述の詳細は、API記述を含めたAPIリソースの作成を参照してください。

APIゲートウェイ・サービスを使用したSDKの生成はオプションです。SDKを生成せずに、APIゲートウェイにAPIをデプロイできます。同様に、別のツールで作成したSDKを使用して、APIゲートウェイにデプロイしたAPIへのプログラムによるアクセスを提供できます。また、APIゲートウェイ・サービスを使用して、関連付けられたAPIリソースを使用しなくても、API記述ファイルからSDKを生成して、APIゲートウェイにAPIをデプロイすることもできます。

次に注意してください:

  • APIリソースには次のものがあります。
    • ゼロのSDK
    • 同じ言語またはプラットフォーム用の1つ以上のSDK
    • 異なる言語またはプラットフォーム用の1つ以上のSDK
  • まったく新しいSDKしか生成できません。生成されたすべてのSDKには一意の識別子(OCID)があります。生成済の既存のSDKは再生成できません(ただし、既存のSDKの表示名は変更できます)。
  • 生成されたSDKを管理するのはユーザーの責任です。以前にSDKを生成したAPI記述ファイルの更新済バージョンをアップロードしても、新しいSDKは自動的に生成されません。新しいSDKを生成するかどうかを決定する必要があります。新しいSDKを生成する場合は、既存のSDKを削除するか、保持するかを決定する必要があります。
  • SDKを生成できるのは、アップロードされたAPI記述ファイルに検証チェックが失敗していない場合のみです。アップロードしたAPI記述ファイルが警告付きの検証チェックに合格した場合は、SDKを生成できます。ただし、SDKを生成する前に警告を解決することをお薦めします。
  • アップロードしたAPI記述ファイルからSDK for an APIリソースを生成するには、コンソールを使用します:

    1. 「API」リスト・ページで、SDKを生成するAPIリソースを選択します。リスト・ページの検索に関するヘルプが必要な場合は、APIリソースのリストを参照してください。
    2. API記述ファイルをまだアップロードしていない場合は、API記述を含めたAPIリソースの作成の手順に従ってAPIリソースを作成し、アップロードするAPI記述ファイルを指定します。
    3. 「APIの詳細」ページで、「リソース」リストから「SDK」を選択し、「SDKの作成」を選択します。
    4. 「SDKの作成」ダイアログで:
      1. 次を指定します:
        • 名前: 新しいSDKの名前。機密情報の入力は避けてください。
        • プログラミング言語:アップロードされたAPI記述ファイルからSDKを生成するプログラミング言語またはプラットフォーム。
        • <Language> Properties:選択したプログラミング言語またはプラットフォームに応じて、言語固有またはプラットフォーム固有のプロパティの値を指定します。必須プロパティが常に表示されます。「オプション・プロパティの表示」を選択して、追加のオプション・プロパティの値を表示および入力します。
      2. (オプション)「拡張オプションの表示」を選択し、オプションで次を指定します:
        • タグ: リソースの作成権限がある場合は、そのリソースにフリーフォーム・タグを適用する権限もあります。定義済タグを適用するには、タグ・ネームスペースを使用する許可が必要です。タグ付けの詳細は、リソース・タグを参照してください。タグを適用するかどうかがわからない場合は、このオプションをスキップするか、管理者に問い合せてください。後でタグを適用できます。
      3. 「作成」を選択して、新しいSDKを生成します。

      SDKが生成されます。SDKの生成には数分かかる場合があります。

      SDKが正常に生成されると、「SDKの詳細」ページに、SDKに指定したプログラミング言語またはプラットフォーム(および必須およびオプションのプロパティの値)が表示されます。

    5. 「SDKのダウンロード」を選択して、APIリソースのAPI記述ファイルから生成されたSDKリソース(APIクライアント・ライブラリ、構成およびドキュメント)を含むzipファイルを取得します。

    APIリソース用のSDKが正常に生成されると、APIにアクセスするコードを記述している開発者にzipファイルを配布できます。

  • CLIを使用して、アップロードしたAPI記述ファイルからAPIリソースのSDKを生成するには:

    1. CLIを使用するためにクライアント環境を構成します(APIゲートウェイ開発用のCLIを使用するためのクライアント環境の構成)。
    2. コマンド・プロンプトを開き、oci api-gateway SDK-language-typeを実行して、SDKを生成できるプログラミング言語およびプラットフォームを確認します:

      oci api-gateway sdk-language-type list --compartment-id <ocid>

      サポートされているプログラミング言語とプラットフォーム、およびそれぞれで使用する必須パラメータとオプション・パラメータが表示されます。

    3. oci api-gateway SDK createを実行して、SDKを生成します:
      oci api-gateway sdk create --target-language "<language>" --api-id <api-ocid> --parameters '{"<first-parameter-name>": "<first-parameter-value>", "<second-parameter-name>": "<second-parameter-value>"}'

      ここでは:

      • <language>は、アップロードされたAPI記述ファイルからSDKを生成するプログラミング言語またはプラットフォームです。
      • <API-OCID>は、新しいSDKを生成するAPIリソースのOCIDです。
      • --parameters '{"<first-parameter-name>": "<first-parameter-value>", "<second-parameter-name>": "<second-parameter-value>"}'は、選択したプログラミング言語またはプラットフォームに設定する必須パラメータまたはオプション・パラメータ(あるいはその両方)の名前と値です。

      例:

      • oci api-gateway sdk create --target-language "JAVASCRIPT" --api-id ocid1.apigatewayapi.oc1..aaaaaaa3______psq
      • oci api-gateway sdk create --target-language "SWIFT" --api-id ocid1.apigatewayapi.oc1..aaaaaaa3______psq --parameters '{"projectName": "Hello World", "apiNamePrefix": "hello"}'

      コマンドへのレスポンスには、次が含まれます:

      • SDKのOCID。
      • ライフサイクルの状態(たとえば、SUCCEEDED、FAILED)。
      • SDKを作成する作業リクエストのID(作業リクエストの詳細は、完了、取消または失敗の後の7日間利用可能です)。

      SDKが作成されるまで(またはリクエストが失敗するまで)コマンドが制御を返すのを待機する場合は、次のパラメータのいずれかまたは両方を含めます:

      • --wait-for-state SUCCEEDED
      • --wait-for-state FAILED

      例:

      oci api-gateway sdk create --target-language javascript --api-id ocid1.apigatewayapi.oc1..aaaaaaa3______psq --wait-for-state SUCCEEDED

      作業リクエストによって正常に作成されるまでは、SDKを使用できないことに注意してください。

    4. (オプション) SDKを作成している作業リクエストのステータスを確認するには、:

      oci api-gateway work-request get --work-request-id <work-request-ocid>
    5. (オプション) SDKを作成している作業リクエストのログを表示するには、:

      oci api-gateway work-request-log list --work-request-id <work-request-ocid>
    6. (オプション) SDKを作成している作業リクエストが失敗し、エラー・ログを確認するには、次を入力します:

      oci api-gateway work-request-error --work-request-id <work-request-ocid>

    CLIの使用の詳細は、コマンドライン・インタフェース(CLI)を参照してください。CLIコマンドで使用できるフラグおよびオプションの完全なリストについては、CLIのヘルプを参照してください。

  • 次を実行します。

    • CreateSdk操作。アップロードしたAPI記述ファイルからAPIリソースのSDKを作成します。
    • ListSdks操作で、すでに生成されたSDKをリストします。
    • GetSdk操作: 既存のSDKの詳細を表示します。
    • UpdateSdk操作: 既存のSDKの表示名を変更します。
    • SDKを削除するDeleteSdk操作。
    • ListSdkLanguageTypes操作。SDKを生成できるプログラミング言語およびプラットフォームを、必須パラメータおよびオプション・パラメータとともにリストします。

生成されたSDKの使用例

APIゲートウェイを使用してAPIリソースのAPI記述ファイルからSDKを生成すると、SDKをダウンロードしてインストールし、それを使用してAPIゲートウェイにデプロイされたAPIをコールできます。

生成されたSDKをダウンロード、インストールおよび使用するステップは、SDKの言語とAPIの機能によって異なります。

この項の例では、ブログAPIのSDKが各言語で生成されていることを前提としています。例をガイドとして使用し、独自の要件に合せて拡張および適応できます。

例1: APIリソース用に生成されたAndroid SDKの使用

この例で使用されているツールとバージョン:

  • Gradle 6.5
  • Maven 3.6.3
  • アンドロイドスタジオ4.1.2

APIゲートウェイがAPIリソースのAPI記述ファイルから生成したAndroid SDKを使用するには:

  1. API Gatewayで生成されたAndroid SDKを含むzipファイルをダウンロードし、その内容を抽出します。
  2. zipファイルから抽出されたルート・ディレクトリに、次を実行して、生成されたSDKをローカルMavenリポジトリにインストールします:
    mvn clean install
  3. 生成されたAndroid SDKを使用するAndroidプロジェクトを決定します。Gradleがパッケージ・マネージャである既存のAndroidプロジェクトを開くか、次のように新しいAndroidプロジェクトを作成します。

    1. Android Studioを開きます。「ファイル」で、「新規」に移動して「新規プロジェクト」を選択します。
    2. 「アクティビティなし」を選択し、「次へ」を選択します。
    3. 「言語」で、「Java」を選択し、「終了」を選択します。
  4. モジュールのbuild.gradleファイルを更新して、生成されたSDKを依存性として追加します。例:
    plugins {
        id 'com.android.application'
    }
    
    android {
        compileSdkVersion 29
        buildToolsVersion "30.0.3"
    
        defaultConfig {
            applicationId "com.example.myapplication"
            minSdkVersion 21
            targetSdkVersion 29
            versionCode 1
            versionName "1.0"
    
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
            // 2) Connect JUnit 5 to the runner
            testInstrumentationRunnerArgument "runnerBuilder", "de.mannodermaus.junit5.AndroidJUnit5Builder"
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }
    
    apply plugin: "de.mannodermaus.android-junit5"
    
    dependencies {
        implementation 'com.android.support:multidex:1.0.3'
    
        implementation 'androidx.appcompat:appcompat:1.1.0'
        implementation 'com.google.android.material:material:1.1.0'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    
        androidTestImplementation 'androidx.test.ext:junit:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
        implementation("com.mock:test-project:1.0.1")
    
    }
    

    test-projectdependenciesに追加されていることに注意してください。

  5. Android Studioでプロジェクト・ビルドを実行します。
  6. ビルドが完了したら、生成されたSDKクラスをインポートし、Androidプロジェクトの1つ以上のJavaクラスで使用します。例:
    package com.example.myapplication;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.os.AsyncTask;
    import android.widget.Toast;
    
    import com.mock.testproject.api.UserV1;
    import com.mock.testproject.api.UsersApi;
    
    public class NetworkTask extends AsyncTask<String,String,String> {
    
        @SuppressLint("StaticFieldLeak")
        private final Context context;
    
        public NetworkTask(Context context) {
            this.context = context;
        }
    
        @Override
        protected String doInBackground(String... strings) {
            try{
                UsersApi usersApi = new UsersApi();
                usersApi.setBasePath("https://0eff7c6c85cc.ngrok.io");
                UserV1 a = usersApi.getUsersUsername("a");
                return a.toString();
            }catch (Exception e){
                e.printStackTrace();
                return e.getMessage();
            }
        }
    
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Toast.makeText(context, s, Toast.LENGTH_LONG).show();
        }
    }
    

前述の例をガイドとして使用して、独自の要件に合せて拡張および適応できます。

例2: APIリソース用に生成されたJava SDKの使用

この例で使用されているツールとバージョン:

  • Maven 3.6.3
  • Java 1.8.0

APIゲートウェイがAPIリソースのAPI記述ファイルから生成したJava SDKを使用するには:

  1. API Gatewayによって生成されたJava SDKを含むzipファイルをダウンロードし、その内容を抽出します。
  2. zipファイルから抽出されたルート・ディレクトリに、次を実行して、生成されたSDKをローカルMavenリポジトリにインストールします:
    mvn clean install
  3. 生成されたJava SDKを使用するMavenプロジェクトを決定します。既存のMavenプロジェクトを更新するか、次を実行して新しいMavenプロジェクトを作成します。
    mvn -B archetype:generate -DarchetypeGroupdId=org.apache.maven.archetypes -DgroupId=examples.com.testApp -DartifactId=test-maven-project
  4. Mavenプロジェクトのpom.xmlファイルを更新して、生成されたSDKを依存性として追加します。例:
    <dependency>
      <groupId>com.mock.test</groupId>
      <artifactId>integration-java</artifactId>
      <version>1.0.0</version>
      <scope>compile</scope>
    </dependency>
    
    
  5. Mavenプロジェクトのルート・ディレクトリで、次を実行します:
    mvn clean install
  6. Mavenのインストールが完了したら、生成されたSDKクラスをインポートし、Mavenプロジェクトで使用します。例:
    import com.mock.test.integration.ApiClient;
    import com.mock.test.integration.ApiException;
    import com.mock.test.integration.api.UsersApi;
    import com.mock.test.integration.model.UserV1;
    
    public class SdkTest {
    
        private String basePath;
        private UsersApi usersApi;
        private UsersApi loggedInUsersApi;
    
        public void setUpAndListUsers(){
            ApiClient loggedInClient = new ApiClient();
            loggedInClient.setPassword("password");
            loggedInClient.setUsername("username");
            loggedInUsersApi = new UsersApi(loggedInClient);
                    List<UserV1> users = loggedInUsersApi.getUsers();
    	}
          }
    

前述の例をガイドとして使用して、独自の要件に合せて拡張および適応できます。

例3: APIリソース用に生成されたJavaScript SDKの使用

この例で使用されているツールとバージョン:

  • Npm 6.14.0

APIゲートウェイがAPIリソースのAPI記述ファイルから生成したJavaScript SDKを使用するには:

  1. APIゲートウェイによって生成されたJavaScript SDKを含むzipファイルをダウンロードし、その内容を抽出します。
  2. zipファイルから抽出されたルート・ディレクトリで、次を実行します。
    npm install
    npm link
  3. 既存のnpmプロジェクトのルート・ディレクトリで、次のように実行します:
    npm link <path_to_javascript_client_dir>
    例:
    npm link "/Users/ajay.d.dubey/Downloads/Simple API overview_JAVASCRIPT_v26544725374050339058" 
  4. サービスのコール元の.jsファイルで、生成されたSDKをインポートして使用します。例:
    const Blog = require("blog");
    const apiClient = new Blog.ApiClient();
    apiClient.defaultHeaders = { authorization: "audio/basic" };
    apiInstance = new Blog.UsersApi(apiClient);
    
    //get user
    apiInstance.getUsersUsername(
        "046b6c7f-0b8a-43b9-b35d-6489e6daee91",
        (error, data, response) => {
            if (error) throw error;
    	      console.log(response.statusCode);
            console.log(response)
       }
    );
    
    //put user
    let opts = {
        userV1: new Blog.UserV1(
            "Test",
            "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
            "password",
            "a@b.com"
        ),
    };
    apiInstance.putUsersUsername(
        "046b6c7f-0b8a-43b9-b35d-6489e6daee91",
        opts,
        (error, data, response) => {
            if (error) throw error;
    	      console.log(response.statusCode);
            console.log(response)
        }
    );
    

    この例では、生成されたSDKの名前はblogです。抽出されたpackage.jsonファイルを調べて、生成されたSDKの名前を見つけます。

前述の例をガイドとして使用して、独自の要件に合せて拡張および適応できます。

例4: APIリソース用に生成されたSwift SDKの使用

この例で使用されているツールとバージョン:

  • XCode 12.4
  • Swift 5.3.1
  • CocoaPods 1.10.1

APIゲートウェイがAPIリソースのAPI記述ファイルから生成したSwift SDKを使用するには:

  1. API Gatewayによって生成されたSwift SDKを含むzipファイルをダウンロードし、その内容を抽出します。
  2. 生成されたSwift SDKを使用するXCodeプロジェクトを決定します。既存のXCodeプロジェクトを更新するか、次のように新しいXCodeプロジェクトを作成します。
    1. XCodeを開きます。「ファイル」で、「新規」に移動して「プロジェクト」を選択します。
    2. 「アプリケーション」を選択し、「次へ」を選択します。
    3. 「言語」で、「Swift」を選択し、「次」を選択します。
    4. プロジェクトの場所を指定し、「作成」を選択してXCodeプロジェクトを作成します。
  3. XCodeプロジェクトのルート・ディレクトリにPodfileがまだ含まれていない場合は、次を実行してPodfileを作成します。
    pod init
  4. Podfileを更新して、生成されたSDKへの参照を追加します。例:
    target 'test-project-3' do
      		# Comment the next line if you don't want to use dynamic frameworks
      		use_frameworks!
      		# Pods for test-project-3
    			pod 'mysdk', :path => '/Users/ajay.d.dubey/workspace-2/swift/Blog_SWIFT_1.0.01209182890182739216'
    		end
    
  5. XCodeプロジェクトのルート・ディレクトリで、次を実行します:
    pod install

    出力例:

    ~/workspace-2/swift/test-project-3 on main ?1 ❯ pod install                    took 1m 4s at 09:50:31
    Analyzing dependencies
    Downloading dependencies
    Installing mysdk (1.0.0)
    Generating Pods project
    Integrating client project
    
    [!] Please close any current Xcode sessions and use `test-project-3.xcworkspace` for this project from now on.
    Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
    
    [!] Automatically assigning platform `iOS` with version `14.4` on target `test-project-3` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.
    
  6. XCodeのオープン・インスタンスをすべてクローズします。
  7. XCodeプロジェクトのルート・ディレクトリで、.xcworkspaceファイルを開いてポッドを確認します。
  8. 任意のswiftファイルを更新してポッドをインポートし、生成されたSDKの使用を開始します。たとえば、次のようにViewController.swiftファイルを更新して、mysdkポッドをインポートします。
    import UIKit
    import mysdk
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
    
            mysdkAPI.credential = URLCredential.init(user: "username", password: "password", persistence: .permanent)
            mysdkAPI.customHeaders = ["Content-Type":"application/json","Authorization":"Basic 1234"]
            mysdk.UsersAPI.getUsers(completion: getUsers)
            
            mysdk.UsersAPI.getUsersUsername(username: "046B6C7F-0B8A-43B9-B35D-6489E6DAEE91", completion: responseUserUsername)    
            
           }
      func getUsers(users :[mysdk.UserV1]?, error:Error?) -> Void{
            print("Attempting fetching user details:")
            print(users)
           }
        
      func responseUserUsername(user :mysdk.UserV1?, error:Error?){
      print("Attempting fetching user with username:")
      print("Successful Request")
      print (user)
            
    		}
    

前述の例をガイドとして使用して、独自の要件に合せて拡張および適応できます。

例5: APIリソース用に生成されたTypeScript SDKの使用

この例で使用されているツールとバージョン:

  • 糸1.22.10
ノート

この例は、yarnを使用して生成されたTypeScript SDKを構築および使用する方法を示しています。NPMを使用して生成されたTypeScript SDKを消費する場合は、例3: APIリソース用に生成されたJavaScript SDKの使用に示すNPMを使用して、生成されたJavaScript SDKを使用するステップに従います。

APIゲートウェイがAPIリソースのAPI記述ファイルから生成したTypeScript SDKを使用するには:

  1. APIゲートウェイによって生成されたTypeScript SDKを含むzipファイルをダウンロードし、その内容を抽出します。
  2. zipファイルから抽出されたルート・ディレクトリで、次を実行します。
    yarn install
    yarn run build
    yarn link
  3. 生成されたSDKを使用するプロジェクトのルート・ディレクトリ:
    1. 実行:
      yarn link <project-name>

      <project name>は、生成されたSDKの名前です。抽出されたpackage.jsonファイルを調べて、生成されたSDKの名前を見つけます。例:

      yarn link test-project
    2. 実行:
      yarn install
  4. 生成されたSDKを使用するプロジェクトのtsファイルを更新します。例:
    const Blog = require("blog");
    const expect = require("chai").expect;
    let apiInstance;
    let apiInstanceWithoutHeader;
    
    before(function () {
        const apiClient = new Blog.ApiClient();
        apiClient.defaultHeaders = { authorization: "audio/basic" };
        apiInstance = new Blog.UsersApi(apiClient);
        apiInstanceWithoutHeader = new Blog.UsersApi();
    });
    
    describe("UsersApi", function () {
        it("should call add delete username successfully", function (done) {
            apiInstance.deleteUsersUsername(
                "046b6c7f-0b8a-43b9-b35d-6489e6daee91",
                (error, data, response) => {
                    if (error) throw error;
                    console.log(response.statusCode);
                    console.log(response)
                    expect(response.statusCode).to.equal(204);
                    expect(data).to.equal(null);
                    done();
                }
            );
        });
        it("should update user details successfully", function (done) {
            let opts = {
                userV1: new Blog.UserV1(
                    "Test",
                    "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
                    "password",
                    "a@b.com"
                ),
            };
            apiInstance.putUsersUsername(
                "046b6c7f-0b8a-43b9-b35d-6489e6daee91",
                opts,
                (error, data, response) => {
                    if (error) throw error;
                    expect(response.statusCode).to.equal(202);
                    expect(data).to.not.null;
                    done();
                }
            );
        });
    
        });
    
    

前述の例をガイドとして使用して、独自の要件に合せて拡張および適応できます。