Alibaba Cloud SDK V1.0 for Java は、汎用 API 呼び出しをサポートしています。このトピックでは、Alibaba Cloud SDK V1.0 for Java を使用して汎用呼び出しを行う方法について説明します。
特徴
軽量: Java 用 Alibaba Cloud SDK V1.0 を使用すると、各サービスの SDK をインストールする必要なく、
aliyun-python-sdk-coreをインストールするだけで、すべての API オペレーションを呼び出すことができます。迅速な反復と互換性:クラウドサービスが SDK を提供していない場合、または SDK が最新の API 操作用に更新されていない場合、汎用呼び出しを行うことができます。この方法では、SDK の更新を待つことなく、最新の API 操作を呼び出すことができます。
詳細については、「汎用呼び出しと専用呼び出し」をご参照ください。
使用上の注意
汎用呼び出しを行う前に、API バージョン、リクエスト URL、パラメータータイプなど、必要なメタデータを手動で取得して指定します。詳細については、「API メタデータ」をご参照ください。
Alibaba Cloud SDK V1.0 for Java のコアライブラリをインストールする
Alibaba Cloud SDK V1.0 for Java のコアライブラリをインストールするには、次の依存関係を pom.xml ファイルに追加します。
<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 シークレットが環境変数から取得されることを指定します。
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 オペレーションのメタデータによって決まります。たとえば、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 を FormatType.RAW に設定します。 |
// 2. API リクエストを作成し、リクエストパラメーターを構成します。
// この例では、Elastic Compute Service (ECS) のステータスを取得するために使用される DescribeInstanceStatus オペレーションを呼び出すリクエストを作成する方法を示します。
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() を構成して API オペレーションの名前を指定する必要があります。
request.setSysConnectTimeout(30000); // タイムアウト期間。
request.setSysProtocol(com.aliyuncs.http.ProtocolType.HTTPS); // リクエストプロトコル。有効な値: HTTP および HTTPS。HTTPS を使用することをお勧めします。
// request.setSysUriPattern("/"); // リクエストプロトコル。有効な値: HTTP および HTTPS。HTTPS を使用することをお勧めします。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>")); // <FILE_PATH> を実際のファイルパスに置き換えます。
// request.setHttpContent(bodyImg, "UTF-8", FormatType.RAW);
リクエストを開始する
client を使用して getCommonResponse メソッドを呼び出します。
// リクエストを開始します。
CommonResponse response = client.getCommonResponse(request);
// response.getData() メソッドへのレスポンスが JSON タイプの場合、リクエスト ID とレスポンスパラメーターが返されます。
System.out.println(response.getData());サンプルコード
例:RPC スタイルの API 操作を呼び出す
この例では、CommonRequest を使用して ECS の DescribeInstanceStatus オペレーションを呼び出します。
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",
// 環境変数から Resource Access Management (RAM) ユーザーの AccessKey ID を取得します。
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// 環境変数から RAM ユーザーの AccessKey シークレットを取得します。
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() を構成して API オペレーションの名前を指定する必要があります。
request.setSysProtocol(com.aliyuncs.http.ProtocolType.HTTPS); // リクエストプロトコル。有効な値: HTTP および HTTPS。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 Auto-generated catch block
e.printStackTrace();
} catch (ClientException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
例: RESTful API オペレーションを呼び出す
この例では、CommonRequest を使用して Container Service for Kubernetes (ACK) の DescribeClustersV1 オペレーションを呼び出します。
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 シークレットを取得します。
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 オペレーションの URL。ROA スタイルの API オペレーションを呼び出すときは、UriPattern() を構成して API オペレーションの完全な URL を指定する必要があります。API オペレーションの URL は、API メタデータから取得できます。
request.setSysMethod(MethodType.GET);// リクエストメソッド。
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientException e) {
// TODO Auto-generated catch block
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() の入力値が AccessKey ペアとして使用されています。ただし、この関数は環境変数から値を読み取るために使用されます。マシンで環境変数名を ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET として指定した後、System.getenv は環境変数から値を読み取ることができます。
成功リクエストの例:
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
「com.aliyuncs.exceptions.ClientException: MissingParameter : このリクエストの処理に必須の入力パラメーター "Timestamp" が提供されていません」というエラーメッセージが返された場合はどうすればよいですか?
原因: RPC スタイルの API オペレーションの共通リクエストパラメーターで
SysUriPatternパラメーターが構成されています。解決策: 共通リクエストパラメーターから
SysUriPatternパラメーターを削除します。