Alibaba Cloud SDK V1.0 for Java は、汎化呼び出しをサポートしています。本トピックでは、Alibaba Cloud SDK V1.0 for Java を使用して汎化呼び出しを行う方法について説明します。
特徴
軽量:個別の製品 SDK をインストールすることなく、
aliyun-java-sdk-coreをインストールするだけで、すべての OpenAPI を呼び出すことができます。迅速なイテレーションと互換性:クラウドサービスが SDK を提供していない場合、または SDK が最新の API オペレーションに対応して更新されていない場合でも、汎化呼び出しを行うことができます。これにより、SDK の更新を待つことなく、最新の API オペレーションを呼び出すことができます。
詳細については、「汎化呼び出しと特化呼び出し」をご参照ください。
注意事項
汎化呼び出しを行う前に、API バージョン、リクエスト URL、パラメータータイプなど、必要なメタデータを手動で取得し、指定する必要があります。詳細については、「API メタデータ」をご参照ください。
コア SDK のインストール
pom.xml ファイルに次の依存関係を追加して、Alibaba Cloud SDK V1.0 for Java のコアライブラリをインストールします。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
// バージョンを選択します。
<version>[(4.0.0,5.0.0)]</version>
</dependency>API オペレーションの呼び出し
リクエストクライアントの初期化
com.aliyuncs パッケージに client モジュールを作成してリクエストクライアントを初期化し、その client を使用して API オペレーションを呼び出します。この例では、AccessKey ペアを使用してリクエストクライアントを初期化します。詳細については、「アクセス認証情報の管理」をご参照ください。
AccessKey の漏洩を防ぐために、AccessKey ペアを環境変数に記録することができます。詳細については、「Linux、macOS、Windows で環境変数を設定する」をご参照ください。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.profile.DefaultProfile;
// 1. DefaultAcsClient インスタンスを作成して初期化します。
DefaultProfile profile = DefaultProfile.getProfile(
// リージョン ID。
"cn-hangzhou",
// System.getenv は、Resource Access Management (RAM) ユーザーの AccessKey ID が環境変数から取得されることを示します。
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// System.getenv は、RAM ユーザーの AccessKey Secret が環境変数から取得されることを示します。
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// オプション:クライアントの HTTPS を設定します。
HttpClientConfig clientConfig = HttpClientConfig.getDefault();
// // サーバー証明書を検証しません。
// clientConfig.setIgnoreSSLCerts(true);
// // 各ホストの最大接続数。
// clientConfig.setMaxRequestsPerHost(6);
// // 接続タイムアウト。
// clientConfig.setConnectionTimeoutMillis(30000L);
// // 読み取りタイムアウト。
// clientConfig.setReadTimeoutMillis(30000L);
// // 書き込みタイムアウト。
// clientConfig.setWriteTimeoutMillis(60000L);
// // HTTP プロキシを設定します。
// clientConfig.setHttpProxy("http://127.0.0.1:9898");
// // HTTPS プロキシを設定します。
// clientConfig.setHttpsProxy("http://user:password@127.0.0.1:8989");
// // プロキシを無視するアドレスのリストを設定します。
// clientConfig.setNoProxy("127.0.0.1,localhost");
profile.setHttpClientConfig(clientConfig);
IAcsClient client = new DefaultAcsClient(profile);
API オペレーションの基本情報とリクエストパラメーターの設定
CommonRequest を使用して、API オペレーションの共通リクエストパラメーターとオペレーション固有のパラメーターを設定します。共通リクエストパラメーターの詳細については、「高度な設定」をご参照ください。
CommonRequest モジュールは、バージョン番号、URL、パラメータータイプなどの API メタデータを、標準のリクエスト設定プロセスを通じて有効な HTTP リクエストに変換し、元のレスポンスデータを返します。パラメーターの渡し方は、API のスタイルと設計によって決まります。
API リクエストパラメーター
リクエストパラメーターの渡し方は、API オペレーションのメタデータによって決まります。たとえば、DescribeInstanceStatus API は、メタデータで {"name":"RegionId","in":"query",...}} と定義されています。この場合、"in":"query" は、リージョン ID (RegionId) を putQueryParameter で渡す必要があることを示します。
説明 | パラメーターの渡し方 |
これは、リクエストパラメーターが | putQueryParameter(String key, String value) 説明 リクエストパラメーターがコレクションの場合、putQueryParameter("key.1", "value1"); のようにパラメーターを指定できます。 putQueryParameter("key.2", "value2");... の形式でパラメーターを渡すことができます。 |
これは、リクエストパラメーターが | putBodyParameter(String key, String value) 説明 リクエストパラメーターの値が文字列型でない場合は、その値を JSON 文字列に変換して指定します。例:request.putBodyParameter("key", new Gson().toJson(value)); |
ファイルのアップロード | setHttpContent(byte[] content, String charset, FormatType formatType) 説明 formatType を |
// 2. API リクエストを作成し、リクエストパラメーターを設定します。
// この例では、DescribeInstanceStatus API を呼び出すリクエストを作成する方法を示します。この API は、Elastic Compute Service (ECS) のステータスを取得するために使用されます。
CommonRequest request = new CommonRequest();
// 2.1 共通リクエストパラメーターを設定します。
request.setSysMethod(com.aliyuncs.http.MethodType.POST);
request.setSysDomain("ecs-cn-hangzhou.aliyuncs.com");// API オペレーションのドメイン名。
request.setSysVersion("2014-05-26");// API バージョン。
request.setSysAction("DescribeInstanceStatus"); // API オペレーションの名前。RPC 形式の API オペレーションを呼び出すときは、SysAction() を設定してオペレーション名を指定する必要があります。
request.setSysConnectTimeout(30000); // タイムアウト期間。
request.setSysProtocol(com.aliyuncs.http.ProtocolType.HTTPS); // リクエストプロトコル。有効値:HTTP および HTTPS。HTTPS の使用を推奨します。
// request.setSysUriPattern("/"); // RPC 形式の API オペレーションでは、このパラメーターを設定しないでください。
// 2.2 オペレーション固有のリクエストパラメーターを設定します。
// シナリオ 1:putQueryParameter(String key, String value) でクエリパラメーターを指定します。
request.putQueryParameter("RegionId", "cn-hangzhou");
List<String> instanceIds = List.of(
"i-bp1axhql4dqXXXXXXXX",
"i-bp124uve8zqXXXXXXXX"
);
for(int i = 0; i < instanceIds.size(); ++i) {
request.putQueryParameter("InstanceId." + (i + 1), (String)instanceIds.get(i));
}
request.putQueryParameter("PageNumber", "1");
request.putQueryParameter("PageSize", "30");
// シナリオ 2:putBodyParameter(String key, String value) でボディパラメーターを指定します。
// request.putBodyParameter("key1", "value1");
// request.putBodyParameter("key2", "value2");
// request.putBodyParameter("key3", "value3");
// シナリオ 3:ファイルをアップロードするには、setHttpContent(byte[] content, String charset, FormatType formatType) を指定します。formatType を FormatType.RAW に設定します。
// byte[] bodyImg = Files.readAllBytes(Paths.get("<FILE_PATH>")); // を実際のファイルパスに置き換えます。
// request.setHttpContent(bodyImg, "UTF-8", FormatType.RAW);
リクエストの開始
client を使用して getCommonResponse メソッドを呼び出します。
// リクエストを送信します。
CommonResponse response = client.getCommonResponse(request);
// 戻り値 `response.getData()` は、`RequestId` と OpenAPI の戻りパラメーターを含む JSON 形式のデータです。
System.out.println(response.getData());コード例
例:RPC 形式の API オペレーションの呼び出し
この例では、CommonRequest を使用して ECS の DescribeInstanceStatus API を呼び出します。
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.GsonBuilder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public class Sample {
public static void main(String[] args) throws ClientException, UnsupportedEncodingException {
// DefaultAcsClient インスタンスを作成して初期化します。
DefaultProfile profile = DefaultProfile.getProfile(
// リージョン ID。
"cn-hangzhou",
// 環境変数から RAM ユーザーの AccessKey ID を取得します。
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 環境変数から RAM ユーザーの AccessKey Secret を取得します。
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
IAcsClient client = new DefaultAcsClient(profile);
// API リクエストを作成し、パラメーターを設定します。
CommonRequest request = new CommonRequest();
request.setSysMethod(com.aliyuncs.http.MethodType.POST); // リクエストメソッド。
request.setSysDomain("ecs-cn-hangzhou.aliyuncs.com"); // API オペレーションのドメイン名。
request.setSysVersion("2014-05-26"); // API バージョン番号。
request.setSysAction("DescribeInstanceStatus"); // API オペレーションの名前。RPC 形式の API オペレーションを呼び出すときは、SysAction() を設定してオペレーション名を指定する必要があります。
request.setSysProtocol(com.aliyuncs.http.ProtocolType.HTTPS); // リクエストプロトコル。有効値:HTTPS および HTTP。HTTPS の使用を推奨します。
request.putQueryParameter("RegionId", "cn-hangzhou");
List<String> instanceIds = List.of(
"i-bp1axhql4dqXXXXXXXX",
"i-bp124uve8zqXXXXXXXX"
);
for(int i = 0; i < instanceIds.size(); ++i) {
request.putQueryParameter("InstanceId." + (i + 1), (String)instanceIds.get(i));
}
request.putQueryParameter("PageNumber", "1");
request.putQueryParameter("PageSize", "30");
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (ClientException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
例:RESTful API オペレーションの呼び出し
この例では、CommonRequest を使用して Container Service for Kubernetes (ACK) の DescribeClustersV1 API を呼び出します。
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
public class Sample {
public static void main(String[] args) {
// DefaultAcsClient インスタンスを作成して初期化します。
DefaultProfile profile = DefaultProfile.getProfile(
// リージョン ID。
"cn-hangzhou",
// 環境変数から RAM ユーザーの AccessKey ID を取得します。
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 環境変数から RAM ユーザーの AccessKey Secret を取得します。
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
IAcsClient client = new DefaultAcsClient(profile);
// API リクエストを作成し、パラメーターを設定します。
CommonRequest request = new CommonRequest();
request.setSysDomain("cs.aliyuncs.com");// ドメイン名。
request.setSysVersion("2015-12-15");// API バージョン。
request.setSysUriPattern("/clusters"); // API リソースの URI。ROA 形式の API オペレーションを呼び出すときは、UriPattern() を設定して完全なリソースパスを指定する必要があります。リソースパスは、OpenAPI メタデータの data.path から取得します。
request.setSysMethod(com.aliyuncs.http.MethodType.GET);// リクエストメソッド。
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (ClientException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}よくある質問
「必須パラメーター
AccessKeyIdがありません」というエラーメッセージが表示されます。原因:AccessKey ペアが正しく設定されていません。
解決策:
次のコマンドを実行して、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が設定されているかどうかを確認します。
Linux/macOS
echo $ALIBABA_CLOUD_ACCESS_KEY_ID echo $ALIBABA_CLOUD_ACCESS_KEY_SECRETWindows
echo %ALIBABA_CLOUD_ACCESS_KEY_ID% echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%有効な AccessKey ペアが返された場合、環境変数は正しく設定されています。AccessKey ペアが返されない場合、または無効な AccessKey ペアが返された場合は、必要に応じて環境変数を設定します。詳細については、「Linux、macOS、Windows で環境変数を設定する」をご参照ください。
コードに AccessKey ペア関連のエラーがないか確認します。
一般的なエラーの例:
accessKeyId = System.getenv("yourAccessKeyID"), accessKeySecret = System.getenv("yourAccessKeySecret")説明上記のエラーリクエストの例では、
System.getenv()の引数として渡された文字列 (例: "yourAccessKeyID") が、AccessKey の値そのものではなく、環境変数の「名前」として扱われます。この関数は、指定された名前の環境変数から「値」を読み取ろうとしますが、そのような名前の環境変数が設定されていない場合、値を取得できずにエラーが発生します。正しい例
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
リクエストが失敗し、次のエラーメッセージが表示されます:「com.aliyuncs.exceptions.ClientException: MissingParameter : The input parameter
Timestampthat is mandatory for processing this request is not supplied.」原因:RPC 形式の API オペレーションの共通リクエストパラメーターに
SysUriPatternパラメーターが設定されています。解決策:共通リクエストパラメーターから
SysUriPatternパラメーターを削除します。