API 操作は、Java SDK や Python SDK などのソフトウェア開発キット (SDK) を使用して呼び出すか、またはホワイトリストからパスワードなしで呼び出すことができます。ホワイトリスト方式は、プライベートゲートウェイを使用する場合にのみサポートされます。このトピックでは、独自の API 呼び出しを構成するためのテンプレートとして使用できる API 呼び出しの例を示します。
SDK 呼び出し
Java SDK の概要
Dataphin Data Service Java SDK は、Data Service API を迅速に呼び出すための基本 SDK とサンプルコードを提供します。このセクションでは、Dataphin サービス Java SDK の使用方法について説明します。
Java SDK のコードファイル階層は次のとおりです。
JAR パッケージのバージョンは、SDK のアップグレードに伴いアップグレードされる場合があります。
Java SDK/
demo/
ClientDemo.javaは、同期 API 操作を呼び出すための例とメソッドを提供します。AsyncClientDemo.javaは、非同期 API 操作を呼び出すための例とメソッドを提供します。
lib/
dataphin-sdk-core-java-v5.4.0.jarは、この SDK の依存関係パッケージです。dataphin-sdk-core-java-v5.4.0-javadoc.jarは、依存関係パッケージの Javadoc です。dataphin-sdk-core-java-v5.4.0-jar-with-dependencies.jarは、完全な依存関係パッケージです。
ApiDocument_v5.4.0.mdは、API 操作ドキュメントです。LICENSEはライセンスです。
Java SDK は、次の手順で取得できます。
Dataphin のホームページの上部メニューバーで、[サービス] > [アプリケーション管理] を選択します。
左側のナビゲーションウィンドウで、[呼び出し手順] をクリックします。
[API 呼び出し手順] タブをクリックし、ページの右上隅にある [Java SDK ダウンロード] を選択して、ダウンロードした SDK JAR パッケージを pom.xml に追加します。
Java SDK 同期 API 呼び出しプロセス
API を呼び出す前に、まずクライアントを初期化する必要があります。
API の応答時間が長い場合は、非同期呼び出しを使用できます。応答を待機している間、メインスレッドはブロックされません。
さまざまなクエリ要件を満たすために、
QueryParamRequestオブジェクトをインスタンス化し、リクエストパラメーターを設定できます。詳細については、呼び出し例の `packRequestParam` メソッドをご参照ください。API リクエストと応答結果の詳細については、SDK の
APIDocument.mdをご参照ください。使用中に問題が発生した場合は、Dataphin テクニカルサポートにお問い合わせください。
ステップ 1:環境の準備
Dataphin サービス Java SDK には JDK 1.8 以降が必要です。
SDK が認証と署名情報を生成するために、認証キーのペア、つまり AppKey と AppSecret を準備する必要があります。
[サービス] > [アプリケーション管理] > [マイアプリケーション] ページのリストから AppKey と AppSecret を取得できます。
重要AppKey と AppSecret は、Dataphin Data Service がユーザーリクエストを認証するために使用するキーです。これらの 2 つの構成がクライアント側に保存されている場合は、適切に暗号化してください。
pom.xmlファイルに次の依存関係を追加します。dataphin-sdk-core-javaを追加するときにエラーが発生した場合は、パスJAVA_SDK/lib/dataphin-sdk-core-java-v5.4.0.jarから JAR ファイルを手動で追加します。これは Java SDK の JAR パッケージです。説明dataphin-sdk-core-javaは中央の Maven リポジトリでは使用できないため、SDK をダウンロードした後、会社の Maven リポジトリにアップロードするか、IDEA または Eclipse に手動でインポートする必要があります。<dependency> <groupId>com.alibaba.dt</groupId> <artifactId>dataphin-sdk-core-java</artifactId> <version>v5.4.0</version> </dependency>
ステップ 2:Java SDK API インターフェース呼び出しクラスをインポートする
[サービス] > [API マーケットプレイス] > [API] ページから対応する API ドキュメントをダウンロードできます。
`ClientDemo.java` をインポートし、
ClientDemo.javaクラスのインポート文とパッケージ文を修正します。import java.util.*; import java.util.function.Consumer; import com.alibaba.cloudapi.sdk.constant.SdkConstant; import com.alibaba.cloudapi.sdk.enums.Scheme; import com.alibaba.cloudapi.sdk.model.ApiCallback; import com.alibaba.cloudapi.sdk.model.ApiRequest; import com.alibaba.cloudapi.sdk.model.ApiResponse; import com.alibaba.dt.dataphin.client.ApiClient; import com.alibaba.dt.dataphin.client.ApiClientBuilderParams; import com.alibaba.dt.dataphin.client.sse.SseApiClient; import com.alibaba.dt.dataphin.schema.ManipulationParamRequest; import com.alibaba.dt.dataphin.schema.OrderBy; import com.alibaba.dt.dataphin.schema.QueryParamRequest; import com.alibaba.fastjson.JSON; /** * 同期 API の例 * <p> * 使用方法: * まず、HOST、APP_KEY、APP_SECRET、および API_ID を構成します。 * 次に、必要に応じて getClient() の変数と packQueryParamRequest() のパラメーター値を設定します。 * 注: * getClient() のパラメーターは、API ごとに異なる値を持つ場合があります。getClient() を変更して入力パラメーターを受け入れるようにすることで、さまざまな API に適応させることができます。 */ public class ClientDemo { /** * エンドポイントまたは IP アドレス。この値は DataService Studio のネットワーク構成から取得します。 */ private static final String HOST = "xxx"; /** * この API を呼び出すために使用するアプリケーションの AppKey。 */ private static final String APP_KEY = "xxx"; /** * この API を呼び出すために使用するアプリケーションの AppSecret。 */ private static final String APP_SECRET = "xxx"; /** * 呼び出す API の ID。 */ private static final String API_ID = "xxx"; public static void main(String[] args) throws Exception { // GET API を同期的に呼び出します。 syncGet(); // LIST API を同期的に呼び出します。 syncList(); // GET API を非同期的に呼び出します。 asyncGet(); // LIST API を非同期的に呼び出します。 asyncList(); // GET API をストリーム呼び出しします。 fluxGet(); // クエリの総数も取得するページ分割クエリ API。 syncListWithTotalNum(); // CREATE API を同期的に呼び出します。 syncCreate(); // UPDATE API を同期的に呼び出します。 syncUpdate(); // DELETE API を同期的に呼び出します。 syncDelete(); } private static void syncListWithTotalNum() { ApiClient client = getClient(); // 必要に応じて、戻りフィールド、クエリ条件、およびその他のパラメーターを変更します。 QueryParamRequest queryParamRequest = packRequestParamWithReturnNum(); ApiResponse response = client.listSync(API_ID, queryParamRequest); String resultStr = getResultString(response); // ResultBody に totalNum を含めます System.out.println(resultStr); } /** * GET API を同期的に呼び出します。 */ public static void syncGet() { // ApiClient オブジェクトを取得します。 ApiClient client = getClient(); // 必要に応じて、戻りフィールド、クエリ条件、およびその他のパラメーターを変更します。 QueryParamRequest queryParamRequest = packRequestParam(); ApiResponse response = client.getSync(API_ID, queryParamRequest); System.out.println(getResultString(response)); } /** * LIST API を同期的に呼び出します。 */ public static void syncList() { // ApiClient オブジェクトを取得します。 ApiClient client = getClient(); // 必要に応じて、戻りフィールド、クエリ条件、およびその他のパラメーターを変更します。 QueryParamRequest queryParamRequest = packRequestParam(); ApiResponse response = client.listSync(API_ID, queryParamRequest); System.out.println(getResultString(response)); } /** * CREATE API を同期的に呼び出します。 */ public static void syncCreate() { // ApiClient オブジェクトを取得します。 ApiClient client = getClient(); // 必要に応じて入力パラメーターを変更します。 ManipulationParamRequest manipulationParamRequest = packDmlRequestParam(); ApiResponse response = client.createSync(API_ID, manipulationParamRequest); System.out.println(getResultString(response)); } /** * UPDATE API を同期的に呼び出します。 */ public static void syncUpdate() { // ApiClient オブジェクトを取得します。 ApiClient client = getClient(); // 必要に応じて入力パラメーターを変更します。 ManipulationParamRequest manipulationParamRequest = packDmlRequestParam(); ApiResponse response = client.updateSync(API_ID, manipulationParamRequest); System.out.println(getResultString(response)); } /** * DELETE API を同期的に呼び出します。 */ public static void syncDelete() { // ApiClient オブジェクトを取得します。 ApiClient client = getClient(); // 必要に応じて入力パラメーターを変更します。 ManipulationParamRequest manipulationParamRequest = packDmlRequestParam(); ApiResponse response = client.deleteSync(API_ID, manipulationParamRequest); System.out.println(getResultString(response)); } /** * GET API を非同期的に呼び出します。 * コールバックメソッドで応答を処理する必要があります。 */ public static void asyncGet() throws Exception { // ApiClient オブジェクトを取得します。 ApiClient client = getClient(); // 必要に応じて、戻りフィールド、クエリ条件、およびその他のパラメーターを変更します。 QueryParamRequest queryParamRequest = packRequestParam(); client.getAsync(API_ID, queryParamRequest, new ApiCallback() { @Override public void onFailure(ApiRequest request, Exception e) { e.printStackTrace(); } @Override public void onResponse(ApiRequest request, ApiResponse response) { try { System.out.println(getResultString(response)); } catch (Exception e) { e.printStackTrace(); } } }); System.out.println("--- メインスレッドは早期に終了します。 ---"); } /** * LIST API を非同期的に呼び出します。 * コールバックメソッドで応答を処理する必要があります。 */ public static void asyncList() throws Exception { // ApiClient オブジェクトを取得します。 ApiClient client = getClient(); // 必要に応じて、戻りフィールド、クエリ条件、およびその他のパラメーターを変更します。 QueryParamRequest queryParamRequest = packRequestParam(); client.listAsync(API_ID, queryParamRequest, new ApiCallback() { @Override public void onFailure(ApiRequest request, Exception e) { e.printStackTrace(); } @Override public void onResponse(ApiRequest request, ApiResponse response) { try { System.out.println(getResultString(response)); } catch (Exception e) { e.printStackTrace(); } } }); System.out.println("--- メインスレッドは早期に終了します。 ---"); } /** * ApiClient オブジェクトを取得します。 */ public static ApiClient getClient() { ApiClientBuilderParams params = new ApiClientBuilderParams(); // アプリケーションの AppKey。 params.setAppKey(APP_KEY); // アプリケーションの AppSecret。 params.setAppSecret(APP_SECRET); // エンドポイントまたは IP アドレス。 params.setHost(HOST); // デフォルトのプロトコルは HTTP です。API に基づいてプロトコルを HTTPS に設定できます。 // 注: Dataphin の組み込みゲートウェイは HTTPS をサポートしていません。Alibaba Cloud API Gateway は HTTPS をサポートしています。 params.setScheme(Scheme.HTTP); // API にアクセスするためのデータ環境。RELEASE は本番環境を指定し、PRE は開発環境を指定します。 params.setStage("RELEASE"); // 環境が指定されていない第 2 レベルドメイン名または独立ドメイン名を使用する場合は、env パラメーターを設定する必要があります。 // 有効な値: PROD と PRE。基本モードを使用する場合は、このパラメーターを PROD に設定します。Dev-Prod モードを使用する場合は、このパラメーターを PROD に設定して本番データベースのデータをクエリするか、PRE に設定して開発データベースのデータをクエリします。 // 環境にアクセスするために独立ドメイン名を指定した場合、env パラメーターは有効になりません。 params.setEnv("PROD"); ApiClient apiClient = new ApiClient(params); // Impala データベースタイプのタイムアウト期間とポーリング間隔を設定します。これはオプションです。デフォルトのタイムアウト期間は 300 秒で、デフォルトのポーリング間隔は 800 ミリ秒です。 // このパラメーターは Impala でのみ有効です。Impala 以外の API を呼び出すときにもこのパラメーターを設定する必要があります。デフォルト値のままにすることができます。 apiClient.setImpalaTimeoutAndInterval(300, 800); return apiClient; } public static SseApiClient getSseClient() { ApiClientBuilderParams params = new ApiClientBuilderParams(); // アプリケーションの AppKey。 params.setAppKey(APP_KEY); // アプリケーションの AppSecret。 params.setAppSecret(APP_SECRET); // エンドポイントまたは IP アドレス。 params.setHost(HOST); // デフォルトのプロトコルは HTTP です。API に基づいてプロトコルを HTTPS に設定できます。 // 注: Dataphin の組み込みゲートウェイは HTTPS をサポートしていません。Alibaba Cloud API Gateway は HTTPS をサポートしています。 params.setScheme(Scheme.HTTP); // API にアクセスするためのデータ環境。RELEASE は本番環境を指定し、PRE は開発環境を指定します。 params.setStage("RELEASE"); // 環境が指定されていない第 2 レベルドメイン名または独立ドメイン名を使用する場合は、env パラメーターを設定する必要があります。 // 有効な値: PROD と PRE。基本モードを使用する場合は、このパラメーターを PROD に設定します。Dev-Prod モードを使用する場合は、このパラメーターを PROD に設定して本番データベースのデータをクエリするか、PRE に設定して開発データベースのデータをクエリします。 // 環境にアクセスするために独立ドメイン名を指定した場合、env パラメーターは有効になりません。 params.setEnv("PROD"); return new SseApiClient(params); } /** * コンシューマーを含む API を呼び出します。 */ public static void fluxGet() { Consumer<ApiResponse> consumer = r -> System.out.println(new String(r.getBody())); SseApiClient sseApiClient = getSseClient(); // 短命なアプリケーションの場合、タスク完了後にクライアントのスレッドプールをシャットダウンしてリソースを解放できます。 sseApiClient.getFlux(API_ID, packRequestParam()) // 一時的な実行の場合、完了時に接続を閉じてリソースを解放する必要があります。 .doOnComplete(sseApiClient::shutdown) .subscribe(consumer); } private static QueryParamRequest packRequestParamWithReturnNum() { QueryParamRequest queryParamRequest = packRequestParam(); queryParamRequest.setReturnTotalNum(true); return queryParamRequest; } /** * リクエストオブジェクトをパッケージ化します。 */ private static QueryParamRequest packRequestParam() { QueryParamRequest queryParamRequest = new QueryParamRequest(); /********* API 関連のビジネスパラメーター設定開始 *********/ /* * プロキシアカウントタイプ。このパラメーターはオプションです。 * 注: プロキシモードを使用するには、次の条件を満たす必要があります: * 1. 行レベルの権限機能が有効になっている。 * 2. アプリケーションにプロキシ権限が付与されている。 * 3. API が行レベルの権限に関連付けられている。 * * プロキシモードで認証を使用する場合、プロキシユーザーのアカウントタイプを指定する必要があります。 * ACCOUNT_NAME: Dataphin のユーザー名。 * USER_ID: Dataphin の一意の ID。 * SOURCE_USER_ID: ソースシステムのアカウント ID。 * このパラメーターは、DelegationUid が設定されている場合にのみ構成する必要があります。このパラメーターを構成しない場合、デフォルトのタイプは USER_ID です。 */ queryParamRequest.setAccountType("USER_ID"); /* * プロキシアカウント ID。このパラメーターはオプションです。 * プロキシでアクセスするユーザー。選択した AccountType に基づいて、対応するアカウント ID を入力する必要があります。 * このパラメーターを設定し、API が行レベルの権限ルールに関連付けられている場合、プロキシモードが認証に使用されます。 */ queryParamRequest.setDelegationUid("abcd"); /* * リクエストパラメーターのリスト。オプションのパラメーターは指定しなくてもかまいません。必須パラメーターは指定する必要があります。そうしないと、エラーが返されます。 * キーはクエリフィールドを指定し、値はクエリフィールドの値を指定します。 * たとえば、id はリクエストフィールド名で、1 は id の値です。複数のクエリパラメーターを設定できます。 * 注: IN タイプのパラメーターの場合、List を使用してパラメーター値をラップします。 */ Map<String, Object> conditions = new HashMap<>(); conditions.put("id", 1); conditions.put("age", Arrays.asList(10, 20, 30)); queryParamRequest.setConditions(conditions); /* * 返されるパラメーターのリスト。このパラメーターは空にできません。 * たとえば、id と name を返すように指定します。 * 注: 返されるパラメーターが存在しないか、パラメーターに対する権限がない場合、エラーが報告されます。 */ queryParamRequest.setReturnFields(Arrays.asList("id", "name")); /* * ソートフィールド。このパラメーターはオプションです。 * 注: Oracle または SQL Server を使用する場合、ページネーションにはソートを使用する必要があります。 * パラメーターを昇順または降順でソートするかどうかを指定します。複数のフィールドを昇順または降順でソートするように設定できます。 * たとえば、返された結果を id で昇順にソートします。 */ List<OrderBy> orderList = new ArrayList<>(); orderList.add(new OrderBy("id1", OrderBy.Order.ASC)); orderList.add(new OrderBy("id2", OrderBy.Order.DESC)); queryParamRequest.setOrderBys(orderList); /* * ページネーションパラメーター。このパラメーターはオプションで、LIST タイプの API でのみ有効です。 */ // データが取得される位置。 queryParamRequest.setPageStart(0); // 各ページで取得するデータエントリの数。 queryParamRequest.setPageSize(10); /* * API バージョン番号。このパラメーターはオプションで、開発環境の API でのみ設定できます。 */ // queryParamRequest.setApiVersion("V1"); /********* API 関連のビジネスパラメーター設定終了 *********/ /********* 機能パラメーター設定開始 *********/ /* * モデルキャッシュを使用するかどうかを指定します。 * この機能を有効にすると、同じ入力および出力パラメーターを持つサービスユニット内の同じ API の解析頻度が減少します。これにより、クエリ効率が向上します。 */ queryParamRequest.setUseModelCache(false); /* * 結果キャッシュを使用するかどうかを指定します。 * この機能を有効にすると、同じ条件と返されたフィールドを持つ同じ API のクエリ結果がキャッシュされます。 * この機能は、変更されないデータのクエリに適しています。同じ SQL 文のクエリ頻度を減らし、クエリ効率を向上させます。 * デフォルトのキャッシュ期間は 30 分です。バージョン 3.5.6 以降、API 開発ページでキャッシュ期間を設定できます。 * 注: API で結果キャッシュが有効になっていない場合、このパラメーターは無効です。 */ queryParamRequest.setUseResultCache(false); /* * フィールドの大文字と小文字を区別するかどうかを指定します。 * フィールドで大文字と小文字が区別される場合は、このパラメーターを true に設定することをお勧めします。 * このパラメーターが false に設定されている場合、直接接続 API によって返される結果のフィールド名はデフォルトで大文字になります。 */ queryParamRequest.setKeepColumnCase(true); /********* 機能パラメーター設定終了 *********/ return queryParamRequest; } /** * DML リクエストオブジェクトをパッケージ化します。 */ private static ManipulationParamRequest packDmlRequestParam() { ManipulationParamRequest manipulationParamRequest = new ManipulationParamRequest(); /* * リクエストパラメーターのリスト。オプションのパラメーターは指定しなくてもかまいません。必須パラメーターは指定する必要があります。そうしないと、エラーが返されます。 * キーはフィールド名で、値はフィールドの値です。 * たとえば、id はリクエストフィールド名で、1 は id の値です。複数のパラメーターを設定できます。 * 注: IN タイプのパラメーターの場合、List を使用してパラメーター値をラップします。 */ Map<String, Object> conditions = new HashMap<>(); conditions.put("id", 1); conditions.put("age", Arrays.asList(10, 20, 30)); manipulationParamRequest.setConditions(conditions); /* * API がデータをバッチで処理する場合、入力パラメーターを batchConditions に入れる必要があります。 */ List<Map<String, Object>> batchConditions = new ArrayList<>(); batchConditions.add(conditions); manipulationParamRequest.setBatchConditions(batchConditions); /* * API バージョン番号。このパラメーターはオプションで、開発環境の API でのみ設定できます。 */ // manipulationParamRequest.setApiVersion("V1"); return manipulationParamRequest; } /** * 結果文字列を取得します。 */ private static String getResultString(ApiResponse response) { /* * ステップ 1: HttpResponse ヘッダーから詳細情報を取得する方法 * response.getHeaders().get(key) * 説明: キーは "date\server\transfer-encoding\keep-alive\vary\connection\content-type\x-ca-request-id\x-ca-error-message\x-ca-error-code" になります。 * API 呼び出しが失敗した場合、ヘッダーには x-ca-error-message (エラーメッセージの説明) と x-ca-error-code (ゲートウェイエラーコード) が含まれます。呼び出しが成功した場合、これらのヘッダーは存在しません。 * ただし、x-ca-request-id (各リクエストの一意の ID) は常に存在します。 * 推奨: 返されたコードが 200 でない場合は、x-ca-error-message と x-ca-error-code を出力して問題をトラブルシューティングします。 * 必須: ログの確認を容易にするために、使用中に x-ca-request-id を出力します。 * * ステップ 2: 応答の詳細情報が以下に出力されます。実際の開発では、ステップ 1 で説明されているように、関連情報を出力することを選択できます。 */ System.out.println("詳細な応答情報: "+ SdkConstant.CLOUDAPI_LF + JSON.toJSONString(response) + SdkConstant.CLOUDAPI_LF); StringBuilder result = new StringBuilder(); result.append("バックエンドサーバーからの応答").append(SdkConstant.CLOUDAPI_LF).append(SdkConstant.CLOUDAPI_LF); result.append("ResultCode:").append(SdkConstant.CLOUDAPI_LF).append(response.getCode()).append(SdkConstant.CLOUDAPI_LF).append(SdkConstant.CLOUDAPI_LF); result.append("RequestId:").append(SdkConstant.CLOUDAPI_LF).append(response.getHeaders().get("x-ca-request-id")).append(SdkConstant.CLOUDAPI_LF).append(SdkConstant.CLOUDAPI_LF); if (200 != response.getCode()) { result.append("ErrorCode:").append(SdkConstant.CLOUDAPI_LF).append(response.getHeaders().get("x-ca-error-code")).append(SdkConstant.CLOUDAPI_LF).append(SdkConstant.CLOUDAPI_LF); result.append("ErrorMessage:").append(SdkConstant.CLOUDAPI_LF).append(response.getHeaders().get("x-ca-error-message")).append(SdkConstant.CLOUDAPI_LF).append(SdkConstant.CLOUDAPI_LF); } result.append("ResultBody:").append(SdkConstant.CLOUDAPI_LF).append(new String(response.getBody(), SdkConstant.CLOUDAPI_ENCODING)); /* * 結果を確認します。状態コードが 200 でない場合は、x-ca-error-message を確認してトラブルシューティングできます。 * x-ca-request-id パラメーターを保存することをお勧めします。例外が発生した場合は、このパラメーターを提供して問題をトラブルシューティングしてください。 */ return result.toString(); } }
ステップ 3:通信チャネルクラスを初期化する
API 操作を呼び出すには、まずクライアントを初期化する必要があります。ClientDemo.java の getClient メソッドを参照し、ApiClientBuilderParams クラスを使用して初期化できます。`Host`、`APP_Key`、および `APP_Secret` 変数を置き換える必要があります。
ステップ 4: API インターフェイスの説明
API インターフェースタイプ
API 操作は、クエリタイプ (LIST および GET) と操作タイプ (CREATE、UPDATE、および DELETE) に分類されます。
LIST はページ分割クエリをサポートしますが、GET はサポートしません。
QueryParamRequestのパラメーターを設定するには、ClientDemo.javaのpackRequestParamメソッドをご参照ください。操作タイプの API 操作については、
ClientDemo.javaのpackDmlRequestParamメソッドを参照して、ManipulationParamRequestのパラメーターを設定してください。
API インターフェースの呼び出し
SDK の LIST メソッドと GET メソッドは、Dataphin Data Service の汎用メソッドです。SDK は、同期呼び出しメソッドと非同期呼び出しメソッドの両方を提供します。API を呼び出す前に、Dataphin Data Service で定義した API に従って、関連するリクエストパラメーターを入力する必要があります。
このユースケースでは、
conditionsはクエリ API 操作のビジネスリクエストパラメーターを指定し、returnFieldsは API 応答パラメーターを指定します。パラメーターの詳細については、[サービス] > [アプリケーション管理] > [承認済み API サービス] ページに移動してください。対象の API 操作の [アクション] 列で、[テスト] をクリックしてテストページを開きます。API 操作の場合、ビジネスパラメーターは API に構成されたデータ量に応じて異なる方法で渡されます。単一エントリデータの場合、入力パラメーターを
conditionsパラメーターで渡します。バッチデータの場合、入力パラメーターをbatchConditionsパラメーターで渡します。リクエストパラメーターの API_ID は、[サービス] > [アプリケーション管理] > [承認済み API サービス] ページの API 列にあります。
Java SDK 非同期 API 呼び出しプロセス
API を呼び出す前に、まずクライアントを初期化する必要があります。
API の応答時間が長い場合は、非同期呼び出しを使用できます。応答を待機している間、メインスレッドはブロックされません。
さまざまなクエリに対して
QueryParamRequestオブジェクトをインスタンス化し、リクエストパラメーターを設定できます。詳細については、呼び出し例のpackRequestParamメソッドをご参照ください。API リクエストと応答の詳細については、SDK の
APIDocument.mdファイルをご参照ください。使用中に問題が発生した場合は、Dataphin テクニカルサポートにお問い合わせください。
ステップ 1:環境の準備
Dataphin サービス Java SDK には JDK 1.8 以降が必要です。
SDK が認証と署名情報を生成するために、認証キーのペア、つまり AppKey と AppSecret を準備する必要があります。
[サービス] > [アプリケーション管理] > [マイアプリケーション] ページのリストから AppKey と AppSecret を取得できます。
重要AppKey と AppSecret は、Dataphin サービスがユーザーリクエストを認証するために使用するキーです。これらの 2 つの構成がクライアント側に保存されている場合は、適切に暗号化してください。
pom.xmlファイルに次の依存関係を追加します。dataphin-sdk-core-javaを追加するときにエラーが発生した場合は、JAVA_SDK/lib/dataphin-sdk-core-java-v5.4.0.jarパスから JAR ファイルを手動で追加する必要があります。これは Java SDK の JAR パッケージです。説明dataphin-sdk-core-javaは中央の Maven リポジトリには存在しません。したがって、SDK をダウンロードした後、会社の Maven リポジトリにアップロードするか、IDEA または Eclipse に手動でインポートする必要があります。<dependency> <groupId>com.alibaba.dt</groupId> <artifactId>dataphin-sdk-core-java</artifactId> <version>v5.4.0</version> </dependency>
ステップ 2:Java SDK API インターフェース呼び出しクラスをインポートする
[サービス] > [API マーケットプレイス] > [API] ページのリストから対応する API ドキュメントをダウンロードできます。
AsyncClientDemo.javaをインポートし、AsyncClientDemo.javaクラスのインポート文とパッケージ文を修正します。package com.alibaba.dt.dataphin; import com.alibaba.cloudapi.sdk.enums.Scheme; import com.alibaba.cloudapi.sdk.model.ApiRequest; import com.alibaba.dt.dataphin.client.ApiClientBuilderParams; import com.alibaba.dt.dataphin.client.DataphinDataServiceException; import com.alibaba.dt.dataphin.client.async.AsyncApiCallBack; import com.alibaba.dt.dataphin.client.async.AsyncApiClient; import com.alibaba.dt.dataphin.client.async.AsyncJobContext; import com.alibaba.dt.dataphin.schema.AsyncQueryResults; import com.alibaba.dt.dataphin.schema.OrderBy; import com.alibaba.dt.dataphin.schema.QueryParamRequest; import com.alibaba.fastjson.JSONObject; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; /** * 非同期 API の例 * <p> * 使用方法: * まず、HOST、APP_KEY、APP_SECRET、および API_ID を構成します。 * 次に、必要に応じて getClient() の変数と packQueryParamRequest() のパラメーター値を設定します。 * 注: * getClient() のパラメーターは、API ごとに異なる値を持つ場合があります。getClient() を変更して入力パラメーターを受け入れるようにすることで、さまざまな API に適応させることができます。 */ public class AsyncClientDemo { /** * エンドポイントまたは IP アドレス。この値は DataService Studio のネットワーク構成から取得します。 */ private static final String HOST = "xxx"; /** * この API を呼び出すために使用するアプリケーションの AppKey。 */ private static final String APP_KEY = "xxx"; /** * この API を呼び出すために使用するアプリケーションの AppSecret。 */ private static final String APP_SECRET = "xxx"; /** * 呼び出す API の ID。 */ private static final String API_ID = "xxx"; /** * 各バッチでクエリするエントリの数。デフォルト値: 1000。 */ private static final Integer FETCH_SIZE = 1000; public static void main(String[] args) throws Exception { // ブロッキング呼び出し callAsyncApiBlock(); // 非ブロッキング呼び出し callAsyncApiNotBlock(); } /** * ブロッキング呼び出し */ @SuppressWarnings("all") private static void callAsyncApiBlock() { // AsyncApiClient オブジェクトを取得します。 AsyncApiClient asyncApiClient = getClient(); // 必要に応じて、戻りフィールド、クエリ条件、およびその他のパラメーターを変更します。 QueryParamRequest queryParamRequest = packRequestParam(); try { AsyncQueryResults asyncQueryResults = asyncApiClient.listAsyncWaitFinish(API_ID, queryParamRequest); System.out.println(JSONObject.toJSONString(asyncQueryResults)); } catch (Throwable e) { e.printStackTrace(); } // クライアントをシャットダウンしてリソースを解放します。 asyncApiClient.shutdown(); } /** * 非ブロッキング呼び出し */ @SuppressWarnings("all") private static void callAsyncApiNotBlock() { // AsyncApiClient オブジェクトを取得します。 AsyncApiClient asyncApiClient = getClient(); // 必要に応じて、戻りフィールド、クエリ条件、およびその他のパラメーターを変更します。 QueryParamRequest queryParamRequest = packRequestParam(); try { AsyncApiCallBack callback = new AsyncApiCallBack() { @Override public void onFailure(ApiRequest request, DataphinDataServiceException e) { System.out.println(e.getMessage()); } @Override public void onResponse(ApiRequest request, AsyncQueryResults results) { System.out.println(JSONObject.toJSONString(results)); } }; AsyncJobContext context = asyncApiClient.listAsync(API_ID, queryParamRequest, callback); // リクエストが成功した場合、リクエストの jobId が返されます。 System.out.printf("jobId: %s", context.getJobId()); // 実行が完了するのを待ちます。実際のシナリオでは、sleep メソッドを使用して待機しないでください。 Thread.sleep(600000); } catch (Exception e) { e.printStackTrace(); } // クライアントをシャットダウンしてリソースを解放します。 asyncApiClient.shutdown(); } /** * AsyncApiClient オブジェクトを取得します。 */ public static AsyncApiClient getClient() { ApiClientBuilderParams params = new ApiClientBuilderParams(); // アプリケーションの AppKey。 params.setAppKey(APP_KEY); // アプリケーションの AppSecret。 params.setAppSecret(APP_SECRET); // エンドポイントまたは IP アドレス。 params.setHost(HOST); // デフォルトのプロトコルは HTTP です。API に基づいてプロトコルを HTTPS に設定できます。 // 注: Dataphin の組み込みゲートウェイは HTTPS をサポートしていません。Alibaba Cloud API Gateway は HTTPS をサポートしています。 params.setScheme(Scheme.HTTP); // 各バッチでクエリするエントリの数。デフォルト値: 1000。 params.setFetchSize(FETCH_SIZE); // ステージ環境変数。PRE は開発環境の API を指定し、RELEASE は本番環境の API を指定します。 params.setStage("RELEASE"); // 環境が指定されていない第 2 レベルドメイン名または独立ドメイン名を使用する場合は、env パラメーターを設定する必要があります。 // 有効な値: PROD と PRE。基本モードを使用する場合は、このパラメーターを PROD に設定します。Dev-Prod モードを使用する場合は、このパラメーターを PROD に設定して本番環境のデータをクエリするか、PRE に設定して開発環境のデータをクエリします。 // 環境にアクセスするために独立ドメイン名を指定した場合、env パラメーターは有効になりません。 params.setEnv("PROD"); return new AsyncApiClient(params); } /** * リクエストオブジェクトをパッケージ化します。 */ private static QueryParamRequest packRequestParam() { QueryParamRequest queryParamRequest = new QueryParamRequest(); /********* API 関連のビジネスパラメーターの構成 - 開始 *********/ /* * プロキシアカウントのタイプ。このパラメーターは必須ではありません。 * 注: プロキシモードを使用するには、次の条件を満たす必要があります: * 1. 行レベルの権限機能が有効になっている。 * 2. アプリケーションにプロキシ権限が付与されている。 * 3. API が行レベルの権限ルールに関連付けられている。 * * プロキシモードで認証を使用する場合、プロキシユーザーのアカウントタイプを指定する必要があります。 * ACCOUNT_NAME: Dataphin のユーザー名。 * USER_ID: Dataphin の一意の ID。 * SOURCE_USER_ID: ソースシステムのアカウント ID。 * このパラメーターは、DelegationUid が設定されている場合にのみ必須です。このパラメーターを指定しない場合、デフォルト値の USER_ID が使用されます。 */ queryParamRequest.setAccountType("USER_ID"); /* * プロキシアカウントの ID。このパラメーターは必須ではありません。 * プロキシでアクセスするユーザー。選択した AccountType に基づいて、対応するアカウント ID を入力する必要があります。 * このパラメーターを設定し、API が行レベルの権限ルールに関連付けられている場合、プロキシモードが認証に使用されます。 */ queryParamRequest.setDelegationUid("abcd"); /* * リクエストパラメーターのリスト。オプションのパラメーターは指定しなくてもかまいません。必須パラメーターは指定する必要があります。そうしないと、エラーが返されます。 * キーはクエリフィールドを指定し、値はクエリフィールドの値を指定します。 * たとえば、id はリクエストフィールド名で、1 は id の値です。複数のクエリパラメーターを指定できます。 * 注: パラメーターが IN タイプの場合、age パラメーターのように List を使用してパラメーター値をラップします。 */ HashMap<String, Object> conditions = new HashMap<>(); conditions.put("id", 1); conditions.put("age", Arrays.asList(10,20,30)); queryParamRequest.setConditions(conditions); /* * 返されるパラメーターのリスト。このパラメーターは必須です。 * たとえば、id パラメーターと name パラメーターを返すように指定できます。 * 注: 返されるパラメーターが存在しないか、必要な権限がない場合、エラーが報告されます。 */ queryParamRequest.setReturnFields(Arrays.asList("id", "name")); /* * ソートフィールド。このパラメーターは必須ではありません。 * 注: Oracle または SQL Server を使用する場合、ページネーションにはソートを使用する必要があります。 * 1 つ以上のフィールドと、各フィールドのソート順 (昇順または降順) を指定できます。 * たとえば、結果を ID で昇順にソートできます。 */ List<OrderBy> orderList = new ArrayList<>(); orderList.add(new OrderBy("id1", OrderBy.Order.ASC)); orderList.add(new OrderBy("id2", OrderBy.Order.DESC)); queryParamRequest.setOrderBys(orderList); /* * API のバージョン番号。このパラメーターは必須ではなく、開発環境でのみ設定できます。 */ queryParamRequest.setApiVersion("V1"); /********* API 関連のビジネスパラメーターの構成 - 終了 *********/ /********* 機能パラメーターの構成 - 開始 *********/ /* * フィールドの大文字と小文字を区別するかどうかを指定します。値を true に設定します。 */ queryParamRequest.setKeepColumnCase(true); /********* 機能パラメーターの構成 - 終了 *********/ return queryParamRequest; } }
ステップ 3:通信チャネルクラスを初期化する
API 操作を呼び出すには、まずクライアントを初期化する必要があります。AsyncClientDemo.java の getClient メソッドを参照し、ApiClientBuilderParams クラスを使用して初期化できます。Host、APP_Key、および APP_Secret 変数を置き換える必要があります。
ステップ 4: API インターフェイスの説明
API インターフェースタイプ
API は LIST と GET に分類されます。LIST はページ分割クエリをサポートしますが、GET はサポートしません。詳細については、
AsyncClientDemo.javaのpackRequestParamメソッドを参照して、QueryParamRequestのパラメーターを設定してください。API インターフェースの呼び出し
SDK の LIST メソッドと GET メソッドは、Dataphin Data Service の汎用メソッドです。SDK は、同期呼び出しメソッドと非同期呼び出しメソッドの両方を提供します。API を呼び出す前に、Dataphin Data Service で定義した API に従って、関連するリクエストパラメーターを入力する必要があります。
ユースケースでは、
conditionsパラメーターはビジネスリクエストパラメーターを指定し、returnFieldsパラメーターは API 応答パラメーターを指定します。パラメーターの詳細については、[サービス] > [アプリケーション管理] > [承認済み API サービス] ページに移動してください。対象の API 操作の [アクション] 列で、[テスト] をクリックしてテストページに移動します。リクエストパラメーターの API_ID を取得するには、[サービス] > [アプリケーション管理] > [承認済み API サービス] ページに移動し、API 列で API_ID を見つけます。
Python SDK 呼び出しプロセス
ステップ 1:環境の準備
Python SDK は、Python 3.9 以降のバージョンに適用できます。
Python SDK は、次の手順で取得できます。
Dataphin のホームページで、上部メニューバーの [サービス] > [アプリケーション管理] に移動します。
左側のナビゲーションウィンドウで、[呼び出し手順] をクリックします。
[API 呼び出し例] タブをクリックし、ページの右上隅にある [Python 呼び出し例ダウンロード] ボタンをクリックして、Python SDK コアパッケージを取得します。
SDK が認証と署名情報を生成するために、認証キーのペア、つまり AppKey と AppSecret を準備します。
重要AppKey と AppSecret は、Dataphin サービスがユーザーリクエストを認証するために使用するキーです。これらの 2 つの構成がクライアント側に保存されている場合は、適切に暗号化してください。
次の形式の JSON ファイルを準備します。
{ "host": "API ゲートウェイのドメイン名", "port": 80, "impalaConfig": { "pollingTimeout": 300, "pollingInterval": 800 }, "applicationConfig": { "appKey": "機密データを入力", "appSecret": "機密データを入力" }, "apiConfig": { "apiNo": 10008, "scheme": "HTTP", "stage": "RELEASE", "env": "PROD", "method": "LIST", // GET、LIST、CREATE、UPDATE、または DELETE。大文字と小文字を区別します。 "queryParamRequest": { "conditions": {"id": "1"}, // リクエストパラメーターのリスト。オプションのパラメーターは省略できますが、必須パラメーターは指定する必要があります。 "returnFields": ["id", "name", "age"], // 返されるパラメーターのリスト。このパラメーターは必須です。返されるパラメーターが存在しないか、必要な権限がない場合、エラーが報告されます。 "orderBys": [{"field": "id", "order": "ASC"}], // ソートフィールド。このパラメーターはオプションです。 "useModelCache": "false", // モデルキャッシュを使用するかどうかを指定します。このパラメーターを有効にすると、入力パラメーターと出力パラメーターが同じ場合、同じサービスユニット内の API の解析頻度が減少します。これにより、クエリ効率が向上します。 "useResultCache": "false", // 結果キャッシュを使用するかどうかを指定します。このパラメーターを有効にすると、条件と返されたフィールドが同じ場合、API のクエリ結果がキャッシュされます。 "apiVersion": "V1", // API バージョン番号。このパラメーターはオプションで、開発環境でのみ設定できます。 "accountType": "USER_ID", // プロキシアカウントタイプ。このパラメーターはオプションで、プロキシモードを使用する場合に必須です。 "delegationUid": "abcd" // プロキシアカウント ID。このパラメーターはオプションで、プロキシモードを使用する場合に必須です。 }, "manipulationParamRequest": { "conditions": {"id": "1"}, // "単一" データ量の API のリクエストパラメーター。オプションのパラメーターは省略できますが、必須パラメーターは指定する必要があります。 "batchConditions": [ // "バッチ" データ量の API のリクエストパラメーター。オプションのパラメーターは省略できますが、必須パラメーターは指定する必要があります。 {"id": "1"}, {"id": "2"} ] } } }
ステップ 2:Python SDK をデプロイする
Python 開発ツール PyCharm をインストールします。
Python プロジェクトを開きます。
Demo クラスの起動パラメーターで JSON ファイルのパスを設定します。
具体的な呼び出しについては、demo.py を参照してください。
ステップ 3:API を呼び出す
JSON ファイルで呼び出しパラメーター情報を構成します。
Python SDK は、JSON ファイルを読み取って API 呼び出しの基本パラメーターをアセンブルします。
apiClient.callApiメソッドを呼び出します。詳細については、demo.py ファイルをご参照ください。# -*- coding: utf-8 -*- import dataapi import sys with open(str(sys.argv[1]), encoding="utf-8") as f: json_obj = eval(f.read().replace('\n\u200b', '')) # これは JSON ファイルからコンテキストを読み取ります。JSON ファイルが不要な場合は、対応する値を直接入力します。 # ゲートウェイのアドレス。 host = json_obj["host"] # ゲートウェイのポート。 port = json_obj["port"] # このパラメーターはオプションで、Impala タイプの API でのみ有効です。ポーリングのタイムアウト期間。 pollingTimeout = json_obj["impalaConfig"]["pollingTimeout"] # このパラメーターはオプションで、Impala タイプの API でのみ有効です。ポーリング間隔。 pollingInterval = json_obj["impalaConfig"]["pollingInterval"] # この API を呼び出すために使用するアプリケーションに関する情報。 appKey = json_obj["applicationConfig"]["appKey"] appSecret = json_obj["applicationConfig"]["appSecret"] # API に関する情報。 apiId = json_obj["apiConfig"]["apiNo"] # API を呼び出すメソッド。有効な値: HTTP および HTTPS。注: プライベートゲートウェイは HTTP のみをサポートします。大文字と小文字を区別します。 scheme = json_obj["apiConfig"]["scheme"] # 環境。RELEASE は本番環境を示します。 stage = json_obj["apiConfig"]["stage"] # 有効な値: PROD および PRE。基本モードを使用する場合、このパラメーターを PROD に設定します。Dev-Prod モードを使用する場合、PROD は本番データベースがクエリされることを示し、PRE は開発データベースがクエリされることを示します。大文字と小文字を区別します。 env = json_obj["apiConfig"]["env"] # クエリ API のリクエストパラメーター。 queryParam = json_obj["apiConfig"]["queryParamRequest"] # 操作 API のリクエストパラメーター。 manipulationParam = json_obj["apiConfig"]["manipulationParamRequest"] # API が GET、LIST、CREATE、UPDATE、または DELETE タイプであるかどうかを指定します。大文字と小文字を区別します。 method = json_obj["apiConfig"]["method"] if (host == None or host == ""): raise Exception("ホスト情報がありません。") if (appKey == None or appKey == ""): raise Exception("appKey 情報がありません。") if (appSecret == None or appSecret == ""): raise Exception("appSecret 情報がありません。") if (method == None or method == ""): raise Exception("メソッド情報がありません。") if (apiId == None or apiId == ""): raise Exception("apiNo 情報がありません。") # Impala を構成します。 impalaConfig = dataapi.ImpalaConfig(pollingTimeout=pollingTimeout, pollingInterval=pollingInterval) # アプリケーションを構成します。 appConfig = dataapi.AppConfig(appKey=appKey, appSecret=appSecret) apiConfig = dataapi.ApiConfig(apiId, scheme, stage, env, queryParam, method) myConfig = dataapi.MyConfig(host, port, impalaConfig, appConfig, apiConfig) apiClient = dataapi.ApiClient(myConfig) # 同期クエリ API リクエスト。 resp = apiClient.callApi(queryParam) print(resp) # 非同期クエリ API リクエスト。 asyncResp = apiClient.asyncCallApi(queryParam) print(asyncResp) # Flux API リクエスト。 sseClient = dataapi.SseApiClient(myConfig) fluxResp = sseClient.fluxCallApi(queryParam) for item in fluxResp: print(item) # 同期操作 API リクエスト。 resp = apiClient.callApi(manipulationParam) print(resp)
ホワイトリスト呼び出しメソッド (プライベートデプロイメントでのみサポート)
API のホワイトリスト認証フリーアクセス ポリシーを設定することで、API 呼び出しプロセスを簡素化できます。IP ホワイトリスト ポリシーはアプリケーションレベルのポリシーであり、現在、プライベートクラウドのみがこの呼び出し方式をサポートしています。
開発プロセス
ステップ 1: バックエンドの構成
ホワイトリスト方式で API にアクセスするには、Data Service で API、アプリケーション、アプリケーションホワイトリストを作成し、アプリケーションと API をバインドする必要があります。
API 操作の作成: [サービス] > [API 開発] > [API サービス] ページで、メソッドを選択します。詳細については、「API の作成」をご参照ください。
アプリケーションとアプリケーションホワイトリストの作成: アプリケーションは、本番環境で API 操作を呼び出すために使用されます。アプリケーションのホワイトリストを設定することもできます。アプリケーションとホワイトリストの作成方法の詳細については、「マイアプリケーションの作成と管理」をご参照ください。
アプリケーションと API のバインド:API を使用するには、API がアタッチされているアプリケーションから権限をリクエストする必要があります。詳細については、「API 権限を管理する」をご参照ください。
ステップ 2: リクエストの開始
リクエストタイプ:POST
POST リクエストのみがサポートされています。リクエスト本文は JSON 文字列でなければならず、Content-Type は
application/octet-stream; charset=utf-8に設定する必要があります。共通入力パラメーターを設定する
パラメーター名
場所
必須
例
説明
accept
ヘッダー
はい
application/json; charset=utf-8
応答形式。
host
ヘッダー
はい
gateway.aliyun.com
API ゲートウェイのドメイン名。
x-ca-key
ヘッダー
はい
機密データを入力
appkey。API を呼び出すための ID 識別子。
x-ca-stage
ヘッダー
はい
RELEASE
環境識別子。
RELEASE: 本番環境にアクセスします。
PRE: 開発環境にアクセスします。
Content-Type
ヘッダー
はい
application/octet-stream; charset=utf-8
リクエスト形式。
whitelist-flag
ヘッダー
はい
1
ホワイトリスト識別子。このパラメーターは空にできません。固定値: 1。
リクエスト形式
URL:POST [host]/method/apiId?appKey=アプリケーションの AppKey&env=PROD
host: API Gateway のドメイン名。これは サービス > サービス管理 > ネットワーク構成 ページから取得できます。
method: API 操作の操作タイプ。GET、LIST、CREATE、UPDATE、または DELETE のいずれかです。操作タイプは [サービス] > [アプリケーション管理] > [承認済み API サービス] > [テスト] ページから取得できます。
apiId: API 操作の一意の識別子。これは サービス > アプリケーション管理 > 承認済み API サービス > テスト ページから取得できます。
appKey: API 操作がバインドされているアプリケーションの一意の識別子。これは サービス > アプリケーション管理 > マイアプリケーション ページから取得できます。
env:環境識別子。PROD は本番環境の API へのアクセスを示し、PRE は開発環境の API へのアクセスを示します。
リクエスト URL の例:
gateway.aliyun.com/list/12345?appKey=xxx&env=PROD。
PostMan 呼び出し例の使用
ステップ 1:リクエストアドレス
[host]/method/apiId?appKey=your_AppKey&env=PRODに POST リクエストを送信します。ステップ 2:ヘッダーに入力する
ヘッダーに入力します。詳細については、「共通入力パラメーターを設定する」をご参照ください。
ヘッダーの例は次のとおりです。
accept:application/json;charset=utf-8 x-ca-key:Your sensitive data host:Your API gateway domain name x-ca-stage:RELEASE Content-Type:application/octet-stream;charset=utf-8 whitelist-flag:1ステップ 3:本文に入力する
説明Content-Type には
application/octet-stream; charset=utf-8を使用します。本文の例:
{ "conditions": {"id": "1"}, // リクエストパラメーターのリスト。オプションのパラメーターは省略できますが、必須パラメーターは指定する必要があります。 "batchConditions": [{"id": "1"}], // "バッチ" データ量の操作タイプ API のリクエストパラメーター。オプションのパラメーターは省略できますが、必須パラメーターは指定する必要があります。 "returnFields": ["id", "name", "age"], // 返されるパラメーターのリスト。このパラメーターは必須です。返されるパラメーターが存在しないか、必要な権限がない場合、エラーが報告されます。 "orderBys": [{"field": "id", "order": "ASC"}], // ソートフィールド。このパラメーターはオプションです。 "useModelCache": "false", // モデルキャッシュを使用するかどうかを指定します。このパラメーターを有効にすると、入力パラメーターと出力パラメーターが同じ場合、同じサービスユニット内の API の解析頻度が減少します。これにより、クエリ効率が向上します。 "useResultCache": "false", // 結果キャッシュを使用するかどうかを指定します。このパラメーターを有効にすると、条件と返されたフィールドが同じ場合、API のクエリ結果がキャッシュされます。 "apiVersion": "V1", // API バージョン番号。このパラメーターはオプションで、開発環境でのみ設定できます。 "accountType": "USER_ID", // プロキシアカウントタイプ。このパラメーターはオプションで、プロキシモードを使用する場合に必須です。 "delegationUid": "abcd" // プロキシアカウント ID。このパラメーターはオプションで、プロキシモードを使用する場合に必須です。 }
エラーコード
クライアントエラー
エラーコード | HTTP ステータスコード | セマンティクス | 解決策 |
Throttled by APP Flow Control | 403 | APP スロットリングによる制限 | 呼び出し頻度が高すぎるため、スロットリングが発生しています。サービスプロバイダーに連絡して制限を増やすことができます。 |
Throttled by API Flow Control | 403 | API スロットリングによる制限 | 呼び出し頻度が高すぎるため、スロットリングが発生しています。サービスプロバイダーに連絡して制限を増やすことができます。 |
Throttled by DOMAIN Flow Control | 403 | 第 2 レベルドメインフロー制御による制限 | 第 2 レベルドメインを介して API に直接アクセスする場合、1 日のアクセス制限は 1000 回の呼び出しです。 |
Throttled by GROUP Flow Control | 403 | グループスロットリングによる制限 | 呼び出し頻度が高すぎるため、呼び出しがスロットリングされています。サービスプロバイダーに連絡して制限を増やすことができます。 |
Empty Request Body | 400 | 本文が空です | リクエスト本文の内容を確認してください。 |
Invalid Request Body | 400 | 無効な本文 | リクエスト本文を確認してください。 |
Invalid Param Location | 400 | パラメーター位置エラー | リクエストパラメーターの位置が正しくありません。 |
Invalid Url | 400 | 無効な URL | リクエストされたメソッド、パス、または環境が正しくありません。エラーの説明「無効な URL」を参照してください。 |
Invalid Domain | 400 | 無効なドメイン名 | リクエストドメインが無効です。ドメインに基づいて API が見つかりません。Dataphin サービスチームにお問い合わせください。 |
Invalid HttpMethod | 400 | 無効な HttpMethod | 入力メソッドが無効です。 |
Invalid AppKey | 400 | AppKey が無効であるか、存在しません | 入力した AppKey を確認してください。AppKey の前後のスペースに注意してください。 |
Invalid AppSecret | 400 | APP Secret エラー | 入力した AppSecret を確認してください。前後のスペースの影響に注意してください。 |
Timestamp Expired | 400 | タイムスタンプの期限切れ | リクエストシステム時刻が標準時刻かどうかを確認してください。 |
Invalid Timestamp | 400 | 無効なタイムスタンプ | リクエスト署名ドキュメントを参照してください。 |
Empty Signature | 404 | 空の署名 | 署名文字列を入力してください。詳細については、リクエスト署名ドキュメントを参照してください。 |
Invalid Signature, Server StringToSign:%s | 400 | 無効な署名 | 署名が無効です。無効な署名エラーの説明を参照してください。 |
Invalid Content-MD5 | 400 | 無効な Content-MD5 値 | リクエスト本文は空ですが、MD5 値が指定されているか、MD5 値が正しく計算されていません。リクエスト署名ドキュメントを参照してください。 |
Unauthorized | 403 | 承認されていません | APP は API を呼び出す権限がありません。エラーの説明「承認されていません」を参照してください。 |
Nonce Used | 400 | SignatureNonce が使用されています | x-ca-nonce は再利用できません。新しい x-ca-nonce を生成します。 |
API Not Found | 400 | API が見つかりません | 渡された API リクエストアドレスまたは HttpMethod が正しくないか、未公開です。 |
サーバー側エラー (API 呼び出し)
API サーバーエラーを以下に示します。
エラーコード | HTTP ステータスコード | セマンティクス | 解決策 |
Internal Error | 500 | 内部エラー | 後でもう一度試してください。 |
Failed To Invoke Backend Service | 500 | バックエンドサービスが失敗したために返されたエラーコード。 | API バックエンドサービスエラー。後でもう一度試してください。 |
Service Unavailable | 503 | サービス利用不可 | 後でもう一度試してください。 |
Async Service | 504 | サービスタイムアウト | 後でもう一度試してください。 |
サーバー側エラー (SQL 文の実行)
エラーコード | セマンティクス |
DPN-OLTP-COMMON-000 | 成功。 |
DPN.Oltp.Common.Running | 実行中 |
DPN-OLTP-COMMON-001 | システムで不明なエラーが発生しました。 |
DPN-OLTP-COMMON-002 | パラメーターが無効です。 |
DPN-OLTP-COMMON-003 | いいえ、これはサポートされていません。 |
DPN-OLTP-COMMON-004 | SQL 解析例外。 |
DPN-OLTP-COMMON-005 | SQL インジェクション検出に失敗しました。 |
DPN-OLTP-ENGINE-000 | クエリタイムアウト。 |
DPN-OLTP-ENGINE-001 | パラメーターエラー。 |
DPN-OLTP-ENGINE-002 | オブジェクトが見つかりません。 |
DPN-OLTP-ENGINE-003 | いいえ、これはサポートされていません。 |
DPN-OLTP-ENGINE-004 | 通信テーブルエラー。 |
DPN-OLTP-ENGINE-005 | SQL 解析に失敗しました。 |
DPN-OLTP-ENGINE-006 | メタデータエラー。 |
DPN-OLTP-ENGINE-007 | パラメーター処理エラー。 |
DPN-OLTP-ENGINE-008 | 実行モデルの構築エラー。 |
DPN-OLTP-ENGINE-009 | 実行に失敗しました。 |
DPN-OLTP-ENGINE-010 | データソースエラー。 |
DPN-OLTP-ENGINE-011 | HBase エンジンはサポートされていません。 |
DPN-OLTP-ENGINE-012 | オブジェクトのシリアル化に失敗しました。 |
DPN-OLTP-ENGINE-013 | 権限検証に失敗しました。 |
DPN-OLTP-ENGINE-014 | Elasticsearch DPI エンジンはサポートされていません。 |
DPN-OLTP-ENGINE-015 | MongoDB エンジンはサポートされていません。 |
DPN-OLTP-ENGINE-016 | フィールドタイプエラー。 |
DPN-OLTP-ENGINE-017 | Redis キャッシュ異常。 |
DPN-OLTP-ENGINE-018 | クロスデータソースはサポートされていません。 |
DPN-OLTP-ENGINE-018-01 | クロスデータソースクエリは GROUP BY 句をサポートしていません。 |
DPN-OLTP-ENGINE-018-02 | クロスデータソースは Order by をサポートしていません。 |
DPN-OLTP-ENGINE-018-03 | クロスデータソースは where 条件のないクエリをサポートしていません。 |
DPN-OLTP-ENGINE-018-04 | クロスデータソースは page start が 0 以外をサポートしていません。 |
DPN-OLTP-ENGINE-018-05 | クロスデータソースは where 条件の「or」演算をサポートしていません。 |
DPN-OLTP-ENGINE-018-06 | クロスデータソースは、単一の select 項目の複数の物理テーブルからのフィールドをサポートしていません。 |
DPN-OLTP-ENGINE-018-07 | すべてのプライマリキーをクロスデータソースクエリに含める必要があります。 |
DPN-OLTP-ENGINE-019 | データタイプのエンコーディングまたはパラメータータイプの変換に失敗しました。 |
DPN-OLTP-ENGINE-20 | サーキットブレーカー。 |
DPN-OLTP-ENGINE-21 | レート制限。 |
DPN-OLTP-ENGINE-22 | クエリタイムアウト。 |
DPN-OLTP-ENGINE-23 | 複合 API のサブ API 異常。 |
DPN-OLTP-ENGINE-24 | プロキシ権限がありません。 |
DPN.Oltp.Auth | 権限検証に失敗しました。 |
DPN.Oltp.Async.JobNotExists | 非同期 API タスクが存在しません。 |
DPN.Oltp.Async.JobStatusNotSupport | この操作は、非同期 API タスクステータスではサポートされていません。 |
DPN.Oltp.Async.GetResultError | 非同期 API 結果の取得に失敗しました。 |
DPN.Oltp.Oltp.JsonContentParseError | JSON コンテンツの解析に失敗しました。 |
DPN.Oltp.Oltp.HttpRequestError | HTTP リクエストに失敗しました。 |
DPN.Oltp.Jdbc.ProjectForbidden | このプロジェクトの下のテーブルを変更する権限がありません。 |
DPN-OLTP-JDBC-001 | リクエストヘッダーにセッションがありません。 |
DPN-OLTP-JDBC-002 | セッションエラー。 |
DPN-OLTP-JDBC-003 | ユーザーにデータベースにアクセスする権限がありません。 |
DPN-OLTP-JDBC-004 | ユーザーにデータテーブルにアクセスする権限がありません。 |
DPN-OLTP-JDBC-005 | AccountId エラー。 |
DPN-OLTP-JDBC-006 | クエリを停止します。 |
DPN-OLTP-OLAP-001 | Olap クライアントがデータソースのクエリに失敗しました。 |
DPN-OLTP-OLAP-002 | Olap クライアントの実行に失敗しました。 |
DPN.Oltp.Olap.SessionError | Olap セッションエラー。 |
DPN.Oltp.Olap.SessionNotFound | Olap セッションが存在しません。 |
よくある質問
質問 1: API 呼び出しで 404 エラーが返されます。 回答:
独立ドメインをアタッチしている場合は、プロトコルが HTTP か HTTPS かを確認してください。
呼び出している API の操作タイプが、API の定義されたタイプと一致していることを確認してください。操作タイプは URL の一部であるため、正しいメソッドを呼び出していることを確認してください。
API が対応する環境に公開されているかどうかを確認してください。
質問 2: API 呼び出しで 400 エラーが返されます。 回答:
x-ca-timestampが 15 分の有効期間内にあるかどうか、およびx-ca-nonceが 15 分以内に再利用されたかどうかを確認してください。API リクエストごとに、x-ca-timestampに現在の時刻を使用し、新しいx-ca-nonceを生成することをお勧めします。UUID を使用して `x-ca-nonce` 値を生成できます。これは一意の識別子として機能し、特定の形式要件はありません。AppKey と AppSecret の前後にスペースがあるかどうかを確認してください。
API 操作が承認されており、承認されたアプリケーションの AppKey と AppSecret が APP_KEY および APP_SECRET パラメーターと一致していることを確認してください。
クライアントの署名値に、サーバーに送信された値にない余分なスペースが含まれているかどうかを確認してください。
stringToSign値にスペースがないか確認してください。たとえば、クライアント署名Content-Type:application/octet-stream; charset=utf-8にスペースが含まれているが、サーバーに送信された値がContent-Type:application/octet-stream;charset=utf-8である場合、Invalid Signatureエラーが報告されます。
質問 3: API 呼び出しで 403 エラーが返されます。
回答:
API が HTTP プロトコルまたは HTTPS プロトコルを使用するように構成されているかどうかを確認し、コードで対応するパラメーターを設定します。
AppKey と AppSecret が正しいかどうかを確認してください。
呼び出している API の操作タイプが、API の定義されたタイプと一致していることを確認してください。操作タイプは URL の一部であるため、正しいメソッドを呼び出していることを確認してください。
質問 4: API 呼び出しで次のエラーが返されます: return fields missing in param
回答: packRequestParam メソッドで、パラメーターを次のように設定します:
List<String> returnFields = Lists.newArrayList("API 戻りフィールド 1","API 戻りフィールド 2",..."API 戻りフィールド n");
queryParamRequest.setReturnFields(returnFields);質問 5: IN 演算子を持つパラメーターはどのように使用しますか?
回答: SDK を使用して API 呼び出しを行う場合、IN パラメーターについては、LIST を使用して値を渡す必要があります。 例:
パラメーター名が p1、パラメータータイプが String または Date、パラメーター値が a、b、c の場合、パラメーターを次のように設定する必要があります。
Map<String, Object> conditions = Maps.newHashMap();
conditions.put("p1",Lists.newArrayList("a", "b", "c"));パラメーター値が 1、2、3 の数値型の場合は、次のようにパラメーターを設定する必要があります。
Map<String, Object> conditions = Maps.newHashMap();
conditions.put("p1",Lists.newArrayList(1,2,3));質問 6: SDK を使用してページ分割されたデータを取得すると、合計データ数は正しいですが、一部のデータが重複しています。
原因: これは、API コードがソートフィールドを使用して各クエリの一意のソート結果を保証していないか、データベース自体がソートをサポートしていないために発生します。これにより、ページ分割でデータを取得するたびにクエリ結果のソートが不整合になり、データの重複やデータの損失が発生します。
回答: 返される結果のソートが安定していることを確認してください。プライマリキーが存在する場合は、プライマリキーフィールドによるソートを追加します。プライマリキーが存在しない場合は、複数のフィールドを使用して複合プライマリキーを形成し、各クエリでソート結果が安定するようにします。
質問 7: SDK を使用してページ分割されたデータを取得する場合、合計数を返すようにパラメーターを設定するにはどうすればよいですか?
回答: packRequestParam メソッドで、パラメーターを次のように設定します:
// 合計数を返すかどうかを指定します (ページ分割クエリをサポートする API の場合)。
queryParamRequest.setReturnTotalNum(false);