<本記事は2019年12月10日に Forge SDK 更新にあわせて一部改定しています。>
Forge ポータル(https://forge.autodesk.com/)の Code Samples から入手可能な Forge SDK があります。サンプルとして主要な開発環境/フレームワーク別に手早く開発環境を構築する手助けとなる Quickstarts コンテンツを入手することが可能です。今回は、Forge サンプルで多用されている Node,js の Quickstarts の内容を日本語化してご紹介したいと思います。
使用する Forge SDK は forge-api-nodejs-client で、Authentication API(OAuth API)、Data Management API、Model Derivative API、Design Automation API をまとめて 1 つにまとめた Node.js パッケージ(ミドルウェア)で、クイックスタートでは、この SDK を利用して次の処理をサーバー側に実装しています。
- 2-legged 認証による Access Token の取得
- Bucket の作成
- Bucket へのファイル アップロード
- Bucket の一覧表示
- アップロードしたファイルの削除
残念ながら、Model Derivative API によるデザイン ファイルの変換や Forge Viewer への表示処理は実装されませんが、後日、本記事の内容に追記するかたちで別の機会にご紹介します。なお、Quickstarts も GitHub からソースコードをクローンしていくため、Forge の開発環境 でご案内している環境がセットアップされていることを前提とします。
- コマンド プロンプト を起動後、CD コマンドでカレント フォルダをドキュメント ディレクトリ(C:\Users\<Windowsログインユーザ名>\Documents)に移動してから、git clone コマンドで確認した URL をパラメータに指定して、リポジトリ の内容をクライアント コンピュータにコピーします。git clone https://github.com/Autodesk-Forge/forge-api-nodejs-client.git と入力してください。
- コピーされたリポジトリが、C:\Users\<Windows ユーザ名>\Documents フォルダ直下の forge-api-nodejs-client フォルダ配下にコピーされていることを確認してください。確認後、CD コマンドでカレント フォルダを forge-api-nodejs-client フォルダに移動します。
- 続いて、コピーした Forge SDK が内包するサンプル コードが利用する Node Package を、npm コマンド(Node Package Manager)を使ってインストールしていきます。Node.js command prompt を起動後に forge-api-nodejs-client にディレクトリに移動したら、npm install と入力してください。
- Forge ポータル でアプリを登録して、Client ID(Consumer Key)と Client Secret(Conumer Secret)を取得してください。アプリの登録方法については、Forge API を利用するアプリの登録とキーの取得 のブログ記事でご紹介しています。
- forge-api-nodejs-client フォルダ直下にある samples フォルダにあるサンプル ファイル dmSample.js を Adobe Brackets ないし、他のテキスト エディタで開きます。
- dmSample.js ファイル内のから下記で示す変数代入箇所を見つけて、それぞれ右辺にある '' 内に適切な値を挿入してください。
- FORGE_CLIENT_ID の右辺にある '' 内に 4. で取得した Client ID 値と、FORGE_CLIENT_SECRET の右辺にある ' ' 内に同じく Client Secret 値を代入します。
- 必要に応じて BUCKET_KEY に一意な Bucket 名を指定します。既定では、'forge_sample_' + FORGE_CLIENT_ID.toLowerCase() になっているため、この状態でも一意な Bucket 名が生成されることになります。
- FILE_NAME にアップロードするデザイン ファイルのファイル名を拡張子付きで指定してください。(例:Chair.f3d)
- FILE_PATH にアップロードするデザイン ファイルのローカル コンピュータ上のパスをフルパスで指定してください。(例:C:/Users/iseza/Desktop/Chair.f3d)
var fs = require('fs');
var ForgeSDK = require('./../src/index');
// TODO - insert your CLIENT_ID and CLIENT_SECRET
var FORGE_CLIENT_ID = '',
FORGE_CLIENT_SECRET = '';
// TODO - Choose a bucket key - a unique name to assign to a bucket. It must be globally unique across all applications and
// regions, otherwise the call will fail. Possible values: -_.a-z0-9 (between 3-128 characters in
// length). Note that you cannot change a bucket key.
var BUCKET_KEY = 'forge_sample_' + FORGE_CLIENT_ID.toLowerCase();
// TODO - Choose a filename - a key for the uploaded object
var FILE_NAME = 'my-file.extension';
// TODO - specify the full filename and path
var FILE_PATH = '/path/to/your/file.extension';
var bucketsApi = new ForgeSDK.BucketsApi(), // Buckets Client
objectsApi = new ForgeSDK.ObjectsApi(); // Objects Client
// Initialize the 2-legged oauth2 client
var oAuth2TwoLegged = new ForgeSDK.AuthClientTwoLegged(FORGE_CLIENT_ID, FORGE_CLIENT_SECRET,
['data:write', 'data:read', 'bucket:read','bucket:update','bucket:create'], true);
:
- Node.js command prompt を使ってカレント ディレクトリを samples に変更後、node dmSample.js と入力して処理を実行します。
ここまでの内容が Forge Node.js Quickstart に記載されている処理です。前述のとおり、このサンプルは Forge SDK を利用しているので直接 Authentication API(OAuth API)や Data Management API の endpoint を明示的に呼び出すことはしていません。その代わり、 次の代入文で、それぞれの endpoint 呼び出しをラップする Forge SDK を参照して利用しています。
var bucketsApi = new ForgeSDK.BucketsApi(), // Buckets Client
objectsApi = new ForgeSDK.ObjectsApi(); // Objects Client
例えば、Bucket の作成には上記で代入した bucketsApi オブジェクトの Forge SDK 内に定義された createBucket endpoint を呼び出しています。 もちろん、この endpoint は Data Management API の https://developer.api.autodesk.com/oss/v2/buckets endpoint をラップしています。このような運用で Forge の RESTful API を Node.js で構築した Web サーバー側で実行出来る点に注意してください。クライアント コンピュータ上の Web ブラウザ内で実行される JavaScript コードからは、独自に作成した endpoint を介して Web サーバー側の処理を呼び出すよう工夫すれば、ある程度処理を隠蔽することが出来ます。
なお、実際に処理されるメイン ルーチンは dbSample.js の最後にある Promise Pattern と呼ばれる非同期処理になっています。
/**
* Create an access token and run the API calls.
*/
oAuth2TwoLegged.authenticate().then(function(credentials){
console.log("**** Got Credentials",credentials);
createBucketIfNotExist(BUCKET_KEY).then(
function(createBucketRes){
console.log("**** Create bucket if not exist response:", createBucketRes.body);
getBuckets().then(function(getBucketsRes){
console.log("**** Get all buckets response:");
var bucketsArray = getBucketsRes.body.items;
bucketsArray.map(function(currentBucket){
console.log(currentBucket.bucketKey);
})
},function(err){
console.error(err);
});
uploadFile(BUCKET_KEY, FILE_PATH, FILE_NAME).then(function(uploadRes){
console.log("**** Upload file response:", uploadRes.body);
deleteFile(BUCKET_KEY, FILE_NAME).then(function(deleteRes) {
console.log("**** Delete file response status code:", deleteRes.statusCode);
},defaultHandleError);
}, defaultHandleError);
}, defaultHandleError);
}, defaultHandleError);
ただ、Access Token を取得して Bucket を作成、指定したデザイン ファイルをアップロードした後にそのファイルを削除しているので、サンプルとしては若干不完全です。次回、アップロードしたデザインファイルを Model Derivative API で変換して、Forge Viewer に表示する部分を追記していきたいと思います。
補足:
- dmSample.js 内に定義した uploadFile() 関数は、本 Forge SDK の ObjectsApi に定義される uploadObject endpoint を利用してデザイン ファイルをアップロードしています。アップロードするファイル サイズが大きいと、ESOCKETTIMEDOUT エラー(タイムアウト)で処理が中断してしまう場合があります。そのような場合は、Forge SDK が内部で HTTP 通信に利用する request パッケージの既定のタイムアウト値を大きな値に変更してみてください。
Adobe Brackets などのテキスト エディタで forge-api-nodejs-client\src\ApiClient.js ファイルを開いて、下記の青字部分の this.timeout の値を既定値の 60000 ミリ秒(1 分)から 120000 ミリ秒(2 分)などに変更してみてください。
/**
* Forge SDK
* The Forge Platform contains an expanding collection of web service components that can be used with Autodesk cloud-based products or your own technologies. Take advantage of Autodesk’s expertise in design and engineering.
*
* OpenAPI spec version: 0.1.0
* Contact: [email protected]
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
module.exports = (function() {
'use strict';
var request = require('request');
/**
* @module ApiClient
* @version 0.3.0
*/
/**
* Manages low level client-server communications, parameter marshalling, etc. There should not be any need for an
* application to use this class directly - the *Api and model classes provide the public API for the service. The
* contents of this file should be regarded as internal but are documented for completeness.
* @alias module:ApiClient
* @class
*/
var exports = function() {
/**
* The base URL against which to resolve every API call's (relative) path.
* @type {String}
* @default https://developer.api.autodesk.com
*/
this.basePath = 'https://developer.api.autodesk.com'.replace(/\/+$/, '');
/**
* The default HTTP headers to be included for all API calls.
* @type {Array.<String>}
* @default {}
*/
this.defaultHeaders = {};
/**
* The default HTTP timeout for all API calls.
* @type {Number}
* @default 60000
*/
this.timeout = 60000;
this.basePath = 'https://developer.api.autodesk.com';
};
By Toshiaki Isezaki
コメント
コメントフィードを購読すればディスカッションを追いかけることができます。