Skip to main content

ArcGIS REST API を使用したスクリプトの作成

ArcGIS Enterprise は、ArcGIS REST API へのリクエストのみを通じて管理できます。 サーバーかポータルから管理タスクを実行する場合でも、API の呼び出しがバック エンドで行われます。 ArcGIS Enterprise を管理するスクリプトを記述するには、URL の構築、HTTP リクエストの送信、HTTP 応答の解析を行うことができるスクリプト言語を選択する必要があります。 このヘルプ システムの例では、Python が使用されています。

API を使用するために、スクリプトを実行するコンピューターに Esri ソフトウェアをインストールする必要はありません。 必要となるのは、ポータルに HTTP リクエストを送信できる環境だけです。

基本操作

ArcGIS REST API を使用するには、実行する操作の HTTP リクエストを作成し、その操作に必要なパラメーターを含めます。 ArcGIS REST API を操作できる一連のディレクトリーを参照することで、管理操作と必須パラメーターを把握できます。 ArcGIS Enterprise REST API は 2 つのポータルと 2 つのサーバー ディレクトリーを通じて公開されます。

ArcGIS REST API の使用

ポータルとサーバー ディレクトリーには、組織の ArcGIS REST API リソースの対話形式のビューが用意されています。 これらのディレクトリーを使用することで、組織の管理スクリプトの記述方法を理解できます。

ポータル ディレクトリーの URL の形式は次のとおりです。

サーバー ディレクトリーの URL の形式は次のとおりです。

ArcGIS REST API に関する知識を得るには、いずれかのディレクトリーを使用して管理タスクを実行します。 サーバーにリクエストを送信する際は、入力する必要があるパラメーターに注意し、ブラウザーのアドレス バーで URL を確認してください。 リクエストの全文や応答を確認するには、Fiddler や Firebug などの Web 開発者ツールが役に立ちます。 Python や別のスクリプト言語を使用してユーザー独自の管理 HTTP リクエストを構築するときは、この情報は価値があります。

トークンの生成とスクリプトでの使用

ポータル、サーバー、またはこれらの対応するディレクトリーを通じて組織を管理する場合は、適切な権限があるアカウントのユーザー名とパスワードを入力する必要があります。 スクリプトを記述する場合も同じ概念が適用されます。 ただし、スクリプトを使用して組織を管理する場合、どのように認証が発生するのかについて理解しておく必要があります。

組み込みアカウントとトークン認証を使用するように組織を構成すると、ポータルとサーバー ディレクトリーで使用するのと同じ管理アカウントと URL を用いてスクリプトを使用できます。 組織で組織固有のログインと Web 層認証を構成する場合、スクリプトで Web Adaptor をバイパスすることをおすすめします。 Portal for ArcGIS のインストール後に作成した初期管理者アカウントを使用してポータルにアクセスするか、ArcGIS Server のインストール後に作成したプライマリー サイト管理者アカウントを使用してサーバーにアクセスします。

いずれの場合もトークンが返されます。トークンは、特定のタイプのアクションの実行が許可されたポータルまたはサーバーと通信するための、特殊な文字列です。 送信する Web サービス リクエストにこのトークンを含める必要があります。

次の Python 関数はポータル トークンをリクエストします。 引数として、ポータルの URL、ユーザー名、およびパスワードを指定します。

def generateToken(username, password, portalUrl):
 '''Retrieves a token to be used with API requests.'''
 data = urllib.parse.urlencode({'username' : username,
                                'password' : password,
                                'client' : 'referer',
                                'referer': portalUrl,
                                'expiration': 60,
                                'f' : 'json'}).encode('utf-8')
 response = urllib.request.urlopen(portalUrl + '/sharing/rest/generateToken',
                                   data).read().decode('utf-8')
 try:
     jsonResponse = json.loads(response)
     if 'token' in jsonResponse:
         return jsonResponse['token']
     elif 'error' in jsonResponse:
         print(jsonResponse['error']['message'])
         for detail in jsonResponse['error']['details']:
             print(detail)
 except ValueError as e:
     print('An unspecified error occurred.')
     print(e)

次の Python 関数はサーバー トークンをリクエストします。 引数として、サーバーの URL、ユーザー名、およびパスワードを指定します。

def generateToken(username, password, serverUrl):
 '''Retrieves a token to be used with API requests.'''
 data = urllib.parse.urlencode({'username' : username,
                                'password' : password,
                                'client' : 'referer',
                                'referer': serverUrl,
                                'expiration': 60,
                                'f' : 'json'}).encode('utf-8')
 response = urllib.request.urlopen(serverUrl + '/tokens/generateToken',
                                   data).read().decode('utf-8')
 try:
     jsonResponse = json.loads(response)
     if 'token' in jsonResponse:
         return jsonResponse['token']
     elif 'error' in jsonResponse:
         print(jsonResponse['error']['message'])
         print(jsonResponse['error']['details'])
 except ValueError as e:
     print('An unspecified error occurred.')
     print(e)

トークンは無期限に有効ではなく、タイム アウトするように設計されています。したがって、悪意のあるユーザーにより盗まれて無期限に使用されることはありません。 通常は、スクリプトを実行するたびに (リクエストを送信するたびにではなく)、新しいトークンをリクエストする必要があります。 例外的に、スクリプトの実行が終了する前に、トークンの有効期限が切れる場合があります。 有効期限が切れたトークンがリクエストに含まれている場合、サーバーからの応答には、トークンの有効期限が切れていることを示すエラーが含まれます。 これが発生した場合、トークンを更新してから、引き続きスクリプトを実行してください。

リクエストと応答の操作

Web サービス リクエストを送信するには、実行するアクションの URL とそのアクションに必要なパラメーターを作成する必要があります。 必要なパラメーターの 1 つは、上記のように生成されたトークンです。

すべての管理アクションでは Web サービス応答が生成されます。通常、これは JavaScript Object Notation (JSON) 形式でリクエストされます。 Python などのスクリプト言語には、JSON 応答を解析または読み取ることができるライブラリーがあります。 リクエストが正常に処理されたかどうかを確認するために、単に HTTP ステータス コードを取得したい場合があります (たとえば、コード 200 は OK を意味します)。 また、応答には、さらに解析と検証を行う必要があると思わせるログ メッセージなどのデータが含まれる場合もあります。